python smtplib.SMTPDataError: (554

本文介绍了解决邮件发送过程中出现的554错误的方法,指出未正确设置发件人信息可能导致该问题。同时强调在使用MIMEText时,中文内容的参数应设置为'plain'以确保正常显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

只赋值了msg['Subject'], 没有赋值msg['From'], msg['To'],导致出现554情况,更改了后就好了。

注意MIMEText初始化的时候,中文的第二个参数要用'plain',我用'text',中文就显示不出来。

msg['From'] 中人名为Tim,会和下面对应起来。

转载于:https://www.cnblogs.com/yhcreak/p/5292869.html

<think>我们遇到的问题是在使用Pythonsmtplib发送邮件时,出现了`smtplib.SMTPServerDisconnected: Connection unexpectedly closed`错误。这个错误通常发生在与SMTP服务器的连接意外关闭时。可能的原因包括: 1. 网络连接问题。 2. SMTP服务器设置了连接超时,而客户端在超时时间内没有活动。 3. 服务器因为某些原因(如认证失败、发送频率过高等)主动断开连接。 4. 防火墙或杀毒软件中断了连接。 解决方案: 1. 检查网络连接:确保可以访问SMTP服务器。 2. 检查SMTP服务器设置:确认服务器地址、端口、加密方式(SSL/TLS)是否正确。 3. 检查认证信息:用户名和密码是否正确,有些服务器要求使用授权码而不是登录密码。 4. 增加重试机制:在代码中加入重试逻辑,以应对网络波动或服务器临时问题。 5. 减少连接时间:在发送邮件前建立连接,发送后立即关闭,避免长时间保持连接。 6. 分批次发送:如果需要发送大量邮件,分批次发送并在每批次之间重新建立连接。 以下是一个使用smtplib发送邮件的示例代码,其中包含了重试机制和异常处理: ```python import smtplib from email.mime.text import MIMEText from email.utils import formataddr import time def send_email_with_retry(subject, body, to_email, max_retries=3): # 发件人信息 sender = 'your_email@example.com' sender_name = 'Your Name' password = 'your_password' # 或者使用授权码 # 邮件内容设置 msg = MIMEText(body, 'plain', 'utf-8') msg['Subject'] = subject msg['From'] = formataddr((sender_name, sender)) msg['To'] = to_email retry_count = 0 while retry_count < max_retries: try: # 使用SMTP_SSL连接(如果是SSL端口) server = smtplib.SMTP_SSL('smtp.example.com', 465) # 根据你的邮件服务商修改 # 如果是TLS,使用以下方式: # server = smtplib.SMTP('smtp.example.com', 587) # server.starttls() server.login(sender, password) server.sendmail(sender, [to_email], msg.as_string()) server.quit() print("邮件发送成功") return True except smtplib.SMTPServerDisconnected as e: print(f"连接断开,重试中... ({retry_count+1}/{max_retries})") retry_count += 1 time.sleep(5) # 等待5秒后重试 except Exception as e: print(f"发送邮件失败: {e}") break return False # 使用示例 send_email_with_retry("测试邮件", "这是一封测试邮件", "recipient@example.com") ``` 代码解释: 1. 使用`SMTP_SSL`连接SSL端口(如465),如果是TLS则使用587端口并调用`starttls()`方法。 2. 在发送邮件时,如果遇到`smtplib.SMTPServerDisconnected`异常,将进行最多3次重试,每次重试间隔5秒。 3. 其他异常(如认证失败、网络问题等)会被捕获并打印错误信息,然后退出重试循环。 注意事项: - 替换示例中的发件人邮箱、密码、SMTP服务器地址和端口。 - 对于Gmail,可能需要允许“不够安全的应用”访问,或者使用OAuth2认证。 - 如果使用QQ邮箱、163邮箱等,注意使用正确的授权码(不是邮箱登录密码)。 如果问题仍然存在,建议检查SMTP服务器的日志或联系邮件服务提供商。 §§相关问题§§: 1. 如何解决smtplib发送邮件时的认证错误? 2. 如何使用Python发送带附件的邮件? 3. 如何配置邮件服务器以允许通过SMTP发送邮件? 4. 如何使用OAuth2认证代替用户名和密码发送邮件?</think>### 解决 `smtplib.SMTPServerDisconnected: Connection unexpectedly closed` 错误 此错误通常发生在 SMTP 服务器主动断开连接时,常见原因包括: 1. 认证信息错误(用户名/密码) 2. 服务器安全策略限制(如防火墙、IP 限制) 3. 服务器要求加密连接(TLS/SSL) 4. 发送频率过高触发反垃圾机制 5. 服务器超时断开空闲连接 #### 解决方案代码(Python) ```python import smtplib from email.mime.text import MIMEText import ssl def send_email(): # 配置信息(替换为实际值) SMTP_SERVER = "smtp.example.com" # 如 smtp.gmail.com PORT = 587 # 或 465(SSL) SENDER_EMAIL = "your_email@example.com" PASSWORD = "your_app_password" # 注意:使用授权码而非登录密码 RECEIVER_EMAIL = "receiver@example.com" # 创建邮件内容 message = MIMEText("这是邮件正文") message["Subject"] = "测试邮件" message["From"] = SENDER_EMAIL message["To"] = RECEIVER_EMAIL try: # 创建安全连接 context = ssl.create_default_context() # 根据端口选择连接方式 if PORT == 465: with smtplib.SMTP_SSL(SMTP_SERVER, PORT, context=context) as server: server.login(SENDER_EMAIL, PASSWORD) server.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, message.as_string()) else: with smtplib.SMTP(SMTP_SERVER, PORT) as server: server.starttls(context=context) # 启用加密 server.login(SENDER_EMAIL, PASSWORD) server.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, message.as_string()) print("邮件发送成功!") except smtplib.SMTPException as e: print(f"邮件发送失败: {e}") # 执行发送 send_email() ``` ### 关键解决步骤说明: 1. **使用正确的端口和加密方式**: - **587端口**:先建立普通连接,再通过 `starttls()` 升级加密 - **465端口**:直接使用 `SMTP_SSL()` 建立加密连接 - 避免使用不安全的25端口 2. **密码注意事项**: - Gmail/QQ等邮箱需使用**应用专用密码**(非登录密码) - 在邮箱设置中开启"允许不够安全的应用"(仅测试用) 3. **连接管理**: - 使用 `with` 语句确保连接自动关闭 - 添加 `context=ssl.create_default_context()` 强制证书验证 4. **错误处理**: - 捕获 `smtplib.SMTPException` 处理所有SMTP相关异常 - 打印具体错误信息帮助诊断 ### 常见服务商配置参考: | 服务商 | SMTP服务器 | 端口 | 加密方式 | |--------|------------|------|----------| | Gmail | smtp.gmail.com | 587 | TLS | | Outlook| smtp.office365.com | 587 | TLS | | QQ邮箱 | smtp.qq.com | 465 | SSL | | 163邮箱| smtp.163.com | 465 | SSL |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值