Python SMTPLib邮件脚本无法运行,求原因及修复方案
问题原因及修复方案
核心问题分析
你的脚本运行报错smtplib.SMTPServerDisconnected: Connection unexpectedly closed,主要由以下几个问题导致:
- 邮件主题未正确赋值:代码中
em['Subject']这行仅读取属性,未设置值,缺少主题字段可能触发服务器过滤机制。 - 密码格式错误:密码字符串包含空格(
"corr ectp assw ords"),这不是有效的Gmail密码或应用专用密码。 - Gmail权限限制:Gmail默认禁止普通密码通过SMTP登录,需使用应用专用密码(需开启两步验证),或临时开启"不太安全的应用访问"(不推荐)。
修复步骤
1. 修正邮件主题赋值
将em['Subject']修改为赋值语句:
em['Subject'] = subject
2. 修复密码问题
- 若账号已开启两步验证,生成应用专用密码(在Google账号安全设置中操作),替换掉带空格的错误密码,确保密码无空格。
- 未开启两步验证的话,可临时开启"不太安全的应用访问"(存在安全风险,官方已逐步淘汰该选项,优先推荐应用专用密码)。
3. 完整修正后的代码
from email.message import EmailMessage import ssl import smtplib email_sender = 'correctemail@gmail.com' # 替换为你的应用专用密码或正确无空格密码 email_password = "your_app_specific_password" email_receiver = 'throwaway@email.com' subject = 'Written by Code!' body = """ This was written by my program! Tell me if it worked. """ em = EmailMessage() em['From'] = email_sender em['To'] = email_receiver em['Subject'] = subject # 修正:添加主题赋值 em.set_content(body) context = ssl.create_default_context() with smtplib.SMTP_SSL('smtp.gmail.com', 465, context) as smtp: smtp.login(email_sender, email_password) smtp.sendmail(email_sender, email_receiver, em.as_string())
4. 备选连接方案(若端口465被屏蔽)
部分网络环境可能屏蔽465端口,可尝试使用SMTP_TLS方式(端口587):
with smtplib.SMTP('smtp.gmail.com', 587) as smtp: smtp.starttls(context=context) smtp.login(email_sender, email_password) smtp.sendmail(email_sender, email_receiver, em.as_string())
内容的提问来源于stack exchange,提问作者Bird
相关产品推荐
相关产品推荐

