smtplib.sendmail()和email.message [“ To”]之间的区别?

时间:2018-08-02 18:41:27

标签: python email smtplib

我一直在测试我的代码以将电子邮件发送给多个收件人,但是遇到了一个奇怪的发现:


 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还是。

反之亦然,如果我在sendmail()方法中将单个email_id传递给message [“ To”]和多个email_id,则电子邮件将通过sendmail()方法发送给所有收件人,但他们只会看到一个标题部分中的ID。

所以现在我对导致这种奇怪行为的幕后到底发生了什么感到困惑。仅将其电子邮件ID传递到message [“ To”]部分中,不会将我的email_id我未传递给sendmail()方法的收件人如何接收电子邮件。

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

Seen Question link

1 个答案:

答案 0 :(得分:0)

观察是由于SMTP的工作原理,因此在电子邮件中通常有两种“收件人”地址-一种是将电子邮件发送到的实际电子邮件地址(envelope to),另一种是是用户可以在电子邮件正文(header to)中看到的内容。

例如,假设您从某个电子邮件客户端向两个收件人发送了一封电子邮件,一个作为密件抄送收件人,另一个作为CC收件人,那么envelope to将具有两个发件人的地址,而{{1} }将没有密件抄送收件人的地址。因此,SMTP服务器(MTA邮件传输代理)将看到该电子邮件是同时发送给两个收件人的,但是当收件人接收到电子邮件时,他们将看到该电子邮件仅发送给了一个收件人。

这是一个示例SMTP交易-

to header

请注意,如果=== 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,{{ 1}}和BCC),然后将它们用作CC。 这是cpython source code