如何发送 utf-8 的电子邮件?

Posted

技术标签:

【中文标题】如何发送 utf-8 的电子邮件?【英文标题】:How to send utf-8 e-mail? 【发布时间】:2011-08-20 02:05:38 【问题描述】:

请问如何发送 utf8 邮件?

import sys
import smtplib
import email
import re

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def sendmail(firm, fromEmail, to, template, subject, date):
    with open(template, encoding="utf-8") as template_file:
        message = template_file.read()

    message = re.sub(r"\s*firm\s*", firm, message)
    message = re.sub(r"\s*date\s*", date, message)
    message = re.sub(r"\s*from\s*", fromEmail, message)
    message = re.sub(r"\s*to\s*", to, message)
    message = re.sub(r"\s*subject\s*", subject, message)

    msg = MIMEMultipart("alternative")
    msg.set_charset("utf-8")
    
    msg["Subject"] = subject
    msg["From"] = fromEmail
    msg["To"] = to

    #Read from template
    html = message[message.find("html:") + len("html:"):message.find("text:")].strip()
    text = message[message.find("text:") + len("text:"):].strip()

    part1 = MIMEText(html, "html")
    part2 = MIMEText(text, "plain")
    
    msg.attach(part1)    
    msg.attach(part2)

    try:
        server = smtplib.SMTP("10.0.0.5")
        server.sendmail(fromEmail, [to], msg.as_string())
        return 0
    except Exception as ex:
        #log error
        #return -1
        #debug
        raise ex
    finally:
        server.quit()

if __name__ == "__main__":
    #debug
    sys.argv.append("Moje")
    sys.argv.append("newsletter@example.cz")
    sys.argv.append("subscriber@example.com")
    sys.argv.append("may2011.template")
    sys.argv.append("This is subject")
    sys.argv.append("This is date")

    
    if len(sys.argv) != 7:
        exit(-2)

    firm = sys.argv[1]
    fromEmail = sys.argv[2]
    to = sys.argv[3]
    template = sys.argv[4]
    subject = sys.argv[5]
    date = sys.argv[6]
    
    exit(sendmail(firm, fromEmail, to, template, subject, date))

输出

Traceback (most recent call last):
  File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py", line 69, in <module>
    exit(sendmail(firm, fromEmail, to, template, subject, date))   
  File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py", line 45, in sendmail
    raise ex
  File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py", line 39, in sendmail
    server.sendmail(fromEmail, [to], msg.as_string())
  File "C:\Python32\lib\smtplib.py", line 716, in sendmail
    msg = _fix_eols(msg).encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode character '\u011b' in position 385: ordinal not in range(128)

【问题讨论】:

我们缺少行号,因此我们可以找到错误的确切行。 错误可能在message.as_string()。您需要提供更多,否则我们将无法为您提供帮助。 【参考方案1】:

您应该在您的 MIMEText 调用中添加 'utf-8' 参数(默认情况下假定为 'us-ascii')。

例如:

# -*- encoding: utf-8 -*-

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

msg = MIMEMultipart("alternative")
msg["Subject"] = u'テストメール'
part1 = MIMEText(u'\u3053\u3093\u306b\u3061\u306f\u3001\u4e16\u754c\uff01\n',
                 "plain", "utf-8")
msg.attach(part1)

print msg.as_string().encode('ascii')

【讨论】:

对不起,这是个老帖子,我在下面写了一个新问题,但我必须......应该是人类写像'u\3035\u3093 ???你有一些日语单词吗?你是怎么想出这些代码的?从我读过的教程中,我总是看到这个数字(虽然我理解是字母代码,但我不知道如何输入这个代码或类似的代码......) 这些代码仅用于说明目的。您可以将 python 源输入编码设置为 utf-8 并直接键入 Unicode 常量。如果您需要为某些字符获取那些 '\u...' 代码,您可以执行类似 print repr(u'テストメール') 的操作 首先感谢您的快速回答...检查一下(以了解我对这个问题的看法)我做了这个测试:我在一个变量中放入了一个 utf-8 单词(希腊字母)并存储在字典'ΤΕΣΤ'=X中。在“立即窗口”中,当我打印 listOfutfs 时,我会报告一些 u'' 代码! (从mysql我检索到了ΤΕΣΤ)。然后我说ok,把值给我作为listOfutfs['ΤΕΣΤ'],它回复我KeyError:'\xce\xa6\xce\xa1\xce\x9b\xce\x9a'!!!!!!!!! !!!!!!!!! 好的,明白了[u'ΤΕΣΤ']!非常抱歉,我不知道你的整个事情是出于解释性的原因....但是你如何连接,那么python中的unicodes?你也不能写 u""" ΤΕΣΤ """ 对吧? 其实可以。遵循 python Unicode howto:docs.python.org/howto/unicode.html【参考方案2】:

Martin Drlík 提出的问题是 7 岁零 8 个月大......如今,感谢 Python 的开发人员,使用 Python 3 版本解决了编码问题。

因此,不再需要指定必须使用 utf-8 编码:

#!/usr/bin/python2
# -*- encoding: utf-8 -*-
...
    part2 = MIMEText(text, "plain", "utf-8")

我们将简单地写:

#!/usr/bin/python3
...
    part2 = MIMEText(text, "plain")

最终结果:Martin Drlík 的脚本运行良好!

不过,最好按照email: Examples 中的建议使用 email.parser 模块。

【讨论】:

以上是关于如何发送 utf-8 的电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

Power Automate“发送电子邮件 (V2) 似乎不支持 UTF-8 字符,有啥办法吗?

尝试以 utf-8 格式发送电子邮件,但 Content-Type 仍设置为 iso-8859-1

使用 utf-8 文件名发送 MIME 编码的电子邮件附件

Outlook 未显示 UTF-8 编码文本 (یب سائٹ Ù) 通过 php 邮件发送的电子邮件

Python发送邮件

Python发送邮件