Python中使用smtplib和Gmail的SMTP发送邮件时,为什么不能更改发件人地址?

When using smtplib and Gmail's SMTP in Python to send emails, why can you not change the sender address?

我目前正在尝试使用以下代码通过 smtplib 发送电子邮件:

import smtplib
import email.utils
from email.mime.text import MIMEText

smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login('username@gmail.com', 'pwd')
msg['Subject'] = "subject line"
msg['From'] = 'newusername@gmail.com'
msg['To'] = 'friend@gmail.com'
smtpserver.sendmail(sender, recipients, msg.as_string())

当我这样做时,收件人不是从 newusername@gmail.com 收到电子邮件,而是从 username@gmail.com 收到电子邮件,这是我用于身份验证的电子邮件。

有办法改变吗?

这是 gmail 和其他 public 邮件服务器中的一项有意安全功能,称为 SMTP AUTH

如果没有此功能,任何拥有 gmail 地址的人都可以冒充其他拥有 gmail 地址的人发送邮件。我可以发送一条消息声称是您发来的,而收件人无法知道这不是您发来的,您也无法证明这不是您发来的。

但这没关系,因为垃圾邮件发送者发送的带有您地址的电子邮件比您发送的电子邮件多得多,以至于电子邮件地址实际上毫无意义,整个电子邮件系统将崩溃。这几乎是 90 年代后期发生的事情。只有一个协调一致的运动要求在所有开放的提交服务器上进行 SMTP AUTH,包括将所有来自不符合要求的服务器的邮件列入黑名单(即使是那些使用 POP-before-SMTP、IMAP-before-SMTP、IP/MAC 验证的邮件,或 SMTP AUTH 的其他替代方案)设法防止垃圾邮件发送者破坏一切。

后来,添加了另一个 security/anti-spam 措施,称为 DKIM,gmail 也使用它:大多数服务器将丢弃任何未由原始服务器签名的邮件,表明服务器信任消息来自它说它来自的人。显然,当邮件实际上来自 username.1 时,gmail 不会证明它来自 newusername 而且,如果他们这样做了,管理人员其他服务器只会将 gmail 签名列入黑名单。


1.除非他们有理由相信 username 有权以 newusername 的身份发送邮件——公司邮件服务器有时 确实 具有这样的功能,允许您配置一些东西,例如,秘书可以从他老板的地址发送邮件而无需他老板的密码。