[英]Sending BCC emails using a SMTP server?
我已经在我的一些代码中记录了一段时间:
/**
* 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()
函数发送带有密件抄送的电子邮件,一切正常,但我不知道为什么 - 我想推出自己的电子邮件发件人,但我不明白这一点。
有人可以对这个黑暗的主题有所了解吗?
密件抄送地址不会在目标电子邮件服务器上剥离。 这不是它的工作原理。
RCPT TO
命令列表,每个接收者的电子邮件地址一个,该命令不区分接收者是普通的To、CC或BCC类型的接收者。DATA
命令,其中将包含电子邮件的内容 - 由电子邮件标题和正文 - 电子邮件客户端收到的正文。 在这些电子邮件标题中,通常有发件人地址、收件人地址、抄送地址。DATA
命令下打印出来,而不是因为目标 SMTP 服务器将它们剥离。 目标 SMTP 服务器将仅参考RCPT TO
以获取应接收电子邮件内容的电子邮件地址列表。 它并不真正关心接收者是否在 To、CC 或 BCC 列表中。RCPT TO
命令列表,但BCC头不应该在打印DATA
命令。引用我认为与您的案例相关的 RFC 的一部分:
请注意,邮件数据包括备忘录标题项目,例如日期、主题、收件人、抄送、发件人 [2]。
坦率地说,几年前,我认为你仍然记住端到端的RFC 821已经很久了。 :)
很晚了,但接受的答案基本上是错误的。
首先,SMTP 与BCC
无关。 SMTP 作为一种协议,只涉及返回路径( MAIL
请求)、收件人列表( RCPT
请求)和要传输的DATA
( DATA
请求)。 如果您想通过 SMTP 向某人发送电子邮件,那么您必须在RCPT
请求中提供他们的地址。
电子邮件的内容 - DATA
,实际上 - 在RFC2822 中完全单独指定。 应该如何处理BCC
有很多自由度。 该规范提供了 3 种处理BCC
方法,其中只有一种是在准备电子邮件时去除了BCC
。 比如我用Thunderbird作为email客户端,把它指向一个SMTP服务器,然后看就行了,然后我发现Thunderbird BCC
已经没了(来自SMTP DATA
),并且SMTP连接而是包含对bcc
'ed 地址的标准RCPT
请求。 因此,Thunderbird 将BCC
转换为RCPT
,但这不是唯一的方法。
另一个处理BCC
地方是 MTA - 换句话说,您的邮件客户端指向的任何 SMTP 服务器。 例如,Sendmail 搜索 SMTP DATA
中的所有To
、 Cc
和Bcc
行,然后从这些行构建一个地址列表,然后删除Bcc
行。 如果您愿意,您可以说服 Sendmail 保留Bcc
。 如果 sendmail 不是目标 MTA,则它将通过 SMTP 连接到另一个 MTA,并通过RCPT
发送收件人地址。 换句话说,如果 sendmail是目标 MTA,并且它得到一个Bcc
,它将把它去掉,这与 Amry 的声明相反。
评论中也有一些混乱。 您可以为任何域指定RCPT
地址,而不仅仅是同一域中的地址列表。 MTA 必须查找目标域的 MX 记录,以确定将所有内容发送到何处。 google.com 和 yahoo.com 的声明是错误的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.