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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 03:19:40