【Python】使用smtplib模塊發郵件報錯“smtplib.SMTPDataError: 554, 5.2.0”


前言

記錄下我在使用smtplib里踩過的坑

錯誤一:smtplib.SMTPDataError: 554, 5.2.0

工作中用到了使用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')

截圖:

png

解決方法有2中:

  1. 去掉'utf-8'
    message['To'] = Header("*****@qq.com", 'utf-8')
  2. 直接賦值
    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)

  • _text:郵件文本內容字符創,str格式
  • _subtype:默認參數,默認為plain(也就是郵件是文本格式,而不是html)
  • _charset:是文本的字符集並會作為參數傳遞給 MIMENonMultipart 構造器;如果該字符串僅包含 ascii 碼位則其默認值為 us-ascii,否則為 utf-8。
    _charset
  • policy:命名關鍵字參數,使用它指定的規則更新和序列化郵件消息的表示形式。(這里我理解是該字段定義了郵件內容的格式標准)

所以其實MIMEText只需要傳入內容就可以了。

Tips:

  • 這個報錯,我是出現在Exchange-> QQ的鏈路上出現的,QQ-> Exchange沒有發生報錯。

錯誤二:smtplib.SMTPNotSupportedError: SMTP AUTH extension not supported by server.

期間還有另一個報錯,查詢到的願意你是因為在代碼中缺少了兩行代碼(第2、3行):

smtpObj = smtplib.SMTP("smtp.****.com",587)
smtpObj.ehlo()  # 向郵箱發送SMTP 'ehlo' 命令
smtpObj.starttls()

字段(在MIMEText()實例加上下列字段起到的作用)

  • From:發送者
  • To:接受者
  • Cc:抄送
  • Bcc:密送

參考文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM