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