2016-12-11 6 views
0

Ich habe den folgenden Code geschrieben, um E-Mails mit PHPMailer zu senden. Aber was ich versuche zu arbeiten ist der erste Versuch ein Senden über SMTP TLS und wenn das fehlschlägt dann sende die Mail ohne SMTP. Aber der Code scheint zu scheitern, weil er die PHPMailer-Funktion nicht zweimal ausführen möchte. Wenn ich die Funktion einmal benutze, um sie entweder über SMTP zu versenden oder nicht, funktionieren beide. Aber es funktioniert nicht, wenn SMTP fehlschlägt.PHPMailer-Funktion zum Senden ohne SMTP, wenn SMTP fehlschlägt

function processEmail($to, $message, $skip_smtp){ 


    date_default_timezone_set('Europe/London'); 
    require 'PHPMailer/PHPMailerAutoload.php'; 
    $mail = new PHPMailer; 

    if (!isset($skip_smtp) || empty($skip_smtp)){ 
     $mail->isSMTP(); 
    } 


    $mail->SMTPDebug = 0; 
    $mail->Debugoutput = 'html'; 

    $mail->Host = 'smtp.domain.com'; 
    $mail->Port = 587; 
    $mail->SMTPSecure = 'tls'; 
    $mail->SMTPAuth = true; 
    $mail->Username = "my_smtp_username"; 
    $mail->Password = "my_smtp_password"; 


    $mail->setFrom('[email protected]', 'From Name'); 
    $mail->addAddress($to, $to); 
    $mail->msgHTML($message); 


    if (!$mail->send()) { 
     return false; 
    } else { 
     return 1; 
    } 

} 


$smtp_result = processEmail($to, $message); 

if ($smtp_result>=1){ 
    echo "Sent using secure TLS SMTP"; 
} else { 
    processEmail($to, $message, 1); 
    echo "SMTP Failed - Attempted to send without SMTP "; 
} 
+0

Versuchen Sie, Mail über private SMTP-Relay-Server weiterzuleiten? – Kitson88

Antwort

0

an Ihrem vorhandenen Code der Suche, habe ich gesammelt, dass Ihre Weiterleitung von Mail über einen anderen SMTP-Server so unsicher, warum Ihre Prüfung, ob TLS zur Verfügung steht. Schlägt Ihr Relay-Server manchmal auf TLS fehl? Die folgende Lösung wäre am besten geeignet, wenn OOP verwendet wird, da diese Funktion etwas übermäßig ist. Ich habe stark kommentiert, also sollte meine Logik ziemlich geradlinig sein. Einige der Schlüsselpunkte sind, dass die Funktion Rekursiv ist, was bedeutet, dass sie sich selbst nennt, wenn TLS den Code nicht innerhalb einer Funktion laufen lässt. Zweitens, die Wiederverwendung von PHP Mailer mit der gleichen Ausführung wird Probleme haben, so habe ich unset() die erste $mail Objekt beim zweiten Aufruf sowie Einstellung der Include auf require_once. Wie bereits erwähnt, müssen Sie sich bei Ihrem SMTP-Provider über den verwendeten TLS-Port und den SMTP-Port (sofern vorhanden) informieren, um sicherzustellen, dass er funktioniert. Ich habe es mit meinem Provider getestet und das funktioniert ohne Probleme.

function sendEmail($to, $message, $skip_smtp=1) { 

date_default_timezone_set('Europe/London'); 
require_once 'PHPMailer/PHPMailerAutoload.php'; 


//You will need to check your provider for these settings 
if ($skip_smtp === 0) { 

    $port = 25; //Usual port for non TLS/SSL 

} else { 

    $port = 465; //Port for relay server - likely to be 25, 465 or 587 
    $mail->SMTPSecure = 'tls'; //Send via TLS Encryption - SSL or TLS (Dependent on Relay Server) 
} 

$mail = new PHPMailer(); 
$mail->SMTPDebug = 3; //Enabled this so you can see what's happening - Dont forget to set to 0 in production 
$mail->Debugoutput = 'html'; 

//SMTP Relay Server Settings 
$mail->isSMTP(); //Send as SMTP - Should always be set unless you would like to use another method like sendmail() 
$mail->Host = 'smtp.relay.com'; 
$mail->Port = $port; 
$mail->Timeout = 5; //Set your Timeout in Seconds - Default is 5mins which is abit excessive when testing 
$mail->SMTPAuth = true; //Relay Server Auth Details 
$mail->Username = "SMTP RELAY USERNAME"; 
$mail->Password = "SMTP RELAY PASSWORD"; 

//Email Details 
$mail->setFrom('[email protected]'); 
$mail->addAddress($to); 
$mail->Subject = 'My Subject'; 

//Email Content 
$mail->isHTML(true); //Set HTML 
$mail->Body = $message; //HTML Body 
$mail->AltBody = $message; //Failover for Non-HTML 


switch ($mail->send()) { 

    case false: 

     if ($skip_smtp === 0) { 

      echo 'Message could not be sent.'; 
      echo 'Mailer Error: ' . $mail->ErrorInfo; 

     } else { 

      echo 'Error Sending TLS...trying Non TLS'; 
      unset($mail); //Unset Object 
      sendEmail($to, $message, $skip_smtp=0); //Recursive function -> passing 0 to skip TLS 

     } 

     break; 

    case true : 

     echo 'Message has been sent'; 

     break; 

    default : 

     echo 'Error'; 

    } 
} 

//Your Function   
sendEmail('[email protected]', 'Test Body'); 

?>