
google 已停用低安全性应用的 gmail smtp 访问,本文详解 kivy 中发送邮件的合规替代方案,包括启用 app password、切换至 outlook/protonmail smtp,以及使用 sendgrid 等第三方服务,并提供可直接运行的安全代码示例。
google 已停用低安全性应用的 gmail smtp 访问,本文详解 kivy 中发送邮件的合规替代方案,包括启用 app password、切换至 outlook/protonmail smtp,以及使用 sendgrid 等第三方服务,并提供可直接运行的安全代码示例。
在 Kivy 应用中集成邮件功能时,依赖传统账号密码直连 SMTP(如 Gmail 的 smtp.gmail.com)已不再可行——自 2022 年起,Google 全面弃用“允许不够安全的应用访问”选项,强制要求 OAuth 2.0 或更安全的 App Password 机制。所幸,这并非终点,而是转向更规范、更可靠邮件发送实践的起点。
✅ 推荐方案一:Gmail + App Password(最简迁移路径)
前提:你的 Google 账户已开启两步验证(2-Step Verification)。
操作步骤:
- 访问 https://www.php.cn/link/e9947b970456f26dd9fe5f427ded41fa
- 在「2-Step Verification」下点击「App passwords」→ 生成新密码(应用选择「Mail」,设备选「Other」并命名如 kivy-app)
- 复制生成的 16 位密码(形如 abcd efgh ijkl mnop),切勿使用原始账户密码
✅ 正确代码示例(适配 Kivy,使用 smtplib.SMTP_SSL + App Password):
import smtplib
from email.message import EmailMessage
def send_validation_email(recipient: str, code: str):
# 配置信息(请替换为你的实际值)
sender = "your.email@gmail.com" # 启用两步验证的 Gmail
app_password = "abcd efgh ijkl mnop" # 从 Google 安全页获取的 App Password
smtp_server = "smtp.gmail.com"
smtp_port = 465 # 推荐使用 SMTP_SSL 端口
# 构建邮件
msg = EmailMessage()
msg["From"] = sender
msg["To"] = recipient
msg["Subject"] = "【验证】您的六位验证码"
msg.set_content(f"您的验证码是:{code}。5 分钟内有效。")
try:
with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
server.login(sender, app_password)
server.send_message(msg)
print("✅ 邮件发送成功")
return True
except Exception as e:
print(f"❌ 邮件发送失败:{e}")
return False
# 在 Kivy 中调用(例如按钮回调)
# send_validation_email("user@example.com", "123456")
⚠️ 注意事项:
- 不要在代码中硬编码邮箱和密码;推荐通过环境变量(os.getenv("GMAIL_USER"))或配置文件(加密存储)管理敏感信息;
- Kivy 应用打包为 .exe 或 Android APK 时,需确保 smtplib 和 email 模块被正确包含(Buildozer/Packaging 工具默认支持);
- Gmail 对免费账户有发送频率限制(约 500 封/天),超出需升级 G Suite 或改用专业服务。
✅ 推荐方案二:其他主流 SMTP 服务商(免 OAuth)
| 服务商 | SMTP 服务器 | 端口(SSL) | 是否需 App Password / 应用密钥 | 备注 |
|---|---|---|---|---|
| Outlook / Hotmail | smtp-mail.outlook.com | 587(STARTTLS)或 465(SSL) | ✅ 启用两步验证后生成「应用密码」 | 免费账户可用,收发稳定 |
| ProtonMail(需 Bridge) | smtp.protonmail.com | 587 | ✅ 使用 ProtonMail Bridge 生成 SMTP 凭据 | 强隐私导向,需额外安装 Bridge |
| Yahoo Mail | smtp.mail.yahoo.com | 587 | ✅ 启用两步验证 → 生成「App Password」 | 解决“Too many attempts”问题的关键是先完成验证再生成密码 |
示例(Outlook):
# 替换以下三行即可复用上述函数逻辑 sender = "you@outlook.com" app_password = "your-outlook-app-password" smtp_server, smtp_port = "smtp-mail.outlook.com", 587 # 注意:Outlook 推荐使用 smtplib.SMTP(非 SSL),再调用 .starttls()
✅ 推荐方案三:云邮件服务(高可靠性 & 可扩展)
当应用用户量增长或需追踪送达率、模板化内容时,建议迁移到专业邮件平台:
- SendGrid(免费层 100 邮/天):提供 API Key + REST 接口,Kivy 中用 requests.post() 调用,无需处理 SMTP 连接;
- Mailgun:支持域验证、日志分析,适合企业级通知;
- Resend(新兴轻量服务):API 简洁,Python SDK 官方支持良好。
SendGrid 快速示例:
pip install resend
import resend
resend.api_key = "re_..." # 从 dashboard 获取
params = {
"from": "onboarding@yourdomain.com",
"to": ["user@example.com"],
"subject": "验证码",
"html": f"<p>您的验证码:<b>{code}</b></p>"
}
resend.Emails.send(params)
总结与最佳实践
- ❌ 避免使用明文密码、禁用“不安全应用”开关;
- ✅ 优先采用 App Password + SMTP_SSL/TLS;
- ✅ 敏感凭证交由环境变量或密钥管理服务(如 keyring);
- ✅ 在 Kivy 中异步发送邮件(如 threading.Thread 或 asyncio),避免阻塞 UI;
- ✅ 增加重试机制与错误反馈(如 Toast 提示“邮件发送中…”+“发送失败,请检查网络”)。
无论选择哪条路径,核心原则不变:安全性优先、可维护性优先、用户体验优先。邮件虽小,却是信任链的关键一环——合规发送,才是对用户负责的真正开始。











