Отправка сообщений BCC с использованием SMTP-сервера? - PullRequest
15 голосов
/ 01 мая 2010

Некоторое время назад я записал это в своем коде:

/**
 * 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() функцию , все работает как надо, и я не знаю почему - я Я хотел бы прокрутить моего собственного отправителя электронной почты, но я не понимаю этого.

Может кто-нибудь, пожалуйста, пролить свет на этот темный предмет?

Ответы [ 2 ]

35 голосов
/ 01 мая 2010

Адреса BCC не удаляются на целевом почтовом сервере.Это не так.

Как на самом деле работает SMTP

  • Отправитель отправит на сервер SMTP список команд RCPT TO, по одной для каждого адреса электронной почты получателя, и этоКоманда не определяет, является ли получатель обычным получателем типа To, CC или BCC.
  • Достаточно скоро после вызова команды, которая сообщает SMTP-серверу, кто является отправителем, кто является сервером, и все остальное, только тогдаотправитель вызовет команду DATA, в которой будет содержаться содержимое электронного письма, состоящее из заголовков и тела письма, которое получено почтовыми клиентами.В число этих заголовков электронной почты входят обычные адреса, адреса и адреса CC.
  • Адрес BCC не отображается получателю, просто потому, что он не распечатывается по команде DATA, а не потому, что SMTP назначениясервер их убрал.SMTP-сервер назначения просто будет обращаться к RCPT TO для получения списка адресов электронной почты, которые должны получать содержимое электронной почты.На самом деле не имеет значения, находится ли получатель в списке Кому, CC или BCC.
    Обновление (для уточнения): Адреса электронной почты BCC должны быть указаны в списке команд RCPT TO, но BCCзаголовок должен не печататься по команде DATA.

Цитировать часть RFC, которая, на мой взгляд, имеет отношение к вашему делу:

Обратите внимание, что данные почты включают в себя такие элементы заголовка заметки, как Дата, Тема, Кому, Копия, От [2].

Развертывание собственного отправителя электронной почты

Парамного лет назад, я искренне думаю, довольно давно можно предположить, что вы до сих пор запоминаете сквозной RFC 821 .:)

15 голосов
/ 28 октября 2014

Очень поздно, но принятый ответ по существу неверен.

Во-первых, SMTP не имеет ничего общего с BCC. SMTP, как протокол, касается только пути возврата (запрос MAIL), списка получателей (запрос RCPT) и данных для передачи (запрос DATA). Если вы хотите отправить электронное письмо кому-либо через SMTP, вам необходимо указать его адрес в запросе RCPT, точка.

Содержимое электронного письма - DATA, по сути - указывается полностью отдельно, в RFC2822 . Существует много возможностей для обработки BCC. В спецификации дается 3 способа обработки BCC, и только в одном из них BCC удаляется при подготовке письма. Например, если я использую Thunderbird в качестве почтового клиента и указываю его на SMTP-сервер, а затем просматриваю сообщение в строке, то обнаруживаю, что Thunderbird BCC исчез (из SMTP DATA), и вместо этого SMTP-соединение содержит стандартный RCPT запрос для bcc 'ed-адреса. Итак, Thunderbird конвертирует BCC в RCPT, но это не единственный способ сделать это.

Еще одно место для обработки BCC находится в MTA - другими словами, на любой SMTP-сервер, на который указывает ваш почтовый клиент. Например, Sendmail ищет все строки To, Cc и Bcc в SMTP DATA, а затем создает список адресов из этих строк, а затем удаляет the Bcc строка. Вы можете убедить Sendmail оставить Bcc, если хотите. Если sendmail не является целевым MTA, он подключится к другому MTA через SMTP и отправит адреса получателей через RCPT. Другими словами, если sendmail является целевым MTA, и он получает Bcc, он его удалит, вопреки утверждению Амри.

Есть также некоторая путаница в комментариях. Вы можете указать RCPT адресов для любого домена, а не просто список адресов в одном домене. АПС должен искать записи MX для целевых доменов, чтобы определить, куда все отправлять. Заявления google.com и yahoo.com неверны.

...