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

Ali*_*xel 16 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
 */
Run Code Online (Sandbox Code Playgroud)

我不记得从哪里得到它(可能的来源),但这不应该与这个问题相关.基本上,每当我尝试通过SMTP发送带有BCC的电子邮件时,BCC地址都不会被隐藏 - 我已经阅读了整个RFC的SMTP协议(几年前),我认为我什么都没有丢失.

奇怪的是,如果我使用内置mail()函数向BCC发送电子邮件,一切正常,我不知道为什么 - 我想推送自己的电子邮件发件人,但我不明白这一点.

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

Amr*_*mry 37

BCC地址不会在目标电子邮件服务器上剥离.这不是它的工作原理.

SMTP如何实际工作

  • 发送方将向RCPT TOSMTP服务器发送一个命令列表,每个接收方电子邮件地址一个,此命令不区分接收方是普通的To,CC还是BCC类型的接收方.
  • 很快,在调用告诉SMTP服务器谁是发件人,谁是服务器以及其他所有的DATA命令后,发件人才会调用该命令,其中包含电子邮件的内容 - 包括电子邮件标题和正文 - 电子邮件客户端收到的那个.在这些电子邮件标题中,通常是从地址到地址,CC地址.
  • BCC地址不会显示给接收方,只是因为它没有在DATA命令下打印出来,不是因为目标SMTP服务器将它们剥离了.目标SMTP服务器将仅引用RCPT TO应接收电子邮件内容的电子邮件地址列表.它并不关心接收器是否在To,CC或BCC列表中.
    更新(澄清): BCC的电子邮件地址必须在上市RCPT TO命令列表,但BCC头应该不会下进行打印DATA命令.

引用我认为与您的案例相关的RFC的一部分:

请注意,邮件数据包括备注标题项,如日期,主题,收件人,抄送,来自[2].

推出自己的电子邮件发件人

几年前,我坦率地认为,假设您仍然记住RFC 821的端到端,还有很长一段时间.:)


EML*_*EML 17

很晚,但接受的答案本质上是错误的.

首先,SMTP与之无关BCC.SMTP作为协议,仅涉及返回路径(MAIL请求),收件人列表(RCPT请求)和要传输的数据(DATA请求).如果您想通过SMTP向某人发送电子邮件,则必须在RCPT请求期间提供其地址.

电子邮件的内容 - DATA有效 - 在RFC2822中完全单独指定.BCC应该如何处理有很多自由.该规范提供了3种处理方式,BCC其中只有一种是BCC在准备电子邮件时被删除的.例如,如果我将Thunderbird用作电子邮件客户端,并将其指向SMTP服务器,然后查看该行上的消息,那么我发现Thunderbird BCC已经消失(来自SMTP DATA),而SMTP连接则包含'ed地址的标准RCPT请求bcc.所以,Thunderbird转换BCCRCPT,但这不是唯一的方法.

另一个需要处理的地方BCC是MTA - 换句话说,就是你的邮件客户端指向的任何SMTP服务器.Sendmail的,例如,搜索所有的To,CcBcc在SMTP线DATA,然后从构建这些行的地址列表,然后删除Bcc行.你可以说服Sendmail保留Bcc你想要的.如果sendmail不是目标MTA,则它将通过SMTP连接到另一个MTA,并通过发送收件人地址RCPT.换句话说,如果sendmail 目标MTA,它会得到一个Bcc,它会将其删除,这与Amry的声明相反.

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