Если ты работаешь с SMTP ручками (ты там про fsockopen писал выше), надо вычитывать после каждой команды ответ целиком, иногда он не сразу отдается, надо подождать, ну проще всего работать с SMTP синхронно.
Ответом является строка с циферкой, после которой нету -. Если циферка с -, значит, продолжение в следующией строке. Вот посмотри ответ на EHLO у меня выше.
С этим я разобрался, хотя провозился долго, особенно с задержкой ответа от сервера и еще после неудачной авторизации он слал два ответа без "-" (первый 3хх, второй 5xx). В общем проблема была, что я сначала выгребал не все ответы от прошлых команд и они начинал выполнять новые, в итоге в ответе каша.
Команда - это обычно одна строка, в случае с DATA команда - это сообщение, заканчивается строкой с точкой. Сообщение надо отправлять только после получения 354. Ну как и прочие команды - вычитываешь ответ, и продолжаешь работу только если он ожидаемый (ведь сервер может вернуть и код ошибки). Короче, это конечным автоматом программируется.
Назначение 354 я понял, но если я выполняю DATA и жду ответ "354", то скрипт просто зависает до таймаута, если же отправляю сразу тело письма, то письмо отправляется, а следом приходит 354, итог снова каша.
Вот как раз то, о чем я и говорю.
Я немного ввел в заблуждение, строки с "[ ]", это не сетевой вывод (для себя), вывести из сети DATA у меня не получается, из-за зависания.
А вообще возьми SwiftMailer и не мучайся.
Так я бы не против, но тогда обработкой to, cc, bcc займется SwiftMailer, а меня это не устраивает.