使用Python调用Cpanel域名邮箱发信报smtplib.SMTPDataError 550错误
问题原因
550报错是cpanel的SMTP反伪造机制触发的,你构造的邮件内容缺少标准的From发件人头字段,仅在smtp.sendmail()参数中传入发件人地址不会被自动写入邮件头,服务器解析邮件头时识别不到匹配的已验证发件人地址,因此判定为伪造邮件。同时你使用的587端口默认要求开启TLS加密,你注释了smtp.starttls()也可能导致认证不完整。
修复方案
- 取消
smtp.starttls()行的注释,开启TLS加密传输 - 在构造的
msg中补充From和To头字段,和你传入sendmail的发件人、收件人地址保持完全一致
修复后代码
import smtplib import config # 确保你已经正确导入config模块 with smtplib.SMTP('mail.rottengrapes.com',587) as smtp: smtp.ehlo() smtp.starttls() # 取消注释,开启TLS加密 smtp.ehlo() smtp.login("formkitty@rottengrapes.com",config.PASSWORD) subject = 'Testing email' body = 'Getting data via email' # 补充From和To头字段 msg = f'From: formkitty@rottengrapes.com\nTo: mewow@gmail.com\nSubject: {subject}\n\n\n\n{body}' smtp.sendmail("formkitty@rottengrapes.com",'mewow@gmail.com', msg.encode('utf-8')) # 指定编码避免乱码 print('邮件发送成功')
验证排查项
如果修改后仍报错,可以检查以下配置:
- 确认cpanel邮箱账号的SMTP权限已经开启,没有被主机商限制外发
- 确认域名的SPF记录已经正确配置,包含cpanel服务器的IP,避免被反垃圾规则拦截
- 确认登录的邮箱账号和
From字段填写的地址完全一致,不要用别名或者其他域名地址
内容的提问来源于stack exchange,提问作者krishna lodha
相关产品推荐
相关产品推荐

