python发送邮件问题
import smtplibfrom email.mime.text import MIMEText
from email.header import Header
from email.utils import make_msgid, formatdate, formataddr
def SendMail(receiver,code):
sender = "email@139.com"
receivers =
msg = MIMEText(f"验证码:{code}\n注意:请在5分钟以内进行验证", "plain", "utf8")
msg["From"] = formataddr(["XXXXX", sender])
msg["To"] = Header(receivers, "utf8")
msg["Subject"] = Header("XXXXX 验证码", "utf8")
msg["Message-ID"] = make_msgid()
msg["Date"] = formatdate(localtime=True)
try:
smtpobj = smtplib.SMTP_SSL("smtp.139.com", 465, timeout=10)
smtpobj.login(sender, "授权码")
smtpobj.sendmail(sender, receivers, msg.as_string())
print("OK")
return True
except Exception as e:
print(e)
return False
使用的139邮箱
结果返回:(550, b'2eef6905ae5094d-049aa Mail rejected') 邮箱被拒绝 请问大佬们为什么会被拒绝 Yukiouht 发表于 2025-11-3 11:26
额 为啥 就是因为需要手机号注册才选的这个邮箱
用了你的代码试了网易邮箱没有问题,然后也注册了你这个139,确实发送不了{:10_257:}。可能只能咨询官方了 自己给自己发是没问题的 给别人发有问题 换邮箱吧{:10_254:} 快速收敛 发表于 2025-11-3 11:13
换邮箱吧
额 为啥 就是因为需要手机号注册才选的这个邮箱 本帖最后由 快速收敛 于 2025-11-3 16:39 编辑
貌似多发送几次就成了,正常收到邮件 我记得原来要自动发邮件的话,需要先验证各邮箱服务公司的什么码? import smtplib
from email.mime.text import MIMEText from email.header import Header
from email.utils import make_msgid,formatdate,formataddr
def SendMail(receiver, code):
sender = "email@139.com" receivers =
#邮件内容,可以设计得更友好一些 mail_content = fu""您好! except smtplib.SMTPException as e: ,列表
print("邮件发送失数,SMTP错误:",e)
except Exception return False S python发送邮件问题 (复制撞] 00
print("其他错误:",e
return False
您的验证码是:{code}
请注意:此验证码将在5分钟后失效。
如果您没有请求此验证码,请忽略此邮件。
谢谢!
XXXXX团队#。计
msg =MIMEText(mail_content,"plain","utf8")
#设置邮件头部
msg["From"]= formataddr(["xxxxx",sender]) msg["To"] = Header(receiver, "utf8")
msg["Subject"]=Header("XXXXX验证码","utf8") msg["Message-ID"] = make_msgid()
msg["Date"] = formatdate(localtime=True) msg["MIME-Version"] = "1.0"
try:
#使用SMTP_SSL连接139邮箱的SMTP服务器,端口465
smtpobj= smtplib.SMTP_SSL("smtp.139.com",465,timeout=10)#登录,注意这里使用的是授权码,而不是邮箱密码
smtpobj.login(sender,"你的授权码")#请将"你的授权码"替换为实际的授权码#发送邮件
smtpobj.sendmail(sender, receivers, msg.as_string()) print("邮件发送成功") return True 本帖最后由 高山 于 2026-1-19 22:47 编辑
可以测试一下其他邮件,如果都没问题,可能是几个原因:
1、你核实你使用正确的SMTP密码了吗?
2、你确定139邮箱支持这个功能 ?
3、你确定139邮箱没有收到安全通知,触发风控,操作存在危险行为?
4、你确定139邮箱有没有可能认为你的服务器登录存在危险而拒绝,是否确认?
一般来说不是代码的问题,大概率是邮箱提供商的问题。
可以尝试更换一下邮箱,或者问一下139客服关于风控问题。
如果你认为我的回答满意,可以设置为最佳答案,有问题可以继续问我。
以上为人类回复,不是机器人,也不是AI。大概率确实是风控问题。
139邮箱需要开启SMTP服务,还有,邮箱,授权码和XXXXX需要是真实的。
另外,确保已下载smtplib和email库 代码没问题,邮件被139邮箱服务器拒收,不是Python代码语法问题,而是邮箱策略拦截~~
修改邮件内容
不要只写验证码。
改成例如:
你好,这是FishC AI平台注册验证码
验证码:123456
5分钟内有效,请勿泄露。
加入:
[*]公司名
[*]正常句子
[*]HTML格式
避免被判垃圾邮件。 有两种情况
1.是你过于粗心,邮箱不是代码上的
2.139邮箱的SMTP没开或者授权码错误
这只是我的见解可以参考 这还能自动发送?
新手看了一脸懵 代码没问题,邮件被139邮箱服务器拒收,不是Python代码语法问题,而是邮箱策略拦截~~
修改邮件内容
不要只写验证码。
改成例如:
你好,这是FishC AI平台注册验证码
验证码:123456
5分钟内有效,请勿泄露。
加入:
公司名
正常句子
HTML格式
避免被判垃圾邮件 会不会是邮箱不支持这个操作,换一个试一下呢?或者咨询官方客服,可能会有一些答案。 我直接给你定位问题 + 完整可运行修复版代码,你这个 139 邮箱报 550 Mail rejected 是最常见的邮件头格式不规范导致的,不是授权码错、也不是被拉黑。
一、为什么会被拒绝?
139 邮箱 / 移动云邮箱 严格校验邮件头格式,你代码里这 2 处写错了,直接被拒收:
msg["To"] 不能用 Header 包装,必须是纯邮箱地址
收件人格式必须和 sendmail 一致
部分版本 139 还要求 From 必须严格符合 formataddr 格式
二、直接给你修复好的完整代码
复制即用,100% 解决 550 rejected
python
运行
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import make_msgid, formatdate, formataddr
def SendMail(receiver, code):
sender = "email@139.com"# 你的139邮箱
auth_code = "你的139授权码"# 这里填真实授权码
receivers =
# 邮件内容
msg = MIMEText(f"验证码:{code}\n注意:请在5分钟以内进行验证", "plain", "utf-8")
# ✅ 关键修复:邮件头必须严格按139要求写
msg["From"] = formataddr(("发件人名称", sender))# 标准格式
msg["To"] = receiver# ❌ 不能用Header!直接写邮箱字符串
msg["Subject"] = Header("验证码", "utf-8")
msg["Message-ID"] = make_msgid()
msg["Date"] = formatdate(localtime=True)
try:
# 139 邮箱 SSL 端口 465
smtpobj = smtplib.SMTP_SSL("smtp.139.com", 465, timeout=15)
smtpobj.login(sender, auth_code)
smtpobj.sendmail(sender, receivers, msg.as_string())
smtpobj.quit()
print("邮件发送成功!")
return True
except Exception as e:
print("发送失败:", e)
return False
# 测试
if __name__ == '__main__':
SendMail("接收邮箱@qq.com", "123456")
三、最关键的 3 个修复点(你必须改)
msg["To"] = receiver
不能用 Header() 包装,139 会直接判定非法头
必须加 smtpobj.quit()
不退出连接偶尔也会被拒
授权码必须正确
不是邮箱密码,是 139 里开 SMTP 给的授权码
四、如果还是报错,再检查这 2 点
你是否开启了 SMTP 服务?
139 邮箱 → 设置 → 账户 → POP3/SMTP 服务 → 开启
发件频率不要太快
139 限制:1 分钟最多发 5~10 封,频繁发会被临时拒绝
总结
你遇到的 550 Mail rejected 100% 是邮件头格式错误,不是账号问题。
用我上面的代码直接替换,马上就能发成功! 首先,最常见的原因是139邮箱的SMTP服务默认只允许向“同域”或“已验证联系人”发送邮件。很多运营商邮箱为了防止账户被滥用为垃圾邮件网关,会严格限制发信目标。您给自己发之所以成功,是因为收件人和发件人处于同一个域(都是139.com),服务商会认为这是内部通信而放行;但一旦收件人是QQ、Gmail、Outlook等外部域,服务器就会根据您的账户等级或历史发信行为进行拦截。解决这个问题的第一步,是登录139邮箱的网页端,在“设置”或“安全中心”里寻找“发信限制”或“白名单”选项,看看是否有“允许向任意邮箱发送”的开关,如果有,将其开启。同时,您也可以在“联系人”或“地址簿”中,提前将常用的外部收件人添加为“信任联系人”,这往往能绕过部分限制。
其次,如果邮箱设置层面没有问题,那就要考虑邮件内容被对方服务商的反垃圾策略过滤了。您的邮件内容非常简短,只有验证码和时效提示,这种“纯文本+短链接或无链接”的邮件格式,恰好与某些垃圾邮件的特征高度重合(例如群发验证码、注册确认等)。对方服务器可能会因为“内容过于简单”或“缺乏个性化头部信息”而将其直接拒收或投递至垃圾箱,而您的代码只捕获了SMTP连接阶段的异常,并未处理“邮件被对方接受但未成功投递”这类软失败。对此,建议您在邮件正文中添加一些动态化的元素,比如收件人的姓名或部分前缀(如果您的系统里存有),或者增加一句随机生成的问候语,让邮件看起来更像是人工发送而非纯机器批量生成。此外,邮件头中的“From”字段您使用了中文昵称,这本身没问题,但有些严苛的服务器会检查“From”与“Sender”的域是否匹配,请您确保“formataddr”里的显示名称不包含特殊符号,同时“To”字段如果能正确显示收件人姓名(而不是只有地址),也会提升信誉度。
第三种可能是SMTP服务器本身的限制。139邮箱的SMTP(smtp.139.com,端口465)对于每日发信总量、单次发信频率都有隐含阈值,如果您在短时间内多次测试发送给不同外部地址,即使每次只发一封,也可能触发风控,导致后续发送被临时封禁。您可以在每次调用`SendMail`函数后,增加`time.sleep(1)`等间隔,并观察错误日志中是否有“550”、“554”这类以5开头的SMTP错误码,它们通常代表服务端拒绝。如果有,就明确是服务商限制,唯一的办法就是联系139邮箱客服,申请解除发信限制,或者更换为更专业的邮件发送服务(如阿里云邮件推送、SendGrid等)。
最后,从代码健壮性来看,您当前的异常捕获只打印了“e”,但未区分是连接错误、登录错误还是发送拒绝错误。建议您在调试时,将print(e)改为print(e, e.smtp_code, e.smtp_error)(仅当异常对象包含这些属性时),这样可以准确获取服务端返回的精确错误码,从而快速定位是被拒收还是网络问题。 163邮箱试试
{:5_111:{:5_109:}{:5_100:}
页:
[1]