使用smtplib发送短信异常问题排查求助
故障排查思路
1. 修复邮件格式问题(解决内容为空+收件人显示密送)
你的代码直接把message传给sendmail,但SMTP要求邮件内容必须包含标准邮件头(From、To、Subject等),否则短信网关无法正确解析内容,且邮件客户端会将收件人默认放到密送栏。修改邮件内容格式:
# 构造符合SMTP标准的邮件内容 email_content = f"""From: {EMAIL} To: {recipient} Subject: SMS Message {message} """ # 发送时传入构造好的内容 server.sendmail(auth[0], recipient, email_content)
没有正确的邮件头是首次收到空短信的核心原因——网关无法识别纯文本内容为短信正文。
2. 验证Gmail SMTP认证权限
- 如果你的Gmail账号开启了两步验证,必须使用应用专用密码替代普通密码登录SMTP,普通密码会被拒绝。
- 若未开启两步验证,需在Google账号设置中开启“不太安全的应用访问”(注意:此选项已逐步淘汰,优先推荐应用专用密码)。
- 检查密码是否输入正确:你的代码里
PASSWORD包含空格,确认是否为实际密码的一部分,还是输入错误。
3. 确认运营商短信网关地址有效性
部分运营商的短信网关已更新:
- Sprint已并入T-Mobile,原
@messaging.sprintpcs.com可能失效,建议改用T-Mobile的网关@tmomail.net测试。 - 验证手机号+网关的格式是否正确:确保手机号是纯数字(无区号、无特殊字符,如
1234567890而非+11234567890,部分网关支持带区号,需测试)。
4. 排查运营商拦截/过滤规则
你直接用邮箱发送也收不到短信,大概率是运营商将你的邮件判定为垃圾信息:
- 更换一个不同的邮箱账号发送测试,排除当前邮箱被拉黑的可能。
- 简化短信内容(避免含链接、敏感词),测试基础文本是否能收到。
- 联系运营商客服,确认是否屏蔽了该类邮件转短信的通道。
5. 完善代码的错误处理与连接管理
- 代码中未关闭SMTP连接,可能导致后续会话异常,添加
server.quit()在发送后:server.sendmail(auth[0], recipient, email_content) server.quit() - 添加异常捕获,排查发送过程中的隐藏错误:
try: server = smtplib.SMTP("smtp.gmail.com", 587) server.starttls() server.login(auth[0], auth[1]) # 构造邮件内容并发送 server.quit() except Exception as e: print(f"发送失败: {str(e)}")
6. 测试邮件发送的基础连通性
- 先测试用该邮箱给普通邮箱地址发送邮件,确认SMTP服务正常。
- 若普通邮件能发送,再测试给
手机号+网关地址发送,查看收件邮箱的垃圾邮件文件夹,是否被归类为垃圾。
内容的提问来源于stack exchange,提问作者Prince M
相关产品推荐
相关产品推荐

