Отправка писем 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 неверны.