我正在尝试发送电子邮件,但邮件内容标题部分的发件人地址有一个小问题。
基本上,这就是我想要在标题中包含的内容:
From: "Real Name" <test@example.com>
Run Code Online (Sandbox Code Playgroud)
这就是我所做的(Python 3.5):
message = email.mime.text.MIMEText(body)
message.add_header('From', from_hdr)
Run Code Online (Sandbox Code Playgroud)
它适用于 ASCII,但不适用于 UTF-8。
给定一个非 ASCII 名称,如"Strángé Nämé" <test@example.com>输入被编码为add_header():
如果该值包含非 ASCII 字符 ..... 它会使用 UTF-8 的 CHARSET 和 None 的 LANGUAGE 以 RFC 2231 格式自动编码。
问题是整个字符串——不仅仅是真实姓名——都被编码了。结果看起来像一个字符串:=?utf-8?.....?=并且原始格式丢失了。邮件服务器将明显丢失的域添加到其中,损坏就完成了。
然后将发件人显示为(由收件人的电子邮件程序解码)为:
"\"Strángé Nämé\" <test@example.com>"@server.example.com
我曾尝试使用拆分地址email.utils.parseaddr()并仅对实名部分进行编码,email.utils.encode_rfc2231()但这没有帮助。
我现在避免在 Form: 字段中使用 UTF-8,不知道如何正确处理它。能否请你帮忙?
以下对我有用(在 python2 和 python3 中):
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
msg = MIMEText("Hi! This is Mr. Robot!")
you = 'nehalxxxxx@somedomain.com'
me = Header('Strángé Nämé', 'utf-8')
me.append('<test@example.com>', 'ascii')
msg['Subject'] = 'Hi There'
msg['From'] = me
msg['To'] = you
s = smtplib.SMTP('localhost')
s.sendmail(me.__str__(), [you], msg.as_string())
s.quit()
Run Code Online (Sandbox Code Playgroud)
消息看起来像这样 ( msg.as_string()):
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: Hi There
From: =?utf-8?b?U3Ryw6FuZ8OpIE7DpG3DqQ==?= <test@example.com>
To: nehalxxxxx@somedomain.com
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1605 次 |
| 最近记录: |