You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:27:50