
PythonAnywhere 免费账户默认禁止访问大多数外部 SMTP 服务器(仅允许 Gmail),导致使用 smtp.seznam.cz 等非 Gmail 邮件服务时连接失败;升级付费计划或改用 Gmail SMTP 是可靠解决路径。
pythonanywhere 免费账户默认禁止访问大多数外部 smtp 服务器(仅允许 gmail),导致使用 `smtp.seznam.cz` 等非 gmail 邮件服务时连接失败;升级付费计划或改用 gmail smtp 是可靠解决路径。
在 PythonAnywhere 上部署邮件发送脚本时,许多开发者会遇到“本地运行正常、线上却静默失败”的问题——这并非代码缺陷,而是平台策略限制所致。PythonAnywhere 的免费账户(Beginner plan)为保障资源公平使用,明确限制了出站网络访问(outbound Internet access):仅允许连接 Google 的 SMTP 服务器(smtp.gmail.com),其他如 smtp.seznam.cz、smtp.qq.com、smtp.163.com 等均被防火墙拦截,即使认证信息正确,smtplib.SMTP_SSL() 也会因连接超时或拒绝而抛出异常(如 socket.timeout 或 ConnectionRefusedError),而非返回清晰的认证错误。
✅ 正确做法:适配 PythonAnywhere 免费版约束
若坚持使用免费账户,唯一合规方案是切换至 Gmail SMTP,并满足以下前提:
- 使用已开启「两步验证」的 Gmail 账号;
- 为该账号生成专用的「应用专用密码(App Password)」(而非账户登录密码);
- SMTP 配置严格遵循 Gmail 官方要求:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# ✅ Gmail 配置(免费账户唯一支持)
sender_email = "yourname@gmail.com" # 替换为你的 Gmail
receiver_email = ["recipient@example.com"]
app_password = "abcd efgh ijkl mnop" # 16位应用专用密码(空格可省略)
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email[0]
message["Subject"] = "PythonAnywhere 测试邮件"
html_body = """<html><body><p>此邮件成功发送自 PythonAnywhere 免费账户 ✅</p></body></html>"""
message.attach(MIMEText(html_body, "html"))
# ✅ 必须使用 Gmail 官方端口与协议
try:
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login(sender_email, app_password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("✅ 邮件发送成功")
except Exception as e:
print(f"❌ 发送失败:{e}")⚠️ 关键注意事项:
- 不要尝试绕过限制(如代理、DNS 劫持、端口扫描等),PythonAnywhere 会主动阻断非常规连接;
- app_password 必须通过 Google 账户安全设置页 生成,普通密码将触发 SMTPAuthenticationError;
- 免费账户对 Gmail 的调用频率无显式限制,但建议添加 time.sleep(1) 避免高频触发风控;
- 若业务需多邮箱支持(如企业域名邮箱)、更高并发或附件上传,应升级至 Hobby($5/月)或 Professional 计划——这些套餐提供完全开放的出站网络权限,可自由连接任意 SMTP 服务。
? 总结:PythonAnywhere 的免费策略本质是「功能可用性优先于灵活性」。理解其边界后,选择 Gmail 适配是最高效、零成本的落地路径;而长期项目则建议将网络访问需求纳入架构选型评估,避免后期迁移成本。










