一段时间以来,我已经对某些代码进行了注意:

/**
 * 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
 */

我不记得我从哪里得到的(可能的来源)但这与这个问题无关。基本上,每当我尝试通过SMTP发送BCC的电子邮件时,BCC地址并非隐藏 - 我已经阅读了SMTP协议的整个RFC(几年前),而且我认为我没有任何东西。

奇怪的是,如果我使用BCC发送电子邮件 内置 mail() 功能 一切正常,我不知道为什么 - 我想滚动自己的电子邮件发送者,但我不明白这一点。

有人可以向这个黑暗的主题散发一些光线吗?

有帮助吗?

解决方案

BCC地址未在目标电子邮件服务器上删除。那不是它的工作方式。

SMTP实际上是如何工作的

  • 发件人将发送一份清单 RCPT TO 命令到SMTP服务器,每个接收器电子邮件地址一个,此命令没有区分接收器是否是正常的CC或BCC类型接收器。
  • 拨打命令后很快告诉SMTP服务器谁是发件人,谁是服务器以及其他所有内容,直到发件人才会调用 DATA 命令将包含电子邮件的内容(由电子邮件标题和主体组成),该命令由电子邮件客户端接收到的命令。在这些电子邮件标题中,从地址到地址,CC地址是通常的。
  • BCC地址未向接收器显示,仅仅是因为它未在 DATA 命令,不是因为目标SMTP服务器将它们剥离了。目的地SMTP服务器只会参考 RCPT TO 对于应该接收电子邮件内容的电子邮件地址列表。它并不真正在乎接收器是否在TO,CC或BCC列表中。
    更新(澄清): BCC电子邮件地址必须在 RCPT TO 命令列表,但BCC标头应该 不是 被印在 DATA 命令。

引用我认为与您的案件相关的RFC的一部分:

请注意,邮件数据包括[2]的备忘录标题项目,例如日期,主题,cc,cc。

推出您自己的电子邮件发送者

我坦率地认为,几年前,很长一段时间以来,您仍然记住了端到端的 RFC 821. :)

其他提示

很晚,但是公认的答案本质上是错误的。

首先,SMTP与 BCC. 。作为协议,SMTP仅关注返回路径( MAIL 请求),收件人列表( RCPT 请求),并传输数据( DATA 要求)。如果您想通过SMTP向某人发送电子邮件,则必须在 RCPT 请求,期限。

电子邮件的内容 - DATA, ,有效地 - 完全分开指定 RFC2822. 。如何有很多纬度 BCC 应该处理。规格提供了三种处理方式 BCC, ,其中只有一个是 BCC 准备电子邮件时脱颖而出。例如,如果我将Thunderbird用作电子邮件客户端,并将其指向SMTP服务器,然后查看行上的消息,然后我发现Thunderbird BCC 已经走了(来自SMTP DATA),并且SMTP连接包含标准 RCPT 请求 bcc'ed地址。所以,雷鸟convert依 BCCRCPT, ,但这不是做到这一点的唯一方法。

另一个可以处理的地方 BCC 在MTA上 - 换句话说,您的邮件客户端指向的SMTP服务器是什么。例如,sendmail搜索所有 To, Cc, , 和 Bcc SMTP中的行 DATA, ,然后从这些行构造一个地址列表,然后 去除Bcc 线。您可以说服Sendmail保留 Bcc 如果你想。如果SendMail不是目标MTA,则将通过SMTP连接到另一个MTA,并通过 RCPT. 。换句话说,如果Sendmail 目的地MTA,它有一个 Bcc, ,它将剥离它,与阿里的声明相反。

评论中也有一些混乱。您可以指定 RCPT 地址到任何域,而不仅仅是同一域中的地址列表。 MTA必须查找目标域的MX记录,以确定将所有内容发送到哪里。 Google.com和Yahoo.com的语句错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top