记录下我在使用smtplib里踩过的坑
工作中用到了使用Python自动发邮件,选择采用了python自带的smtplib模块,上菜鸟教程参考了其中python基础教程-Python SMTP发送邮件,在最后程序运行的时候,报了一个错误。
File "C:\Users\**\email.py", line 53, in main smtpObj.sendmail(sender, receivers, message.as_string()) File "C:\Program Files (x86)\**\lib\smtplib.py", line 888, in sendmail raise SMTPDataError(code, resp) smtplib.SMTPDataError: (554, b"5.2.0 STOREDRV.Submission.Exception:InvalidRecipientsException; Failed to process message due to a permanent exception with message Recipient '******@qq.com' is not resolved. All recipients must be resolved before a message can be submitted. InvalidRecipientsException: Recipient '*******@qq.com' is not resolved. All recipients must be resolved before a message can be submitted. [Hostname=HK***.apcprd***.prod.outlook.com]")
简单翻一下报错给到我们的信息内容:无法处理邮件,因为邮件收件人的帐户存在异常没有被解决。必须先解析所有收件人,然后才能提交邮件。
很明显,这个问题是收件人邮箱报错导致的。遂,上才艺,百度搜索,结果很尴尬,搜索半天都找不出什么有用的信息。
不过,功夫不负有心人,最终还是在一篇帖子上找到了问题原因,有其他小伙伴在一年前也碰到过类似的问题,所以我记录下,
问题的原因在于这段代码
message['To'] = Header("测试", 'utf-8')
截图:
解决方法有2中:
message['To'] = Header("*****@qq.com", 'utf-8')
message['To'] = "*****@qq.com"
其实最后测下来,['From']和['To']都是可以直接赋值,不影响邮件发送。代码可以简化成下面这个样子:
message = MIMEText(content) # 邮件文本内容 message['From'] = fromAddr # 发送者 message['To'] = toAddr # 接收者 message['Subject'] = subject # 邮件标题
为什么可以这么简单,因为查看Python官方文档可以得知email.mime.text.MIMEText(_text, _subtype='plain', _charset=None, *, policy=compat32)
所以其实MIMEText只需要传入内容就可以了。
期间还有另一个报错,查询到的愿意你是因为在代码中缺少了两行代码(第2、3行):
smtpObj = smtplib.SMTP("smtp.****.com",587) smtpObj.ehlo() # 向邮箱发送SMTP 'ehlo' 命令 smtpObj.starttls()