AWS EC2部署Web应用后SMTP重置邮件发送失败求助
AWS EC2部署Web应用后SMTP重置邮件发送失败求助
兄弟,我仔细看了你的问题和代码,本地跑完全正常但部署到EC2后直接触发最外层的异常,大概率是EC2环境配置或者AWS SES的权限/模式问题,咱们一步步来排查和解决:
一、先补全最关键的SMTP凭证
你的代码里username和password是空字符串!这绝对是核心问题:
username="" password = ""
AWS SES的SMTP服务需要使用SES控制台生成的专属SMTP凭证,不是你的AWS账号密码,也不是邮箱的登录密码。你得登录AWS控制台进入SES服务,找到「SMTP设置」板块,点击「创建我的SMTP凭证」,生成后把这组用户名和密码填到上面的变量里。
二、检查EC2安全组的出站规则
你用的是587端口(STARTTLS),得确保EC2实例的安全组出站规则允许TCP 587端口的流量:
- 可以先临时设置成允许所有出站流量(0.0.0.0/0,TCP所有端口)来测试,如果能发邮件了,再缩小范围到只允许访问
email-smtp.us-east-1.amazonaws.com的587端口。
三、确认AWS SES的账号状态
新注册的AWS SES账号默认处于沙盒模式,这个模式有严格限制:
- 发件邮箱(代码里的
from_)必须在SES控制台完成验证; - 收件邮箱也必须是SES里验证过的邮箱(不能给任意未验证邮箱发邮件);
如果你的应用需要给任意用户发重置邮件,得提交申请移出沙盒模式。
四、优化异常捕获,定位具体错误
你现在用的except:会捕获所有异常,根本不知道到底是认证失败、连不上服务器还是其他问题。建议修改成捕获具体异常并打印错误信息:
# 替换原来的except块 except smtplib.SMTPException as e: print(f"SMTP发送失败详情: {str(e)}") msg = 'We could not send you the link' except Exception as e: print(f"其他未知错误: {str(e)}") msg = 'We could not send you the link'
部署到EC2后,查看应用的日志或者控制台输出,就能知道具体的错误原因(比如535 Authentication Credentials Invalid就是凭证错了,Connection refused就是网络连不上)。
五、排查EC2的网络连通性
如果你的EC2在VPC的私有子网里,得确保它能访问外网:
- 登录EC2实例,执行命令测试连通性:
telnet email-smtp.us-east-1.amazonaws.com 587- 如果显示
Connected to email-smtp.us-east-1.amazonaws.com,说明网络没问题; - 如果连不上,就得检查VPC的NAT网关配置,或者子网的路由表是否允许出站访问互联网。
- 如果显示
六、代码小优化:不要硬编码敏感信息
把SMTP用户名、密码、发件邮箱这些敏感信息改成从环境变量读取,既安全又方便部署修改:
import os username = os.getenv('SES_SMTP_USERNAME') password = os.getenv('SES_SMTP_PASSWORD') from_ = os.getenv('SES_FROM_EMAIL')
部署到EC2时,可以通过环境变量配置、EC2参数存储或者配置文件来设置这些值。
备注:内容来源于stack exchange,提问作者chryzz thetics
相关产品推荐
相关产品推荐

