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 = '[email protected]'; // a valid email here
$mail->Password = '***'; // the password from email
$mail->From = '[email protected]';
$mail->SMTPDebug = true;
$mail->AddReplyTo('[email protected]', 'Test');
$mail->FromName = 'Test SMTP';
$mail->AddAddress('[email protected]', '[email protected]');
$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' => '[email protected]',
'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' => '[email protected]',
'password' => '***'));
$mail->send('[email protected]', $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: [email protected]
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を使用するように要求することで、TLSは正しい軌道に乗るでしょう。
また、PHPMailerの最新バージョンを使用していることを確認してください。
これは私にも起こりました。私にとって、PostfixはPHPスクリプトと同じサーバーにあり、localhostの代わりにSMTP認証とsmtp.domain.comを使用するとエラーが発生しました。
したがって、これらの行をコメントアウトしたとき:
$ mail-> SMTPAuth = true;$ mail-> SMTPSecure = "tls";
ホストを
$mail->Host = "localhost";
代わりに
$ mail-> Host = 'smtp.mydomainiuse.com'
そしてそれは働いた:)
一部のシステムユーザー(root、MTA、mailman ...)のみに送信SMTPを制限するように設定しているかどうかを確認します。その制限はスパマーを防ぐことができますが、送信SMTP接続をローカルメールサーバーにリダイレクトします。
openSSL拡張機能が有効になっていて、ディレクトリ言語が「br」であることを確認しますか?最初にデータをチェックします。
Exim 4では、クライアントがEHLOを発行した後にのみAUTHコマンドを送信する必要があります。EHLOなしで認証しようとすると拒否されます。一部のメールサーバーでは、EHLOを2回発行する必要があります。 PHPMailerは明らかにそうしていません。 PHPMailerでEHLOの開始を強制できない場合は、実際に SwiftMailer 4 に切り替える必要があります。