2016-01-18 5 views
0

J'ai un site hébergé avec rackspace et mis à jour ma technologie de site de php5.4 à php5.6. Maintenant, je ne peux plus envoyer d'emails depuis le site. Le pire, c'est que je ne reçois même pas d'erreurs et les journaux ne montrent rien. J'utilise phpmailer 5.2.14.phpmailer et php5.6 ne fonctionne pas avec Office365

Voici mon script mail

require 'phpmailer/PHPMailerAutoload.php'; 
if (isset($_POST['contactForm'])) { 
     $email = $_POST['email']; 
     $subject = $_POST['subject']; 
     $message = $_POST['message']; 
     $body = ' 
     <html> 
      <body> 
       <div style="float:left; width:100%; margin:0 0 25px 0; padding:20px; background:#222; text-align:center;"> 
        <div style="display:inline-block; vertical-align:top;"> 
         <a href="http://website.com"><img src="img/logoEmail.png" alt="waesf"></a> 
        </div> 
       </div> 
       <main style="float:left; width:100%; padding:20px;"> 
        <p style="font-family:Arial; font-size:18px;">'.$message.'</p> 
       </main> 
      </body> 
     </html>'; 
     $mail = new PHPMailer; 

     $mail->SMTPDebug = 3;               // Enable verbose debug output 

     $mail->SMTPOptions = array(
      'ssl' => array(
       'verify_peer' => false, 
       'verify_peer_name' => false, 
       'allow_self_signed' => true 
      ) 
     ); 
     $mail->isSMTP();                // Set mailer to use SMTP 
     $mail->Host = 'smtp.office365.com';            // Specify main and backup SMTP servers 
     $mail->SMTPAuth = true;               // Enable SMTP authentication 
     $mail->Username = '[email protected]';         // SMTP username 
     $mail->Password = 'secret';            // SMTP password 
     $mail->SMTPSecure = 'tls';              // Enable TLS encryption, `ssl` also accepted 
     $mail->Port = 587;                // TCP port to connect to 

     $mail->SetFrom('[email protected]', 'Ballpoint Machinist'); 
     $mail->AddAddress('[email protected]', "BPM");       // Add a recipient 
     $mail->addReplyTo('[email protected]', 'Information'); 
     // $mail->addCC('[email protected]'); 
     // $mail->addBCC('[email protected]'); 

     // $mail->addAttachment('/var/tmp/file.tar.gz');        // Add attachments 
     // $mail->addAttachment('/tmp/image.jpg', 'new.jpg');       // Optional name 
     $mail->isHTML(true);               // Set email format to HTML 

     $mail->Subject = $subject; 
     $mail->Body = $body; 
     $mail->AltBody = $body; 

     if (!$mail->send()) { 
      echo 'Message could not be sent.'; 
      echo 'Mailer Error: ' . $mail->ErrorInfo; 
     } else { 
      echo 'Message has been sent'; 
     } 
    } 

Lorsque le script exécute le site se bloque alors pendant un certain temps donne alors un dit serveur a expiré et rien d'autre. Aucune erreur php ne code rien et quand je vérifie les logs il n'y a pas d'erreurs liées à mon code mail. Cependant, cela ne se produit qu'avec Office 365 lorsque je modifie les paramètres SMTP à Gmail puis j'ai au moins obtenir des erreurs PHP sur la page.

J'ai déjà lu un tas de discussions sur le sujet mais je ne comprends pas. J'ai également passé par https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting et ajouté le SMTPOptions pour exclure ssl mais cela n'a pas aidé.

Je suis perplexe que je ne reçois aucune erreur. J'ai SMTPDebug = 3 et error_reporting (E_ALL).

modifier avec la suggestion de Willy Pt. Ne fonctionne toujours pas lorsque le script exécute le délai d'expiration du serveur.

if (isset($_POST['contactForm'])) { 
     $email = $_POST['email']; 
     $subject = $_POST['subject']; 
     $message = $_POST['message']; 
     $body = ' 
     <html> 
      <body> 
       <div style="float:left; width:100%; margin:0 0 25px 0; padding:20px; background:#222; text-align:center;"> 
        <div style="display:inline-block; vertical-align:top;"> 
         <a href="http://website.com"><img src="img/logoEmail.png" alt="Ballpoint Machinist"></a> 
        </div> 
       </div> 
       <main style="float:left; width:100%; padding:20px;"> 
        <p style="font-family:Arial; font-size:18px;">'.$message.'</p> 
       </main> 
      </body> 
     </html>'; 
     $mail = new PHPMailer(true); 

     // $mail->SMTPDebug = 4;               // Enable verbose debug output 

     try { 

     $mail->SMTPOptions = array(
      'ssl' => array(
       'verify_peer' => false, 
       'verify_peer_name' => false, 
       'allow_self_signed' => true 
      ) 
     ); 
     $mail->isSMTP();                // Set mailer to use SMTP 
     $mail->Host = 'smtp.office365.com';            // Specify main and backup SMTP servers 
     $mail->SMTPAuth = true;               // Enable SMTP authentication 
     $mail->Username = '[email protected]';         // SMTP username 
     $mail->Password = 'test';            // SMTP password 
     $mail->SMTPSecure = 'tls';              // Enable TLS encryption, `ssl` also accepted 
     $mail->Port = 587;                // TCP port to connect to 

     $mail->SetFrom('[email protected]', 'Ballpoint Machinist'); 
     $mail->AddAddress('[email protected]', "BPM");       // Add a recipient 
     $mail->addReplyTo('[email protected]', 'Information'); 
     // $mail->addCC('[email protected]'); 
     // $mail->addBCC('[email protected]'); 

     // $mail->addAttachment('/var/tmp/file.tar.gz');        // Add attachments 
     // $mail->addAttachment('/tmp/image.jpg', 'new.jpg');       // Optional name 
     $mail->isHTML(true);               // Set email format to HTML 

     $mail->Subject = $subject; 
     $mail->Body = $body; 
     $mail->AltBody = $body; 
     $mail->send(); 
     echo "Message Sent OK\n"; 
     /*if (!$mail->send()) { 
      echo 'Message could not be sent.'; 
      echo 'Mailer Error: ' . $mail->ErrorInfo; 
     } else { 
      echo 'Message has been sent'; 
     }*/ 


     } catch (phpmailerException $e) { 
      echo $e->errorMessage(); //Pretty error messages from PHPMailer 
     } catch (Exception $e) { 
      echo $e->getMessage(); //Boring error messages from anything else! 
     } 
    } 
} 

Quelqu'un peut-il aider?

+0

essayer de poster le stacktrace fourni par le PHPMailer en utilisant la même méthode que celle décrite dans cette réponse http://stackoverflow.com/questions/2386544/error-handling-with-phpmailer Il est préférable stacktrace de lecture plutôt que de voir le ErrorInfo seulement –

+0

SMTPDebug = 4 est nécessaire pour afficher les informations de connexion de bas niveau. PHP était la seule chose que vous avez mise à jour? Si la connexion arrive à expiration, PHPMailer ne peut rien dire car il n'y a pas d'autres informations. Les délais d'attente sont généralement des problèmes de réseau - DNS et pare-feu. Essayez le telnet et d'autres contrôles dans le guide. – Synchro

+0

@WillyPt J'ai ajouté un edit avec mon code en utilisant la suggestion que vous avez posté et toujours le même problème. Lorsque le script s'exécute, le site se bloque pendant un certain temps puis expire. – badsyntax

Répondre

0

Je ne sais pas si cela compte comme une réponse, mais j'ai été en mesure de travailler avec Gmail. exactement le même code suffit d'utiliser les informations d'identification gmail et l'hôte smtp au lieu de office365. J'ai dû configurer gmail pour permettre des applications moins sécurisées.

0

Le problème est avec PHP5.6 et la vérification du certificat auto-signé. Avec PHP5.6, la vérification de certificat est activée par défaut et le certificat ne peut pas être auto-signé.

La solution correcte pour cela est de remplacer le certificat incorrect, mal configuré ou auto-signé par un bon.

Ou, le configurer pour utiliser un certificat non auto signé:

$mail->SMTPOptions = array(
'ssl' => array(
    'verify_peer' => false, 
    'verify_peer_name' => false, 
    'allow_self_signed' => true 
    ) 
); 

Vous pouvez également modifier ces paramètres globalement dans votre php.ini, mais c'est vraiment une mauvaise idée; PHP 5.6 a fait ce changement pour de très bonnes raisons.

Parfois, ce comportement n'est pas tout à fait apparent; Parfois, des échecs de chiffrement peuvent apparaître en tant que client émettant un QUIT immédiatement après avoir essayé de faire un STARTTLS. Si cela se produit, vérifiez l'état de vos certificats ou paramètres de vérification.

+0

Oups, je vois maintenant que vous aviez ce code là-bas. Cela permettrait de résoudre le problème pour la plupart des gens qui ont le problème. –