`SMTPServerDisconnected: Connection unexpectedly closed` 错误通常与以下几种情况有关:
1. 服务器连接超时或服务器拒绝连接:可能是邮件服务器(如 `smtp.qq.com`)未正确响应,或者由于频繁的连接尝试,服务器主动断开连接。
2. 邮箱账号的SMTP配置问题:可能是发件邮箱未开启 SMTP 服务,或者你使用的密码/授权码不正确。
3. TLS/SSL问题:SMTP服务器使用了 TLS/SSL 加密,但未正确协商或初始化。
解决方案:
1. 检查SMTP服务的开启情况
- 确保你的QQ邮箱已经开启了 SMTP服务。
- 检查你是否使用了正确的 授权码,而不是密码。QQ邮箱需要使用授权码作为密码。
2. 调整代码顺序(确保安全连接)
可以尝试将 `starttls()` 和其他初始化流程的顺序调整,以确保 TLS 加密正确初始化。
def send_email(file_path, file_name, to_email): """发送邮件,附带备份文件""" msg = MIMEMultipart() msg['From'] = EMAIL_USER msg['To'] = to_email msg['Subject'] = f'{file_name} Backup' part = MIMEBase('application', 'octet-stream') with open(file_path, 'rb') as file: part.set_payload(file.read()) encoders.encode_base64(part) part.add_header('Content-Disposition', f'attachment; filename={file_name}') msg.attach(part) try: # 使用smtplib发送邮件 with smtplib.SMTP(EMAIL_HOST, EMAIL_PORT, timeout=10) as server: server.ehlo() # 向SMTP服务器发送初始连接请求 server.starttls() # 启用TLS加密 server.ehlo() # 再次确认连接 server.login(EMAIL_USER, EMAIL_PASSWORD) # 登录邮箱 server.sendmail(EMAIL_USER, to_email, msg.as_string()) # 发送邮件 print(f"邮件已成功发送到 {to_email}") except smtplib.SMTPException as e: print(f"邮件发送失败: {e}")
3. 增加超时时间
你可以为 `SMTP` 连接增加一个超时时间(例如 `timeout=10`),以防服务器响应过慢导致连接断开。
4. 调整发件频率
如果频繁发送邮件,QQ邮箱的SMTP服务器可能会短时间内拒绝进一步的请求。可以考虑增加间隔时间,避免短时间内发送过多邮件。
5. 测试SSL连接
QQ邮箱的 SMTP 服务器也可以通过 SSL 端口(465)连接。你可以尝试直接使用 SSL 进行连接,方法如下:
def send_email(file_path, file_name, to_email): """通过 SSL 连接发送邮件""" msg = MIMEMultipart() msg['From'] = EMAIL_USER msg['To'] = to_email msg['Subject'] = f'{file_name} Backup' part = MIMEBase('application', 'octet-stream') with open(file_path, 'rb') as file: part.set_payload(file.read()) encoders.encode_base64(part) part.add_header('Content-Disposition', f'attachment; filename={file_name}') msg.attach(part) try: # 使用SSL连接发送邮件 with smtplib.SMTP_SSL(EMAIL_HOST, 465, timeout=10) as server: server.login(EMAIL_USER, EMAIL_PASSWORD) server.sendmail(EMAIL_USER, to_email, msg.as_string()) print(f"邮件已成功发送到 {to_email}") except smtplib.SMTPException as e: print(f"邮件发送失败: {e}")
总结:
- 确保邮箱已正确开启SMTP服务,并使用正确的授权码。
- 尝试使用 `SMTP_SSL` 端口进行加密连接,或者增加TLS的初始化流程。
- 如果问题仍然存在,可能需要降低邮件发送频率,或增加超时时间。