题
一段时间以来,我已经对某些代码进行了注意:
/**
* 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依 BCC
到 RCPT
, ,但这不是做到这一点的唯一方法。
另一个可以处理的地方 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的语句错误。