Отправка сообщений 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()
Функция все работает как раз, и я не знаю почему - я хотел бы прокрутить мой собственный отправитель электронной почты, но я не понимаю этого.
Может кто-нибудь, пожалуйста, пролить свет на эту темную тему?
2 ответа
Адреса BCC не удаляются на почтовом сервере назначения. Это не так, как это работает.
Как на самом деле работает SMTP
- Отправитель отправит список
RCPT TO
Команды для SMTP-сервера, по одной для каждого адреса электронной почты получателя, и эта команда не различает, является ли получатель обычным получателем типа To, CC или BCC. - Достаточно скоро после вызова команды, которая сообщает SMTP-серверу, кто является отправителем, кто является сервером, и все остальное, только тогда отправитель вызовет
DATA
команда, в которой будет содержаться содержимое письма, которое состоит из заголовков и тела письма, которое получено почтовыми клиентами. Среди этих заголовков электронной почты обычные от адреса к адресу, CC-адрес. - Адрес BCC не отображается получателю просто потому, что он не распечатан под
DATA
команда, а не потому, что целевой SMTP-сервер удалил их. SMTP-сервер назначения будет просто ссылаться наRCPT TO
для списка адресов электронной почты, которые должны получать содержимое электронной почты. В действительности не имеет значения, находится ли получатель в списке "Кому", "CC" или "BCC".
Обновление (чтобы уточнить): адреса электронной почты BCC должны быть указаны вRCPT TO
список команд, но заголовок BCC не должен быть напечатан подDATA
команда.
Цитирую часть RFC, которая, на мой взгляд, имеет отношение к вашему делу:
Обратите внимание, что данные почты включают в себя такие элементы заголовка заметки, как Дата, Тема, Кому, Копия, От [2].
Выкатывание вашего собственного отправителя электронной почты
Я, честно говоря, пару лет назад довольно давно мог предположить, что вы все еще запоминаете сквозной RFC 821.:)
Очень поздно, но принятый ответ по сути неверен.
Во-первых, SMTP не имеет ничего общего с BCC
, SMTP, как протокол, касается только пути возврата (MAIL
запрос), список получателей (RCPT
запрос), а также данные для передачи (DATA
запрос). Если вы хотите отправить электронное письмо кому-либо через SMTP, вы должны указать его адрес в RCPT
запрос, период.
Содержание письма - DATA
, эффективно - указаны полностью отдельно, в RFC2822. В том, как много BCC
должны быть обработаны. Спецификация дает 3 способа обработки BCC
и только в одном из них BCC
раздели при подготовке письма. Если я использую Thunderbird в качестве почтового клиента, например, и указываю на SMTP-сервер, а затем смотрю на сообщение в строке, то я нахожу, что Thunderbird BCC
ушел (из SMTP DATA
), а SMTP-соединение вместо этого содержит стандарт RCPT
запрос на bcc
адрес. Итак, Thunderbird преобразует BCC
в RCPT
, но это не единственный способ сделать это.
Другое место для обработки BCC
находится в MTA - другими словами, на любой SMTP-сервер, на который указывает ваш почтовый клиент. Sendmail, например, ищет все To
, Cc
, а также Bcc
линии в SMTP DATA
, а затем создает список адресов из этих строк, а затем удаляет Bcc
линия. Вы можете убедить Sendmail сохранить Bcc
если хотите. Если sendmail не является целевым MTA, он подключится к другому MTA через SMTP и отправит адреса получателей через RCPT
, Другими словами, если sendmail является адресом MTA, и он получает Bcc
, это разобьет это, вопреки заявлению Амри.
Есть также некоторая путаница в комментариях. Вы можете указать RCPT
адреса к любому домену, а не просто список адресов в одном домене. АПС должен искать записи MX для доменов назначения, чтобы определить, куда все отправлять. Заявления google.com и yahoo.com неверны.