使用SMTP服务器发送BCC电子邮件?

时间:2010-05-01 14:02:11

标签: php email smtp bcc

我有一段时间记下了我的一些代码:

/**
 * 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的电子邮件,一切正常并且我不知道为什么 - 我想推送自己的电子邮件发件人但我不明白这一点。

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

2 个答案:

答案 0 :(得分:35)

目标电子邮件服务器上的BCC地址未被删除。这不是它的工作原理。

SMTP实际如何运作

  • 发件人将向SMTP服务器发送RCPT TO命令列表,每个接收者电子邮件地址一个,此命令不区分接收者是普通的To,CC还是BCC类接收器。
  • 在调用告诉SMTP服务器谁是发件人,谁是服务器以及其他所有内容的命令后不久,发件人才会调用DATA命令,其中包含电子邮件的内容 - 其中包括电子邮件标题和正文 - 电子邮件客户端收到的邮件标题和正文。在这些电子邮件标题中,通常是从地址到地址,CC地址。
  • BCC地址不会显示给接收方,只是因为它没有在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中的所有ToCcBcc行,然后从这些行构建地址列表,然后< em>删除 DATA行。如果您愿意,可以说服Sendmail保留Bcc。如果sendmail不是目标MTA,则它将通过SMTP连接到另一个MTA,并通过Bcc发送收件人地址。换句话说,如果sendmail 是目标MTA,并且它获得RCPT,则会将其删除,这与Amry的声明相反。

评论中也存在一些混淆。您可以为任何域指定Bcc地址,而不仅仅是同一域中的地址列表。 MTA必须查找目标域的MX记录,以确定发送所有内容的位置。 google.com和yahoo.com的陈述是错误的。