19

我已经在我的一些代码上记录了一段时间:

/**
 * 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 发送带有密件抄送的电子邮件时,密件抄送地址都不会被隐藏——我已经阅读了 SMTP 协议的整个 RFC(几年前),我认为我没有遗漏任何东西。

奇怪的是,如果我使用内置mail()功能发送一封带有密件抄送的电子邮件,一切正常,我不知道为什么 - 我想推出自己的电子邮件发件人,但我不明白这一点。

有人可以对这个黑暗的主题有所了解吗?

4

2 回答 2

41

密件抄送地址不会在目标电子邮件服务器上剥离。这不是它的工作原理。

SMTP 的实际工作原理

  • 发送者将向 SMTP 服务器发送一个命令列表,RCPT TO每个接收者的电子邮件地址一个,并且该命令不区分接收者是普通的 To、CC 还是 BCC 类型的接收者。
  • 在调用告诉 SMTP 服务器谁是发件人、谁是服务器以及其他所有内容的命令后很快,发件人才会调用该DATA命令,其中将包含电子邮件的内容 - 由电子邮件标题和正文组成- 电子邮件客户收到的邮件。在这些电子邮件标题中,通常是发件人地址、收件人地址、抄送地址。
  • 密件抄送地址没有显示给接收者,只是因为它没有在DATA命令下打印出来,而不是因为目标 SMTP 服务器将它们剥离。目标 SMTP 服务器将仅参考RCPT TO应接收电子邮件内容的电子邮件地址列表。它并不真正关心接收方是否在 To、CC 或 BCC 列表中。
    更新(澄清):密件抄送电子邮件地址必须列在RCPT TO命令列表中,但密件抄送标题不应打印DATA命令下。

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

请注意,邮件数据包括备注标题项,例如日期、主题、收件人、抄送、发件人 [2]。

推出您自己的电子邮件发件人

几年前,我坦率地认为,假设您仍然记住RFC 821的端到端是相当长的时间。:)

于 2010-05-01T14:46:24.170 回答
19

很晚了,但接受的答案本质上是错误的。

首先,SMTP 与BCC. SMTP 作为一种协议,只关心返回路径(MAIL请求)、收件人列表(RCPT请求)和要传输的数据(DATA请求)。如果您想通过 SMTP 向某人发送电子邮件,那么您必须在RCPT请求期间提供他们的地址。

电子邮件的内容 -DATA有效地 - 在RFC2822中完全单独指定。BCC应该如何处理有很大的自由度。该规范提供了 3 种处理方式BCC,其中只有一种是BCC在准备电子邮件时被剥离的。例如,如果我使用 Thunderbird 作为电子邮件客户端,并将其指向 SMTP 服务器,然后查看在线消息,我发现 ThunderbirdBCC已经消失(来自 SMTP DATA),而 SMTP 连接包含对'ed 地址的标准RCPT请求。bcc因此,Thunderbird 转换BCCRCPT,但这不是唯一的方法。

另一个需要处理的地方BCC是 MTA - 换句话说,无论您的邮件客户端指向什么 SMTP 服务器。例如,Sendmail 搜索SMTP 中的所有 、 和 行ToCc然后从这些行构造一个地址列表,然后删除该行。如果您愿意,您可以说服 Sendmail 保留该邮件。如果 sendmail 不是目标 MTA,那么它将通过 SMTP 连接到另一个 MTA,并通过. 换句话说,如果 sendmail目标 MTA,并且它得到一个,它将把它去掉,这与 Amry 的说法相反。BccDATABccBccRCPTBcc

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

于 2014-10-28T14:35:13.810 回答