我有一段时间记下了我的一些代码:
/**
* 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
*/
我不记得从哪里得到它(possible source),但这不应该与这个问题相关。基本上,每当我尝试通过SMTP发送带有BCC的电子邮件时,BCC地址都不会被隐藏 - 我已经阅读了整个RFC协议(几年前),而且我认为我什么都没有丢失。< / p>
奇怪的是,如果我使用 built-in mail()
function 发送包含BCC的电子邮件,一切正常并且我不知道为什么 - 我想推送自己的电子邮件发件人但我不明白这一点。
有人可以对这个黑暗的主题有所了解吗?
答案 0 :(得分:35)
目标电子邮件服务器上的BCC地址未被删除。这不是它的工作原理。
RCPT TO
命令列表,每个接收者电子邮件地址一个,此命令不区分接收者是普通的To,CC还是BCC类接收器。DATA
命令,其中包含电子邮件的内容 - 其中包括电子邮件标题和正文 - 电子邮件客户端收到的邮件标题和正文。在这些电子邮件标题中,通常是从地址到地址,CC地址。DATA
命令下打印出来,不是因为目标SMTP服务器将它们剥离了。目标SMTP服务器将仅引用RCPT TO
以获取应接收电子邮件内容的电子邮件地址列表。它并不关心接收器是否在To,CC或BCC列表中
更新(澄清): BCC电子邮件地址必须列在RCPT TO
命令列表中,但BCC标题应不打印在{{1}下}命令。引用我认为与您的案例相关的RFC的一部分:
请注意,邮件数据包括备注标题项,例如日期,主题,收件人,抄送,来自[2]。
几年前,我坦率地认为,相当长的一段时间,假设你仍然记住RFC 821的端到端。 :)
答案 1 :(得分:15)
很晚,但接受的答案本质上是错误的。
首先,SMTP与BCC
无关。 SMTP作为协议,仅涉及返回路径(MAIL
请求),收件人列表(RCPT
请求)以及要传输的数据(DATA
请求)。如果您想通过SMTP向某人发送电子邮件,则必须在RCPT
请求期间提供其地址。
电子邮件的内容 - DATA
,有效 - 在RFC2822中完全单独指定。在如何处理BCC
方面有很大的自由度。该规范提供了3种处理BCC
的方法,其中只有一种方法是在准备电子邮件时删除了BCC
。例如,如果我将Thunderbird用作电子邮件客户端,并将其指向SMTP服务器,然后查看该行上的消息,那么我发现Thunderbird BCC
已经消失(来自SMTP {{1相反,SMTP连接包含DATA
地址的标准RCPT
请求。因此,Thunderbird会将bcc
转换为BCC
,但这不是唯一的方法。
处理RCPT
的另一个地方是MTA - 换句话说,就是您的邮件客户端指向的任何SMTP服务器。例如,Sendmail会搜索SMTP BCC
中的所有To
,Cc
和Bcc
行,然后从这些行构建地址列表,然后< em>删除 DATA
行。如果您愿意,可以说服Sendmail保留Bcc
。如果sendmail不是目标MTA,则它将通过SMTP连接到另一个MTA,并通过Bcc
发送收件人地址。换句话说,如果sendmail 是目标MTA,并且它获得RCPT
,则会将其删除,这与Amry的声明相反。
评论中也存在一些混淆。您可以为任何域指定Bcc
地址,而不仅仅是同一域中的地址列表。 MTA必须查找目标域的MX记录,以确定发送所有内容的位置。 google.com和yahoo.com的陈述是错误的。