首页 > 解决方案 > smtplib.sendmail() 和 email.message["To"] 的区别?

问题描述

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


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

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

反之亦然,如果我将单个 email_id 传递给消息 [“To”] 并在 sendmail() 方法中传递多个 email_id,则电子邮件将发送给 sendmail() 方法中的所有收件人,但他们在标题部分。

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

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

见问题链接

标签: pythonemailsmtplib

解决方案


观察是由于 SMTP 是如何工作的,所以在电子邮件中通常有两种类型的“收件人”地址——一种是电子邮件发送到的实际电子邮件地址(envelope to),另一种是用户可以看到的地址电子邮件正文 ( header to)。

例如,假设您从某个电子邮件客户端向两个收件人发送了一封电子邮件,一个是密件抄送收件人,另一个是密件抄送收件人,那么envelope to两个发件人的地址将具有两个发件人的地址,但to header没有密件抄送收件人的地址。因此 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

请注意,如果函数的toaddr参数sendmailNone,那么它将从消息头(和)中提取所有收件人地址BCC,然后将它们用作。这是 cpython源代码CCToenvelope recipients


推荐阅读