使用Python smtplib发送邮件时出现550错误的问题咨询
550 5.7.0 Authentication rejected 问题排查方案
首先澄清一个常见的认知偏差:SMTP返回的550 5.7.0 Authentication rejected错误绝大多数场景下指向发件方身份校验失败,而非收件人地址被拒,你可以按照以下步骤逐一排查问题:
1. 校验登录凭证与服务配置
- 确认
username、password参数合规:大部分公共邮箱服务(QQ邮箱、163邮箱、Gmail等)不支持直接使用账号登录密码作为SMTP校验凭证,需要到邮箱安全设置页面单独生成应用专用密码,将生成的密码填入代码对应位置 - 确认SMTP服务地址与端口匹配:不同邮箱服务商的SMTP地址、端口有固定规范,例如Gmail的SMTP地址为
smtp.gmail.com、TLS端口为587,若使用自建SMTP服务,确认你填写的地址、端口和运维提供的配置一致 - 确认发件邮箱已开启SMTP权限:多数邮箱默认关闭SMTP服务,需要手动在邮箱设置页开启该功能;若为自建服务,确认当前运行代码的IP地址在服务端的访问白名单内
2. 修复邮件内容格式问题
你当前代码中直接传递纯文本字符串作为邮件内容,不符合SMTP协议要求的标准邮件格式,缺少发件人、收件人、主题等必要头字段,部分服务端会直接拒绝这类格式不合法的发送请求,可调整为如下写法:
import smtplib import ssl from email.mime.text import MIMEText if __name__ == "__main__": smtp_server = "smtp.server.ip.addr" port = 111 password = "你的应用专用密码" username = "my@email.com" # 替换为标准SSL上下文,跳过证书校验的写法容易被安全级别高的服务端拦截 context = ssl.create_default_context() receiver_email = "my_recipient@gmail.com" # 构造符合RFC标准的邮件 msg = MIMEText("Hi", "plain", "utf-8") msg["From"] = username msg["To"] = receiver_email msg["Subject"] = "测试邮件" try: server = smtplib.SMTP(smtp_server, port) server.starttls(context=context) server.login(username, password) # 传入格式化后的邮件字符串 server.sendmail(username, receiver_email, msg.as_string()) server.quit() except Exception as e: print(e)
3. 特殊场景排查
如果以上步骤都没有解决问题,可以尝试直接使用邮件客户端(如Outlook、Foxmail)配置相同的SMTP参数发送测试邮件,确认是代码层面的问题还是账号/服务层面的问题:如果客户端也无法发送,直接排查账号权限和服务配置即可;如果客户端可以正常发送,再检查代码的SSL版本、协议握手逻辑是否和服务端要求匹配。
内容的提问来源于stack exchange,提问作者Zeinab Abbasimazar
相关产品推荐
相关产品推荐

