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

Другие вопросы по тегам