Почему SwiftMailer выдает «Внутренняя ошибка сервера»? - PullRequest
1 голос
/ 16 июня 2010

Я использую 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 / 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. Пожалуйста, порекомендуйте! :)

Ответы [ 3 ]

2 голосов
/ 16 июня 2010

Похоже на проблему SMTP.

Что произойдет, если вы попробуете следующее из командной строки:

telnet splodge.loc 25

Вы можете подключиться? Строка ответа начинается с 220?

Если нет, то у вас проблема с конфигурацией вашего SMTP-сервера (или, возможно, брандмауэра).

0 голосов
/ 11 июня 2011

Я просто хотел добавить к этому. для меня проблема была, когда мой smtp сервер перезагружался, dovecot не возвращался. как только я начал заниматься dovecot, все было хорошо. так что, в конце концов, это была проблема с SMTP, так что если у кого-то еще есть такая проблема, вы можете быть уверены, что это проблема с SMTP.

0 голосов
/ 18 июня 2010

Мне удалось добиться этого, создав цикл, который повторяет отправку почты ...

$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);

Далее я добавлю некоторые настройки конфигурации, чтобы ограничить количество повторов.

...