如何在Python中通过SMTP实现多发件人发送邮件?
问题原因
你碰到的问题本质是:像Gmail这类主流SMTP服务器,不允许在同一个连接会话里用不同账号重复认证。你第二次调用s.login()时,服务器根本没切换到第二个发件人账号,所以第二封邮件还是用第一个认证的账号发出去的。
可行解决方案
1. 每个发件人单独创建SMTP连接
这是最稳妥的方案,所有SMTP服务器都支持:
import smtplib # 发送第一封邮件 with smtplib.SMTP('smtp.gmail.com', 587) as smtp_conn: smtp_conn.starttls() smtp_conn.login('Sender 1 Email','Sender 1 Password') smtp_conn.sendmail('Sender 1 Email','Receiver 1 Email', email1.as_string()) # 发送第二封邮件 with smtplib.SMTP('smtp.gmail.com', 587) as smtp_conn: smtp_conn.starttls() smtp_conn.login('Sender 2 Email','Sender 2 Password') smtp_conn.sendmail('Sender 2 Email','Receiver 2 Email', email2.as_string())
用with语句会自动帮你处理连接的关闭,不用手动调用quit()。
2. 特殊服务器的多账号支持(仅小众场景)
极少数SMTP服务器允许先登出再重新认证,但Gmail绝对不支持这种操作。如果你的服务器支持,你需要先发送QUIT命令(对应smtplib的s.quit()),但这会直接关闭连接,之后还是得重新建立连接再登录新账号——本质和第一种方案没区别。
关于SMTP的登出方法
smtplib里没有单独的“登出”方法:
s.quit():发送SMTP协议的QUIT命令,然后关闭连接s.close():直接关闭套接字,不发送QUIT命令
但不管用哪种,要切换发件人账号,都必须重新建立新的SMTP连接并重新认证。
内容的提问来源于stack exchange,提问作者phinnjs
相关产品推荐
相关产品推荐

