发送电子邮件
问题描述:
这里MimeText用于当UTF-8编码的问题是我的代码,发送电子邮件的一部分:发送电子邮件
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”:
>>> from email.mime.text import MIMEText
>>> from email.header import Header
>>> s = 'ação'
>>> m = MIMEText(s.encode('utf-8'), 'plain', 'utf-8')
>>> m['Subject'] = Header(s, 'utf-8')
>>> 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.encode('utf-8'), 'plain', 'utf-8')
corpo['From'] = user
corpo['To'] = para
corpo['Subject'] = Header(assunto, 'utf-8')
servidor.sendmail(user, [para], corpo.as_string())
它的工作!我几乎放弃了......在我提出这个问题之前,我发现了关于Header选项的一些信息,但是我尝试过的方式没有奏效,但现在效果很好。真的很感谢你! –
这个解决方案对我来说非常完美。 – alfredocambera
根据文档,在调用MIMEText时,'.encode('utf-8')'是不必要的。只要指定utf-8编码,它就会自动编码unicode:“...如果_text是unicode,则使用_charset的output_charset进行编码,否则将按原样使用。经过测试,似乎为我工作。 – patricksurry