我正在使用Symfony + SwiftMailer并从SwiftMailer获取以下错误:
500 | Internal Server Error | Swift_TransportException
Expected response code 220 but got code "", with message ""
并无法弄清楚原因。我在我的本地机器上使用hMailServer,并设置了我的factories.yml文件(因为我正在使用Symfony),如下所示:
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 / EHLO,这只是一个时间问题吗?我可以稍微延迟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确认有关。请指教! :)
答案 0 :(得分:2)
听起来像是SMTP问题。
如果从命令行尝试以下操作会发生什么:
telnet splodge.loc 25
你能联系吗?回复行是否以220开头?
如果没有,那么您的SMTP服务器(或防火墙)配置就会出现问题。
答案 1 :(得分:0)
通过创建重试邮件发送的循环来管理以实现此工作......
$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);
接下来,我将添加一些配置设置以限制重试次数。
答案 2 :(得分:0)
我只是想加入这个。对我来说问题是当我的smtp服务器重启时,dovecot没有回来。一旦我开始使用dovecot,一切都很好。所以最后这是一个smtp问题,所以如果其他人有这个问题,你几乎可以肯定这是一个smtp问题。