Php 使用SMTP服务器发送密件抄送电子邮件?

Php 使用SMTP服务器发送密件抄送电子邮件?,php,email,smtp,bcc,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 blin

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

/**
 * 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(几年前),我不认为我遗漏了任何内容

奇怪的是,如果我使用与密件抄送系统发送电子邮件,一切正常,我不知道为什么-我想滚动我自己的电子邮件发件人,但我无法理解这一点


有人能解释一下这个黑暗的主题吗?

目标电子邮件服务器上的密件抄送地址没有被删除。这不是它的工作原理

SMTP的实际工作原理
  • 发件人将向SMTP服务器发送
    RCPT TO
    命令列表,每个收件人电子邮件地址一个,此命令不区分收件人是普通收件人、抄送还是密件抄送类型的收件人
  • 在调用告诉SMTP服务器谁是发件人、谁是服务器以及其他所有内容的命令后不久,只有发件人才会调用
    DATA
    命令,其中包含电子邮件的内容(包括电子邮件标题和正文),即电子邮件客户端接收到的内容。在这些电子邮件标题中,通常有“发件人地址”、“收件人地址”和“抄送地址”
  • 密件抄送地址没有显示给接收者,只是因为它没有在
    DATA
    命令下打印出来,而不是因为目标SMTP服务器将其剥离。目标SMTP服务器将只参考
    RCPT to
    以获取应接收电子邮件内容的电子邮件地址列表。它并不真正关心接收方是否在To、CC或BCC列表中。
    更新(澄清):密件抄送电子邮件地址必须列在
    RCPT to
    命令列表中,但密件抄送头不应在
    数据
    命令下打印
引用我认为与您的案例相关的RFC的一部分:

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

推出自己的电子邮件发件人
坦白地说,我认为,几年前,假设你仍能背诵一首又一首歌,那是相当长的一段时间了。:)

很晚了,但公认的答案基本上是错误的

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

电子邮件的内容(有效的
数据
)在中完全单独指定。如何处理
BCC
有很大的自由度。规范给出了3种处理
BCC
的方法,其中只有一种是在准备电子邮件时去掉的
BCC
。例如,如果我将Thunderbird用作电子邮件客户端,并将其指向SMTP服务器,然后查看线路上的邮件,则我发现Thunderbird
BCC
已经消失(来自SMTP
数据
),SMTP连接反而包含一个标准的
RCPT
请求
BCC
”加密地址。因此,雷鸟将
BCC
转换为
RCPT
,但这不是唯一的方法

另一个处理密件抄送的地方是MTA,也就是说,邮件客户端指向的SMTP服务器。例如,Sendmail搜索SMTP
数据
中的所有
抄送
密件抄送
行,然后从这些行构造地址列表,然后删除
密件抄送
行。如果愿意,您可以说服Sendmail保留
Bcc
。如果sendmail不是目标MTA,则它将通过SMTP连接到另一个MTA,并通过
RCPT
发送收件人地址。换句话说,如果sendmail是目标MTA,并且它获得了一个
Bcc
,那么它将删除它,这与安利的声明相反


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

如果不在重复使用同一连接的同时发送单独的消息,我从来没有成功地做到过。即使你让BCC工作(这取决于远程MTA写得多好),像Hotmail这样的服务也只是考虑它的垃圾邮件。我本想回答这个问题,但它并没有完全回答你的问题。。我也对一些有用的东西感兴趣。@Tim Post:谢谢你的评论,这也是我对当前实现所做的。。。我希望有人能想出一个解决方案,或者至少能解释为什么会发生这种情况。请注意,我所说的“成功”是指“在任何地方都能工作”,而不是“在谷歌上工作,但在foomail上不太有效”。有缺陷的远程MTA至少是它崩溃的部分原因(或者更确切地说,是它们使用的解析器)。+1用于滚动您自己的电子邮件发件人。MTA就像Hotmail一样,似乎很在意,但我想我们对此无能为力:)啊,如果是这样的话,那么我真的不知道。就我个人而言,我没有任何真实世界的工作原型,我自己的电子邮件发件人。2002年,当我在大学里研究这个SMTP作为我课程的一部分时,我只是简单地想起了一点我的实现就是这么做的,我没有记住RFC 821——我只是记住我做得对(花了3天时间测试和调试一个缺失的点)。@Alix:I