Отправка писем BCC с использованием SMTP-сервера?
На некоторое время я заметил некоторые из моего кода:
/**
* Add a BCC.
*
* Note that according to the conventions of the SMTP protocol all
* addresses, including BCC addresses, are included in every email as it
* is sent over the Internet. The BCC addresses are stripped off blind
* copy email only at the destination email server.
*
* @param string $email
* @param string $name
* @return object Email
*/
Я не помню, откуда я его получил (возможный источник), но это не должно иметь отношения к этому вопросу. В принципе, всякий раз, когда я пытаюсь отправить электронное письмо с BCC через SMTP, адреса BCC не скрыты. Я прочитал весь RFC для протокола SMTP (пару лет назад), и я не думаю, что я что-то пропустил.
Странно, если я отправлю электронное письмо с BCC, используя встроенная функция mail()
все работает правильно, и я понятия не имею, почему - я хотел бы перевернуть моего собственного отправителя электронной почты, но я не понимаю этого.
Может кто-то пролить некоторый свет на этот темный предмет?
Ответы
Ответ 1
Адреса BCC не удаляются на целевом почтовом сервере. Это не так, как это работает.
Как работает SMTP
- Отправитель отправит список команд
RCPT TO
на SMTP-сервер, по одному для каждого адреса электронной почты получателя, и эта команда не различает, является ли приемник обычным приемником типа To, CC или BCC.
- Достаточно скоро после вызова команды, которая сообщает SMTP-серверу, кто отправитель, кто сервер и все остальное, только тогда отправитель вызовет команду
DATA
, в которой будет содержаться содержимое сообщения электронной почты, которое состоит из заголовков и тегов электронной почты, которые получены почтовыми клиентами. Среди этих заголовков электронной почты обычно используется адрес, адрес, адрес CC.
- Адрес BCC не отображается получателю, просто потому, что он не распечатывается под командой
DATA
, а не потому, что целевой SMTP-сервер удалил их. Целевой SMTP-сервер будет просто ссылаться на RCPT TO
для списка адресов электронной почты, которые должны получать содержимое электронной почты. На самом деле все равно, находится ли приемник в списке To, CC или BCC.
Обновить (чтобы уточнить): Адреса электронной почты BCC должны быть указаны в списке команд RCPT TO
, но заголовок BCC должен не печатать под командой DATA
.
Цитирование части RFC, которая, по моему мнению, имеет отношение к вашему делу:
Обратите внимание, что почтовые данные включают элементы заголовка заметки, такие как Date, Subject, To, Cc, From [2].
Отправка собственного отправителя электронной почты
Пару лет назад, я искренне думаю, довольно долго назад, чтобы предположить, что вы все еще запоминаете от конца до конца RFC 821.:)
Ответ 2
Очень поздно, но принятый ответ по существу неправильный.
Во-первых, SMTP не имеет ничего общего с BCC
. SMTP в качестве протокола касается только пути возврата (запрос MAIL
), списка получателей (запрос RCPT
) и данных, которые необходимо передать (запрос DATA
). Если вы хотите отправить электронное письмо кому-либо через SMTP, тогда вы должны указать свой адрес в запросе RCPT
, период.
Содержимое электронной почты - DATA
, эффективно - указано полностью отдельно, в RFC2822. Там, где BCC
должно быть обработано много широты. Спецификация дает три способа обработки BCC
, и только в одном из них удаляется BCC
при подготовке электронной почты. Например, если я использую Thunderbird в качестве почтового клиента и указываю его на SMTP-сервер, а затем просматриваю сообщение в строке, то обнаруживаю, что Thunderbird BCC
ушел (из SMTP DATA
), и SMTP-соединение вместо этого содержит стандартный RCPT
запрос для адреса BCC
'ed. Итак, Thunderbird преобразует BCC
в RCPT
, но это не единственный способ сделать это.
Другое место для обработки BCC
- это MTA - другими словами, на какой SMTP-сервер указан ваш почтовый клиент. Например, Sendmail ищет все строки To
, Cc
и BCC
в SMTP DATA
, а затем строит список адресов из этих строк, а затем удаляет строку BCC
. Вы можете убедить Sendmail сохранить BCC
, если хотите. Если sendmail не является назначенным MTA, он будет подключаться к другому MTA через SMTP и отправлять адреса получателя через RCPT
. Другими словами, если sendmail является целевым MTA, и он получает BCC
, он будет лишать его, в отличие от оператора Amry.
Там также некоторые путаницы в комментариях. Вы можете указать адреса RCPT
для любого домена, а не только для списка адресов в одном домене. MTA должен искать записи MX для доменов назначения, чтобы определить, куда отправлять все. Заявления google.com и yahoo.com неверны.