smtplib.SMTPServerDisconnected: Connection unexpectedly closed
Django 2024-09-25 01:05:52 44

`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的初始化流程。

- 如果问题仍然存在,可能需要降低邮件发送频率,或增加超时时间。

0.036523s