以下是我发送邮箱的部分代码:

servidor = smtplib.SMTP()
servidor.connect(HOST, PORT)
servidor.login(user, usenha)
assunto = str(self.lineEdit.text())
para = str(globe_email)             
texto = self.textEdit.toPlainText()
textos = str(texto)
corpo = MIMEText(textos.encode('utf-8'), _charset='utf-8')
corpo['From'] = user
corpo['To'] = para
corpo['Subject'] = assunto
servidor.sendmail(user, [para], corpo.as_string())

除了主题部分,一切都好.

UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)

我如何发送主题为MIMEText的带有特殊字符的邮箱?

推荐答案

在python3中,似乎需要一个Header对象来将Subject编码为utf-8:

# -*- coding: utf-8 -*-
from email.mime.text import MIMEText
from email.header import Header
s = 'ação'
m = MIMEText(s, 'plain', 'utf-8')
m['Subject'] = Header(s, 'utf-8')
print(repr(m.as_string()))

输出:

'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: base64\nSubject: =?utf-8?b?YcOnw6Nv?=\n\nYcOnw6Nv\n

所以最初的 playbook 会变成:

servidor = smtplib.SMTP()
servidor.connect(HOST, PORT)
servidor.login(user, usenha)
assunto = str(self.lineEdit.text())
para = str(globe_email)             
texto = str(self.textEdit.toPlainText())
corpo = MIMEText(texto, 'plain', 'utf-8')
corpo['From'] = user
corpo['To'] = para
corpo['Subject'] = Header(assunto, 'utf-8')
servidor.sendmail(user, [para], corpo.as_string())

Python-3.x相关问答推荐

根据收件箱内部的值以行降序的特定顺序重新排序列

是什么原因导致Pandas=2.1.4和Pandas=1.4.2之间Pandas DataFrame中从Float64到int32的连续列转换方式不同

如何在输入正确的用户名和密码时添加按钮?

以某种方式分割字符串

Python - 根据条件附加 NULL 值

在一行中读写一个csv文件

如何确保 GCP Document AI 模型输出与输入文件同名的 JSON?

有没有一种方法可以通过输入从 0 到 255 的 R、G 和 B 值来生成 RGB colored颜色 ,而无需使用 python 中的 matplotlib 模块?

Pandas 在每组两个条件之间获得时间增量

为列表列表中的每个列表插入 str 到 index[0] 中. Python

python 3.7 websockets的1006连接异常关闭错误

PyQt:退出时没有错误消息(回溯)

多个返回函数的列表理解?

逗号分隔列表的 argparse 操作或类型

如何在元素列表中找到最大的数字,可能是非唯一的?

Python:在 map 对象上调用列表两次

将 numpy.float64 列表快速转换为 Python 中的浮点数

Python 3 - Zip 是 pandas 数据框中的迭代器

python - Pandas - Dataframe.set_index - 如何保留旧的索引列

python中的绝对导入是什么?