使用Python SMTP库发送的邮件未送达收件人问题求助
解决Gmail发送邮件已显示发送但收件方未收到的问题
我之前也碰到过一模一样的Gmail邮件投递坑,这种“自己这边显示已发送,但对方连垃圾邮件箱都找不到”的情况确实闹心,咱们一步步来排查解决:
1. 优先检查「应用专用密码」是否正确
如果你给Gmail账号开启了两步验证(2FA),那脚本里绝对不能用日常登录的密码,必须用Google生成的「应用专用密码」。这是Gmail针对第三方脚本/应用的安全限制,普通密码会直接被拒绝投递。
生成方法:
- 登录你的Google账号 → 进入「安全」设置页
- 找到「应用专用密码」(需要先开启2FA才能看到)
- 选择「邮件」作为应用类型,随便填一个设备名称(比如“Python邮件脚本”)
- 把生成的16位密码替换脚本里的登录密码
2. 确认SMTP配置的安全性
脚本里的SMTP参数必须严格对应Gmail的要求,错一个都可能导致投递失败:
- SMTP服务器:
smtp.gmail.com - 端口选择:要么用587(配合TLS加密),要么用465(SSL加密)
正确的连接示例:
import smtplib from email.mime.multipart import MIMEMultipart # 配置 sender_email = "your-gmail-address@gmail.com" app_password = "your-app-specific-password" smtp_server = "smtp.gmail.com" # 用TLS(端口587)的写法 server = smtplib.SMTP(smtp_server, 587) server.starttls() # 必须启用加密 server.login(sender_email, app_password) # 或者用SSL(端口465)的写法 # server = smtplib.SMTP_SSL(smtp_server, 465) # server.login(sender_email, app_password)
3. 优化邮件内容避开反垃圾系统
Gmail的反垃圾规则非常严格,哪怕附件正确,邮件内容不符合要求也会被悄悄拦截:
- 邮件不能只有附件没有正文:至少写几句正常的内容,比如“您好,这是您需要的PDF文件,请查收。”
- 主题别太像垃圾邮件:避免全大写、大量感叹号、“免费”“促销”这类高频垃圾词汇
- 发件人邮箱必须和登录的Gmail账号一致:别伪造发件人地址,这会直接触发拦截
4. 查看Gmail的投递状态报告
登录你的Gmail,找到已发送里的那封“丢失”的邮件:
- 点击邮件右上角的三个点 → 选择「显示原始邮件」
- 在原始内容里搜索
Delivery Status Notification或者status:字段,里面会明确写投递失败的原因(比如对方服务器拒收、你的IP被拉黑、邮件内容被标记)
这一步是最关键的,能直接定位问题根源。
5. 排除收件方邮箱的问题
- 先手动给收件人发一封带PDF附件的邮件,看看能不能正常收到:如果手动也收不到,那问题出在对方邮箱(比如收件箱已满、域名解析错误、对方把你拉黑了)
- 如果手动能收到,对比手动发送和脚本发送的邮件原始内容,看有没有差异(比如邮件头的编码、附件的MIME类型)
6. 检查脚本的发送逻辑
- 别短时间内批量发送太多邮件:Gmail对新账号的日发送限制是500封,老账号是2000封,如果脚本一次性发几十上百封,会被限流,邮件会被延迟甚至直接拦截
- 确认附件的MIME类型设置正确:PDF文件必须指定
application/pdf,否则可能被识别为可疑文件。示例代码:
from email.mime.base import MIMEBase from email import encoders import os # 加载PDF附件 pdf_path = "path/to/your/file.pdf" part = MIMEBase("application", "pdf") part.set_payload(open(pdf_path, "rb").read()) encoders.encode_base64(part) # 设置附件文件名 part.add_header( "Content-Disposition", f"attachment; filename= {os.path.basename(pdf_path)}", ) # 把附件添加到邮件对象里 msg = MIMEMultipart() msg.attach(part)
如果试过上面所有方法还是不行,建议把「显示原始邮件」里的错误信息(打码敏感内容)或者脚本的关键部分贴出来,这样能更精准地定位问题。
内容的提问来源于stack exchange,提问作者Robin Edquist
相关产品推荐
相关产品推荐

