Проблема с аутентификацией SMTP в PHP с помощью PHPMailer, с Pear Mail работает

У меня возникли проблемы с отправкой электронной почты с классом PHPMailer, но она работает с PEAR Mail :: factory.

Я думаю, проблема связана с аутентификацией SMTP, но я не мог найти проблему.

Код с проблемой:

<?php require("class.phpmailer.php"); $mail = new PHPMailer(); $mail->IsSMTP(); // set mailer to use SMTP $mail->Host = 'mail.xxx.com.br'; // my host here $mail->SMTPAuth = true; // turn on SMTP authentication $mail->Username = 'xxx@xxx.com.br'; // a valid email here $mail->Password = '***'; // the password from email $mail->From = 'from@xxx.com.br'; $mail->SMTPDebug = true; $mail->AddReplyTo('from@xxx.com.br', 'Test'); $mail->FromName = 'Test SMTP'; $mail->AddAddress('teste@xxx.com.br', 'teste@xxx.com.br'); $mail->Subject = 'Test SMTP'; $mail->IsHTML(true); $mail->Body = '<b>Teste</b><br><h1>teste 2</h1>'; //$mail->Send(); if(!$mail->Send()) { echo "Message could not be sent. <p>"; echo "Mailer Error: " . $mail->ErrorInfo; exit; } ?> 

Код с PEAR, который работает:

 <?php include('Mail.php'); include('Mail/mime.php'); $text = 'Versao em texto'; $html = '<html><body>Versao de email em <b>HTML</b></body></html>'; $crlf = "\n"; $hdrs = array( 'From' => 'from@xxx.com.br', 'Subject' => 'Test - mail.php' ); $mime = new Mail_mime($crlf); $mime->setTXTBody($text); $mime->setHTMLBody($html); $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail = Mail::factory('smtp', array ('host' => 'mail.xxx.com.br', 'debug'=> true, 'auth' => true, 'username' => 'xxx@xxx.com.br', 'password' => '***')); $mail->send('teste@xxx.com.br', $hdrs, $body); ?> в <?php include('Mail.php'); include('Mail/mime.php'); $text = 'Versao em texto'; $html = '<html><body>Versao de email em <b>HTML</b></body></html>'; $crlf = "\n"; $hdrs = array( 'From' => 'from@xxx.com.br', 'Subject' => 'Test - mail.php' ); $mime = new Mail_mime($crlf); $mime->setTXTBody($text); $mime->setHTMLBody($html); $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail = Mail::factory('smtp', array ('host' => 'mail.xxx.com.br', 'debug'=> true, 'auth' => true, 'username' => 'xxx@xxx.com.br', 'password' => '***')); $mail->send('teste@xxx.com.br', $hdrs, $body); ?> в <?php include('Mail.php'); include('Mail/mime.php'); $text = 'Versao em texto'; $html = '<html><body>Versao de email em <b>HTML</b></body></html>'; $crlf = "\n"; $hdrs = array( 'From' => 'from@xxx.com.br', 'Subject' => 'Test - mail.php' ); $mime = new Mail_mime($crlf); $mime->setTXTBody($text); $mime->setHTMLBody($html); $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail = Mail::factory('smtp', array ('host' => 'mail.xxx.com.br', 'debug'=> true, 'auth' => true, 'username' => 'xxx@xxx.com.br', 'password' => '***')); $mail->send('teste@xxx.com.br', $hdrs, $body); ?> 

Когда я запускаю код с проблемой с активированной отладкой (SMTPDebug = True), я получил:

 SMTP -> FROM SERVER: SMTP -> get_lines(): $data was "" SMTP -> get_lines(): $str is "220-orion.bommtempo.net.br ESMTP Exim 4.69 #1 Wed, 05 Aug 2009 10:00:48 -0300 " SMTP -> get_lines(): $data is "220-orion.bommtempo.net.br ESMTP Exim 4.69 #1 Wed, 05 Aug 2009 10:00:48 -0300 " SMTP -> get_lines(): $data was "220-orion.bommtempo.net.br ESMTP Exim 4.69 #1 Wed, 05 Aug 2009 10:00:48 -0300 " SMTP -> get_lines(): $str is "220-We do not authorize the use of this system to transport unsolicited, " SMTP -> get_lines(): $data is "220-orion.bommtempo.net.br ESMTP Exim 4.69 #1 Wed, 05 Aug 2009 10:00:48 -0300 220-We do not authorize the use of this system to transport unsolicited, " SMTP -> get_lines(): $data was "220-orion.bommtempo.net.br ESMTP Exim 4.69 #1 Wed, 05 Aug 2009 10:00:48 -0300 220-We do not authorize the use of this system to transport unsolicited, " SMTP -> get_lines(): $str is "220 and/or bulk e-mail. " SMTP -> get_lines(): $data is "220-orion.bommtempo.net.br ESMTP Exim 4.69 #1 Wed, 05 Aug 2009 10:00:48 -0300 220-We do not authorize the use of this system to transport unsolicited, 220 and/or bulk e-mail. " SMTP -> FROM SERVER: 220-orion.bommtempo.net.br ESMTP Exim 4.69 #1 Wed, 05 Aug 2009 10:00:48 -0300 220-We do not authorize the use of this system to transport unsolicited, 220 and/or bulk e-mail. SMTP -> ERROR: EHLO not accepted from server: 220-orion.bommtempo.net.br ESMTP Exim 4.69 #1 Wed, 05 Aug 2009 10:00:48 -0300 220-We do not authorize the use of this system to transport unsolicited, 220 and/or bulk e-mail. SMTP -> get_lines(): $data was "" SMTP -> get_lines(): $str is "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] " SMTP -> get_lines(): $data is "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] " SMTP -> get_lines(): $data was "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] " SMTP -> get_lines(): $str is "250-SIZE 20971520 " SMTP -> get_lines(): $data is "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] 250-SIZE 20971520 " SMTP -> get_lines(): $data was "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] 250-SIZE 20971520 " SMTP -> get_lines(): $str is "250-PIPELINING " SMTP -> get_lines(): $data is "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] 250-SIZE 20971520 250-PIPELINING " SMTP -> get_lines(): $data was "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] 250-SIZE 20971520 250-PIPELINING " SMTP -> get_lines(): $str is "250-AUTH PLAIN LOGIN " SMTP -> get_lines(): $data is "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] 250-SIZE 20971520 250-PIPELINING 250-AUTH PLAIN LOGIN " SMTP -> get_lines(): $data was "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] 250-SIZE 20971520 250-PIPELINING 250-AUTH PLAIN LOGIN " SMTP -> get_lines(): $str is "250-STARTTLS " SMTP -> get_lines(): $data is "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] 250-SIZE 20971520 250-PIPELINING 250-AUTH PLAIN LOGIN 250-STARTTLS " SMTP -> get_lines(): $data was "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] 250-SIZE 20971520 250-PIPELINING 250-AUTH PLAIN LOGIN 250-STARTTLS " SMTP -> get_lines(): $str is "250 HELP " SMTP -> get_lines(): $data is "250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] 250-SIZE 20971520 250-PIPELINING 250-AUTH PLAIN LOGIN 250-STARTTLS 250 HELP " SMTP -> FROM SERVER: 250-orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] 250-SIZE 20971520 250-PIPELINING 250-AUTH PLAIN LOGIN 250-STARTTLS 250 HELP SMTP -> get_lines(): $data was "" SMTP -> get_lines(): $str is "250 orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] " SMTP -> get_lines(): $data is "250 orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] " SMTP -> ERROR: AUTH not accepted from server: 250 orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] SMTP -> get_lines(): $data was "" SMTP -> get_lines(): $str is "503 AUTH command used when not advertised " SMTP -> get_lines(): $data is "503 AUTH command used when not advertised " SMTP -> FROM SERVER: 503 AUTH command used when not advertised SMTP -> ERROR: RSET failed: 503 AUTH command used when not advertised Message could not be sent. <p>Mailer Error: SMTP Error: Could not connect to SMTP host. 

И результатом отладки почтового кода PEAR является:

 DEBUG: Recv: 220-orion.bommtempo.net.br ESMTP Exim 4.69 #1 Tue, 04 Aug 2009 19:37:10 -0300 DEBUG: Recv: 220-We do not authorize the use of this system to transport unsolicited, DEBUG: Recv: 220 and/or bulk e-mail. DEBUG: Send: EHLO localhost DEBUG: Recv: 250-orion.bommtempo.net.br Hello localhost [200.155.129.6] DEBUG: Recv: 250-SIZE 20971520 DEBUG: Recv: 250-PIPELINING DEBUG: Recv: 250-AUTH PLAIN LOGIN DEBUG: Recv: 250-STARTTLS DEBUG: Recv: 250 HELP DEBUG: Send: STARTTLS DEBUG: Recv: 220 TLS go ahead DEBUG: Send: EHLO localhost DEBUG: Recv: 250-orion.bommtempo.net.br Hello localhost [200.155.129.6] DEBUG: Recv: 250-SIZE 20971520 DEBUG: Recv: 250-PIPELINING DEBUG: Recv: 250-AUTH PLAIN LOGIN DEBUG: Recv: 250 HELP DEBUG: Send: AUTH LOGIN DEBUG: Recv: 334 VXNlcm5hbWU6 DEBUG: Send: c2lzdGVtYWFkbWluQGJvbW10ZW1wby5jb20uYnI= DEBUG: Recv: 334 UGFzc3dvcmQ6 DEBUG: Send: RVkyYVM4YnpMNU5k DEBUG: Recv: 235 Authentication succeeded DEBUG: Send: MAIL FROM: DEBUG: Recv: 250 OK DEBUG: Send: RCPT TO: DEBUG: Recv: 250 Accepted DEBUG: Send: DATA DEBUG: Recv: 354 Enter message, ending with "." on a line by itself DEBUG: Send: MIME-Version: 1.0 From: sistemaadmin@bommtempo.com.br Subject: Teste de mail - mail.php Content-Type: multipart/alternative; boundary="=_b3c5407ccf494306d78fbb35800efe65" --=_b3c5407ccf494306d78fbb35800efe65 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="ISO-8859-1" Versao em texto --=_b3c5407ccf494306d78fbb35800efe65 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset="ISO-8859-1" Versao de email em HTML--=_b3c5407ccf494306d78fbb35800efe65-- . DEBUG: Recv: 250 OK id=1MYSd4-0005Ky-Jw DEBUG: Send: QUIT 

странная проблема, которую я решил, комментируя эту строку

 //$mail->IsSmtp(); 

с последней версией phpmailer (5.2)

Попробуйте добавить это:

 $mail->SMTPAuth = true; $mail->SMTPSecure = "tls"; 

Просмотрев журналы отладки, вы можете заметить, что в журнале ошибок PhpMailer показано следующее:

 (..snip..) SMTP -> ERROR: AUTH not accepted from server: 250 orion.bommtempo.net.br Hello admin-teste.bommtempo.com.br [200.155.129.6] (..snip..) 503 AUTH command used when not advertised (..snip..) 

Пока ваш успешный журнал PEAR показывает это:

 DEBUG: Send: STARTTLS DEBUG: Recv: 220 TLS go ahead 

Я предполагаю, что явное требование PHPMailer использовать TLS поместит его на правильный путь.
Кроме того, убедитесь, что вы используете последнюю версию PHPMailer.

Это случилось и со мной. Для меня Postfix был расположен на том же сервере, что и PHP-скрипт, и произошла ошибка, когда я использовал аутентификацию SMTP и smtp.domain.com вместо localhost.

Поэтому, когда я прокомментировал эти строки:

$ mail-> SMTPAuth = true;
$ mail-> SMTPSecure = "tls";

и установите

 $mail->Host = "localhost"; 

вместо

$ mail-> Host = 'smtp.mydomainiuse.com'

и это сработало 🙂

что расширение OpenSSL включено и языки каталога с «br»? сначала проверяет данные.

Exim 4 требует, чтобы команда AUTH отправлялась только после того, как клиент выдал EHLO – попытки аутентификации без EHLO будут отклонены. Некоторые почтовые серверы требуют, чтобы EHLO выдавался дважды. По-видимому, PHPMailer этого не делает. Если PHPMailer не позволяет вам инициировать инициирование EHLO, вам действительно нужно переключиться на SwiftMailer 4 .

Убедитесь, что вы установили ограничение исходящего SMTP только некоторым пользователям системы (root, MTA, mailman …). Это ограничение может помешать спамерам, но перенаправляет исходящие SMTP-соединения на локальный почтовый сервер.