smtplib.sendmail() 和 email.message["To"] 的区别?

Difference between smtplib.sendmail() and email.message["To"]?

我一直在测试我的代码以向多个收件人发送电子邮件,但我发现了一个奇怪的观察结果:


 message["To"] = 'email_one.sample.com, email_two.sample.com'
 sendmail(mine_email, ['email_one.sample.com'], message.as_string())

以上两行给我一个输出,其中我可以在 header 部分看到两个收件人的 email_id,但尽管事实上我只传递了一个收件人的 ID sendmail() 方法,电子邮件仍然发送到两个 id。

反之亦然,如果我将单个 email_id 传递到消息 ["To"] 中,并在 sendmail() 方法中传递多个 email_id,则电子邮件将发送到所有sendmail() 方法中的收件人,但他们在 header 部分只能看到一个 id。

所以现在我对导致这种奇怪行为的幕后到底发生了什么感到有点困惑。 email_id 我没有传递到 sendmail() 方法的收件人究竟如何接收电子邮件,只需将该电子邮件 ID 传递到 message["To"] 部分。

P.S.: 我已经看到了下面的答案,虽然它详细介绍了语法,但我只是在询问与我上述问题有关的奇怪行为

Seen Question link

观察是由于 SMTP 的工作原理,所以在电子邮件中通常有 2 种类型的 "To" 地址 - 一种是电子邮件发送到的实际电子邮件地址(envelope to),另一个是用户可以在电子邮件中看到的 body(header to).

例如,假设您从某个电子邮件客户端向两个收件人发送电子邮件,一个是密件抄送收件人,另一个是抄送收件人,那么 envelope to 将包含两个发件人的地址,但 to header 将没有 BCC 收件人的地址。因此 SMTP 服务器(MTA 邮件传输代理)会看到这封电子邮件是发给两个收件人的,但是当收件人收到电子邮件时,他们会看到它只发送给了一个收件人。

这是一个 SMTP 交易示例 -

=== Connected to mysmtpserver.com
 -> EHLO MYHOST
<-  250-mysmtpserver.com says EHLO to 10.128.22.119:53831
<-  250-8BITMIME
<-  250-ENHANCEDSTATUSCODES
<-  250-STARTTLS
<-  250-PIPELINING
 -> MAIL FROM:<me@somone.com>
<-  250 2.0.0 MAIL FROM accepted
 -> RCPT TO:<my_friend@his.domain.com>
<-  250 2.0.0 RCPT TO accepted
 -> DATA
<-  354 3.0.0 continue.  finished with "\r\n.\r\n"
 -> Date: Fri, 03.1 Aug 2018 00:24:53 +0530
 -> To: my_friend@his.domain.com
 -> From: me@somone.com
 -> Subject: Just having fun testing
 -> Message-Id: <20180803002453.066266@MYHOST>
 -> SOME-OTHER-HEADER: my friend! He can't see this in his email client
 ->
 -> This is body, my friend can see this
 ->
 -> .
<-  250 2.0.0 2983ksndafkn092 mail accepted for delivery
 -> QUIT
<-  221 2.3.0 mysmtpserver.com closing connection

请注意,如果 sendmail 函数的 toaddr 参数是 None,那么它将从消息 headers(BCCCCTo),然后将它们用作 envelope recipients。 这是 cpython source code.