簡體   English   中英

如何向國際地址發送電子郵件

[英]How to send an e-mail to the international address

如何在Python中通過smtplib向國際地址發送電子郵件?

如果我使用以下代碼

    try:
        server = None

        msg = MIMEMultipart('alternative')
        msg['From'] = formataddr((from_email_name, from_email))
        msg['To'] = Header(to_email, 'utf-8')
        msg['Subject'] = Header(subject, 'utf-8')

        plain_text_part = MIMEText(plain_text_body, 'plain', _charset='utf-8')
        msg.attach(plain_text_part)

        html_part = MIMEText(html_body, 'html', _charset='utf-8')
        msg.attach(html_part)

        server = smtplib.SMTP(smtp_server)
        server.starttls()
        server.login(from_email, from_email_password)
        server.sendmail(from_email, to_email, msg.as_string())
    finally:
        if server is not None:
            server.quit()

那么當我使用ñoñó1234@server.com電子郵件作為目標地址(to_email)調用此代碼時,腳本將在以下行失敗:

server.sendmail(from_email, to_email, msg.as_string())

產量

'ascii'編解碼器無法在位置9編碼字符u'\\ xf1':序數不在范圍內(128)

但是,如果我將sendmail函數調用更改為以下內容

server.sendmail(from_email, to_email.encode('utf-8'), msg.as_string())

它失敗,並顯示以下錯誤:

{'\\ xc3 \\ xb1o \\ xc3 \\ xb1 \\ xc3 \\ xb31234@server.com':( 555,“ 5.5.2語法錯誤。i7sm368361lbo.39-gsmtp”)}

我正在使用GMail的SMTP服務器發送這些電子郵件。

我該如何解決?

提前致謝。

RFC 6533-國際化電子郵件概述和框架指出服務器端:

SMTP中繼必須

  • 明確識別格式,同意通過ESMTP選項進行識別,或者
  • 拒絕該消息,或者在必要時返回未送達通知消息,以便發件人可以制定另一個計划。

RFC 6531-國際化電子郵件的SMTP擴展表示精度(摘錄):

  • 與該擴展名關聯的EHLO關鍵字值為“ SMTPUTF8”
  • 一個可選參數SMTPUTF8被添加到MAIL命令。
  • 如果發送的信封或郵件需要SMTPUTF8擴展功能,則支持SMTPUTF8的SMTP客戶端務必通過MAIL命令提供SMTPUTF8參數。

由於與GMail SMTP服務器進行的交換跟蹤證明它宣布自己為SMTPUTF8兼容服務器,因此您只需要讓smtplib在mail命令中提供SMTPUTF8選項即可。 您只需要將sendmail命令更改為:

server.sendmail(from_email, to_email.encode('utf-8'), msg.as_string(), ['SMTPUTF8'])

因為您已經在主體中處理了最終的非ASCII字符,並使用MIMEMultipart和MIMEText設置了適當的標頭,所以都應該沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM