发送电子邮件时MIMEText UTF-8编码问题

19 投票
2 回答
36989 浏览
提问于 2025-04-17 06:31

这是我代码的一部分,用来发送电子邮件:

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())

其他部分都没问题,只有主题这一块出问题了。当我尝试发送包含特殊字符的字符串(比如“ação”)时,就会出现这个错误:

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

我该怎么做才能在MIMEText的主题中发送带有特殊字符的电子邮件呢?

2 个回答

1

我改进了这个答案,提供了另一种连接服务器和登录的方法,因为之前的方法在应用程序认证时遇到了问题,而且人们可以看到所有应该使用的库。

from email.mime.text import MIMEText
from email.header import Header
import smtplib

user='email1@teste.com'
pwd='password'
server = smtplib.SMTP('smtp.office365.com', 587) #it works with outlook
server.ehlo()
server.starttls()
server.login(user, pwd)
assunto = 'Teste'
para = 'email2@teste.com'
texto = 'Niterói é uma cidade incrível '
corpo = MIMEText(texto, 'plain', 'utf-8')
corpo['From'] = user
corpo['To'] = para
corpo['Subject'] = Header(assunto, 'utf-8')
try:
    server.sendmail(user, [para], corpo.as_string())
    print('email was sent')
except:
    print('error')
server.quit()
47

看起来在Python 3中,要把Subject(主题)编码成utf-8格式,需要用到一个叫Header的对象:

# -*- 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

所以原来的脚本需要改成:

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())

撰写回答