# smtp_test.py import os, smtplib, ssl from email.message import EmailMessage from dotenv import load_dotenv load_dotenv(".env") SMTP_HOST = os.getenv("SMTP_HOST", "smtp.163.com") SMTP_USER = os.getenv("SMTP_USER") # 必须是完整邮箱 SMTP_PASS = os.getenv("SMTP_PASSWORD") # 163“客户端授权码” FROM = os.getenv("MAIL_FROM", SMTP_USER) # 建议与 SMTP_USER 相同 TO = SMTP_USER # 先给自己发一封 assert SMTP_USER and SMTP_PASS, "缺少 SMTP_USER/SMTP_PASSWORD 环境变量" def make_msg(): m = EmailMessage() m["Subject"] = "SMTP 测试 - 465/587" m["From"] = FROM m["To"] = TO m.set_content("hello from smtp_test.py") return m ctx = ssl.create_default_context() # 先 465/SSL try: print(">>> try SSL 465") with smtplib.SMTP_SSL(SMTP_HOST, 465, context=ctx, timeout=20) as s: s.set_debuglevel(1) s.login(SMTP_USER, SMTP_PASS) s.send_message(make_msg()) print("OK via 465/SSL") except Exception as e: print("465 failed:", e) print(">>> fallback STARTTLS 587") with smtplib.SMTP(SMTP_HOST, 587, timeout=20) as s: s.set_debuglevel(1) s.ehlo() s.starttls(context=ctx) s.ehlo() s.login(SMTP_USER, SMTP_PASS) s.send_message(make_msg()) print("OK via 587/STARTTLS")