
smtp错误码421表示“service not available”,即目标邮件服务器暂时不可用,常见于连接超限、服务过载、协议异常或安全策略拦截,属临时性错误(4xx类),通常重试可恢复。
smtp错误码421表示“service not available”,即目标邮件服务器暂时不可用,常见于连接超限、服务过载、协议异常或安全策略拦截,属临时性错误(4xx类),通常重试可恢复。
SMTP错误码421是邮件开发中高频出现的临时性服务拒绝错误,其标准响应为 421 Service not available, closing transmission channel。它并非客户端代码缺陷的直接体现,而是收件方(或中继)SMTP服务器主动中断连接的信号——这意味着问题根因在网络链路、服务端策略或协议合规性层面,而非单纯配置错误。
常见成因与对应场景
并发连接超限
邮件服务商(如网易163、腾讯企业邮箱、Office 365)对单IP的并发SMTP连接数设有限制。若您的Python脚本未复用连接、或在循环中高频新建SMTP_SSL()实例,极易触发 421 Too many concurrent SMTP connections from this IP address。协议违规与数据格式异常
某些服务器(如126邮箱)对原始数据流敏感:长二进制附件若未按RFC规范插入换行符(\r\n),会返回 421 Read data from client error;而频繁发送格式不规范的命令(如缺少MAIL FROM、RCPT TO顺序错误)则可能触发 421 Too many protocol errors (6), closing transmission channel。安全策略拦截
网易、QQ等国内邮箱将突发大量外发邮件(尤其含相似内容/相同收件人列表)识别为垃圾邮件行为,直接返回 421 Sender is rejected —— 此时非技术故障,而是账号被临时限流。服务端维护或资源过载
收件方服务器正在重启、负载过高,或DNS解析指向了已下线的MX节点,均会导致 421 Service not available。
Python实践:健壮化发送逻辑(含重试与连接复用)
以下为推荐的生产级发送模板,兼顾容错性与协议合规:
import smtplib
import time
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.utils import formataddr
def send_email_safely(
smtp_host: str,
smtp_port: int,
sender: str,
password: str,
recipients: list,
subject: str,
body: str,
max_retries: int = 3,
retry_delay: float = 2.0
):
msg = MIMEMultipart()
msg['From'] = formataddr(('Your App', sender))
msg['To'] = ', '.join(recipients)
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain', 'utf-8'))
for attempt in range(max_retries):
try:
# 复用连接:避免每封邮件新建SSL会话
with smtplib.SMTP_SSL(smtp_host, smtp_port, timeout=15) as server:
server.login(sender, password)
server.sendmail(sender, recipients, msg.as_string())
print(f"✅ Email sent successfully to {len(recipients)} recipients.")
return True
except smtplib.SMTPResponseException as e:
if e.smtp_code == 421:
print(f"⚠️ SMTP 421 detected (attempt {attempt + 1}/{max_retries}): {e.smtp_error.decode()}")
if attempt <h3>关键注意事项</h3>
- ✅ 永远使用应用专用密码/授权码:QQ/163/126/Gmail均禁用账户原始密码,需在邮箱设置中开启SMTP并生成独立16位授权码。
- ✅ 限制发送频率:单IP每分钟建议≤10封,批量发送务必添加time.sleep(1)间隔,避免触发反垃圾阈值。
- ✅ 验证DNS与端口可达性:运行 telnet smtp.qq.com 465 或 nc -zv smtp.qq.com 465 确认网络层连通。
- ❌ 避免在HTML表单提交后直接调用Python后端发送——应通过AJAX异步提交至API端点,防止前端阻塞;同时后端需做请求节流与输入清洗(如过滤HTML标签、URL编码)。
- ? 若错误持续出现,登录邮箱Web后台查看「SMTP操作日志」或联系服务商获取具体子错误码(如421 4.7.0 vs 421 4.3.2),不同子码指向完全不同的处置路径。
421错误本质是SMTP协议的“友好拒载”机制,正确理解其临时性特征,并结合连接复用、指数退避、协议合规三原则,即可显著提升邮件系统的鲁棒性与交付率。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











