45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
# 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")
|