Отправка писем по php через сокеты - PullRequest
2 голосов
/ 19 февраля 2012

Я пишу класс SMTP для отправки писем с использованием сокетов с PHP и почти успешно.Проблема в том, что работает случайным образом, и иногда отправка электронной почты занимает много времени.

Я заметил, что однажды "."отправлено, я должен получить ответ, что электронное письмо было отправлено, но вместо этого я получаю, что сервер закрывает передачу (то же самое сообщение, когда я отправляю команду «ВЫЙТИ»), а затем сообщение о том, что электронное письмо было отправлено.

Так что сообщения по какой-то причине приходят смешанными ... но только с двумя последними командами: "."и "ВЫЙТИ".

Кто-нибудь может мне помочь?

Загружено здесь: http://pastebin.com/9vweVpe7

PD: Я знаю, что могу использовать phpmailer или swift, но яхочу сделать это самостоятельно, чтобы учиться.

1 Ответ

3 голосов
/ 19 февраля 2012

В вашей реализации есть несколько багов и логических пробелов, но наиболее важные, которые мне напрямую касаются вашего вопроса:

1) отверстие в compile_message().

2) неправильное использование command() при отправке данных электронной почты.

Как только вы отправили исходную команду DATA и получили ответ, каждая строка данных электронной почты, которую вы отправляете впоследствии, НЕ является отдельной командой, но вы воспринимаете их так, как если бы они были. Позвонив по номеру command() для каждой строки данных электронной почты, вы ожидаете ответов, которые никогда не будут получены, поскольку их не существует. Для каждой строки данных электронной почты звоните fwrite() вместо command(). Не звоните command(), пока не будете готовы отправить завершающую команду . (которую, к слову, нужно переместить за пределы вашего блока if not html).

Кроме того, при отправке отдельной строки данных электронной почты перед ней должен стоять дополнительный период, если он начинается с периода. Это описано в RFC 2821, раздел 4.5.2 . Ваш код не обрабатывает это вообще. Если вы не экранируете данные своей электронной почты должным образом, вы можете время от времени случайно прервать электронную почту преждевременно, и последующие строки электронной почты будут интерпретироваться сервером как неизвестные команды, и он будет отправлять соответствующие сообщения об ошибках. Сервер не исключает разрыва соединения, если он получает несколько неизвестных команд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...