python - 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:我已经看到了下面的答案,虽然它详细介绍了语法,但我只是询问与上述问题有关的奇怪行为
解决方案
观察是由于 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
参数sendmail
是None
,那么它将从消息头(和)中提取所有收件人地址BCC
,然后将它们用作。这是 cpython源代码。CC
To
envelope recipients
推荐阅读
- python - 基本 Python 循环的问题
- python - NamedTuple 对象映射到 CSV 文件
- javascript - 如何为 HERE Javascript API 设置 HERE Base Map Tiles API?
- c# - 为从 Excel 文件导入的每两列分配 ID
- javascript - 无需创建模型即可发布 2 个字符串的最简单方法
- java - Android 应用可以在手机上运行,但不能在 AVD 上运行
- c++ - 使用c头文件时,是否需要将“struct”放在c++中的struct实例前面?
- python - 使用 ATLAS/LAPACK 支持构建 numpy
- java - 我可以使用 Java xunit 测试用 C# 编码的应用程序吗?
- python - 如何从 json 值中抓取属性