SwiftMailerが「内部サーバーエラー」を投げるのはなぜですか?
-
27-09-2019 - |
質問
Symfony + SwiftMailerを使用しており、SwiftMailerから次のエラーを取得しています。
500 | Internal Server Error | Swift_TransportException
Expected response code 220 but got code "", with message ""
そして、その理由を理解することはできません。私は地元のマシンでhmailserverを使用しており、次のように(Symfonyを使用しているように)私のFactories.ymlファイルをセットアップしています。
mailer:
class: sfMailer
param:
logging: %SF_LOGGING_ENABLED%
charset: %SF_CHARSET%
delivery_strategy: realtime
transport:
class: Swift_SmtpTransport
param:
host: splodge.loc
port: 25
encryption: ~
username: ~
password: ~
次のコードを使用して送信します。
$message = $this->getMailer()->compose(
'noreply@splodge.loc',
'info@splodge.loc',
'Reset Password',
'Message'
);
$result = $this->getMailer()->send($message);
誰かが以前にこのような問題を抱えていましたか?
私は時々、そして非常にランダムに、送信が通過することを発見しましたが、それ以外の時間は上記のエラーメッセージを受け取ります。だから、メールを送信するページを絶えず更新し、予測不可能に失敗し、コードが時々機能するので、何が間違っているのかを理解するのはちょっと難しいです。
どんな助けも高く評価されます!
さらなる調査により、SMTPサーバーは[220 LocalHost ESMTP]を送信することが示されていますが、hmailserverログを見た後、次のことを発見しました。
"TCPIP" 5232 "2010-06-16 11:40:54.043" "TCPConnection - Posting AcceptEx on 0.0.0.0:25"
"DEBUG" 5232 "2010-06-16 11:40:54.043" "Creating session 51"
"SMTPD" 5232 51 "2010-06-16 11:40:54.043" "127.0.0.1" "SENT: 220 localhost ESMTP"
"DEBUG" 5296 "2010-06-16 11:40:54.199" "The read operation failed. Bytes transferred: 0 Remote IP: 127.0.0.1, Session: 51, Code: 10054, Message: An existing connection was forcibly closed by the remote host"
"DEBUG" 5296 "2010-06-16 11:40:54.199" "Ending session 51"
SwiftMailerがHelo/Ehloingがあまりにも早すぎるということであり、これが単なる時間の問題である可能性がありますか? Heloの伝送を少し遅らせることはできますか?
良いログ、物が実際に送信するとき、次のように見えます:
"TCPIP" 5232 "2010-06-16 11:42:21.278" "TCPConnection - Posting AcceptEx on 0.0.0.0:25"
"DEBUG" 5232 "2010-06-16 11:42:21.294" "Creating session 54"
"SMTPD" 5232 54 "2010-06-16 11:42:21.294" "127.0.0.1" "SENT: 220 localhost ESMTP"
"SMTPD" 5224 54 "2010-06-16 11:42:21.294" "127.0.0.1" "RECEIVED: EHLO splodge.loc"
したがって、それはHELO/EHLOの謝辞に関係する必要があります。お知らせ下さい! :)
解決 2
メールの送信を取得するループを作成することで、これを機能させることができました...
$sendResult = false;
do
{
try
{
$message = Swift_Message::newInstance()
->setFrom('noreply@splodge.loc', 'Mr.Postman')
->setTo($to)
->setSubject('Password reminder...')
->setBody($this->getPartial('resetPasswordEmail', array(
'newPassword' => $newPassword)), 'text/html');
$sendResult = $this->getMailer()->send($message);
}
catch(Exception $e){/*Do nothing*/}
}
while($sendResult !== 1);
次に、再試行の数を制限するためにいくつかの構成設定を追加します。
他のヒント
SMTPの問題のように聞こえます。
コマンドラインから以下を試してみるとどうなりますか:
telnet splodge.loc 25
接続できますか?返信線は220で始まりますか?
そうでない場合は、SMTPサーバー(またはおそらくファイアウォール)構成に問題があります。
これに追加したかっただけです。私にとって問題は、SMTPサーバーの再起動時に、DoveCotが戻ってこなかったことでした。 dovecotを始めるとすぐに、すべてが順調でした。したがって、最終的にはSMTPの問題であったため、他の誰かがこの問題を抱えている場合は、SMTPの問題であることを確認できます。