代码之家  ›  专栏  ›  技术社区  ›  Alix Axel

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

  •  15
  • Alix Axel  · 技术社区  · 14 年前

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

    /**
     * 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发送一封密件抄送的邮件时,密件抄送地址不会被隐藏——我已经阅读了整个关于SMTP协议的RFC(几年前),我认为我没有遗漏任何东西。

    奇怪的是,如果我使用 built-in mail() function 一切正常,我不知道为什么-我想滚动我自己的电子邮件发件人,但我不明白这一点。

    有人能给这个黑暗的主题点启发吗?

    2 回复  |  直到 10 年前
        1
  •  35
  •   Amry    14 年前

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

    SMTP的实际工作方式

    • 发件人将发送 RCPT TO 发送到SMTP服务器的命令,每个收件人的电子邮件地址对应一个,此命令不区分收件人是普通收件人、抄送收件人还是密件抄送收件人。
    • 在调用命令告诉SMTP服务器谁是发送者、谁是服务器以及其他一切之后,很快发送者就会调用 DATA 命令,其中将包含电子邮件的内容-包括电子邮件头和正文-电子邮件客户端接收的内容。在这些电子邮件头中,通常是从地址到地址、抄送地址。
    • BCC地址不会显示给接收者,仅仅是因为它没有打印在 数据 命令,不是因为目标SMTP服务器将它们剥离。目标SMTP服务器将只引用 RCPT到 获取应接收电子邮件内容的电子邮件地址列表。它并不真正关心收件人是否在“收件人”、“抄送”或“密件抄送”列表中。
      更新(澄清): 密件抄送电子邮件地址必须列在 RCPT到 命令列表,但bcc头应 打印在 数据 命令。

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

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

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

    坦白地说,几年前,我认为,很长一段时间以前,我们还以为你还记得 RFC 821 . :)

        2
  •  14
  •   EML    10 年前

    很晚了,但被接受的答案本质上是错误的。

    首先,SMTP与 BCC . 作为一种协议,SMTP只涉及返回路径(即 MAIL 请求),收件人列表 RCPT 请求),以及要传输的数据 DATA 请求)。如果你想通过SMTP向某人发送电子邮件,那么你必须在 RCPT 请求,期间。

    电子邮件的内容 数据 ,有效-完全单独指定,在 RFC2822 . 在如何 基底细胞癌 应该处理。规范给出了3种处理方法 基底细胞癌 其中只有一个是 基底细胞癌 在准备电子邮件时被删除。例如,如果我使用Thunderbird作为电子邮件客户端,并将其指向一个SMTP服务器,然后查看线上的消息,那么我会发现Thunderbird 基底细胞癌 已离开(从SMTP 数据 ,而smtp连接则包含一个标准 RCPT 请求 bcc ED地址。所以,雷鸟转换 基底细胞癌 RCPT 但这不是唯一的方法。

    另一个处理的地方 基底细胞癌 在MTA上,换句话说,就是邮件客户端指向的任何SMTP服务器。例如,sendmail搜索 To , Cc Bcc SMTP中的行 数据 ,然后从这些行构造地址列表,然后 移除 这个 基底细胞癌 线。你可以说服sendmail保留 基底细胞癌 如果你想的话。如果sendmail不是目标MTA,那么它将通过SMTP连接到另一个MTA,并通过 RCPT . 换句话说,如果发送邮件 目标MTA,它得到 基底细胞癌 它将把它剥掉,与Amry的声明相反。

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