diff --git a/app.py b/app.py index 826722b..075eea9 100644 --- a/app.py +++ b/app.py @@ -8,6 +8,7 @@ import smtplib from datetime import datetime, timedelta from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart +from email.utils import formatdate from functools import wraps from flask import ( @@ -155,15 +156,73 @@ def send_email(to_email, subject, html_content): smtp_user = os.getenv('SMTP_USER', '') smtp_pass = os.getenv('SMTP_PASS', '') + print(f'[邮件发送] 准备发送邮件到: {to_email}') + print(f'[邮件发送] SMTP服务器: {smtp_host}:{smtp_port}') + print(f'[邮件发送] 发件人: {smtp_user}') + + if not smtp_user or not smtp_pass: + raise ValueError('SMTP_USER 或 SMTP_PASS 未配置') + msg = MIMEMultipart('alternative') - msg['From'] = f'"验证码" <{smtp_user}>' + msg['From'] = smtp_user msg['To'] = to_email msg['Subject'] = subject + msg['Date'] = formatdate(localtime=True) msg.attach(MIMEText(html_content, 'html', 'utf-8')) - with smtplib.SMTP_SSL(smtp_host, smtp_port) as server: + # 尝试SSL连接(端口465) + try: + print(f'[邮件发送] 尝试SSL连接 (端口{smtp_port})...') + server = smtplib.SMTP_SSL(smtp_host, smtp_port, timeout=30) + server.set_debuglevel(0) + server.ehlo() + print(f'[邮件发送] SSL连接成功,正在登录...') server.login(smtp_user, smtp_pass) - server.sendmail(smtp_user, to_email, msg.as_string()) + print(f'[邮件发送] 登录成功,正在发送邮件...') + server.sendmail(smtp_user, [to_email], msg.as_string()) + server.quit() + print(f'[邮件发送] 邮件发送成功到 {to_email}') + return + except Exception as e: + print(f'[邮件发送] SSL方式失败: {e}') + + # 尝试STARTTLS连接(端口587) + try: + print(f'[邮件发送] 尝试STARTTLS连接 (端口587)...') + server = smtplib.SMTP(smtp_host, 587, timeout=30) + server.set_debuglevel(0) + server.ehlo() + server.starttls() + server.ehlo() + print(f'[邮件发送] STARTTLS连接成功,正在登录...') + server.login(smtp_user, smtp_pass) + print(f'[邮件发送] 登录成功,正在发送邮件...') + server.sendmail(smtp_user, [to_email], msg.as_string()) + server.quit() + print(f'[邮件发送] 邮件发送成功到 {to_email}') + return + except Exception as e: + print(f'[邮件发送] STARTTLS(587)方式失败: {e}') + + # 尝试STARTTLS连接(端口25) + try: + print(f'[邮件发送] 尝试STARTTLS连接 (端口25)...') + server = smtplib.SMTP(smtp_host, 25, timeout=30) + server.set_debuglevel(0) + server.ehlo() + server.starttls() + server.ehlo() + print(f'[邮件发送] STARTTLS连接成功,正在登录...') + server.login(smtp_user, smtp_pass) + print(f'[邮件发送] 登录成功,正在发送邮件...') + server.sendmail(smtp_user, [to_email], msg.as_string()) + server.quit() + print(f'[邮件发送] 邮件发送成功到 {to_email}') + return + except Exception as e: + print(f'[邮件发送] STARTTLS(25)方式失败: {e}') + + raise Exception(f'所有邮件发送方式均失败,请检查SMTP配置和网络连接') def get_current_user(): return session.get('user')