如何发送带有文件名包含unicode字符的电子邮件?
到目前为止,该文件将到达,但与文件名"noname“。
这部分非常适合ASCII文件名:
import smtplib
from email.mime.text import MIMEText
from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.Utils import formatdate
from email import Encoders
from email.Utils import encode_rfc2231
msg = MIMEMultipart()
msg['Subject'] = "New magazine delivery!"
msg['From'] = sender_email
msg['To'] = ', '.join(kindle_emails)
msg['Date'] = formatdate(localtime=True)
message = "see attachment"
msg.attach(MIMEText(message))
part = MIMEApplication(open(f, 'rb').read(), _subtype='application/x-mobipocket-ebook')
part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(filename)
msg.attach(part)第一次尝试
添加编码、语言和编码字符串的元组,而不仅仅是文件名。
part.add_header('Content-Disposition', 'attachment', filename=('utf-8', 'fr', os.path.basename(f).encode('utf-8')))第二次尝试:
在全局设置字符集如下:
from email import Charset
Charset.add_charset('utf-8', Charset.QP, Charset.QP, 'utf-8')第三次尝试
使用utils.encode_rfc2231
from email.Utils import encode_rfc2231
utf8filename = encode_rfc2231(os.path.basename(f).encode('utf-8'), charset='utf-8')
part.add_header('Content-Disposition', 'attachment', filename=('utf-8', 'fr', utf8filename))第四次尝试
使用urllib.quote()对文件名进行urlencode。这与第三种方法对文件名的影响相同。
utf8filename = urllib.quote(os.path.basename(f).encode('utf-8'))
part.add_header('Content-Disposition', 'attachment', filename=('utf-8', 'fr', utf8filename))有什么想法吗?
我是不是遗漏了关于RFC2231文件名字符编码的重要内容?
我使用Gmail的SMTP服务器和python 2.7。
发布于 2016-01-08 11:08:56
而不是告诉服务器它是这样的UTF-8:
filename=('utf-8', 'fr', os.path.basename(f).encode('utf-8'))当我只发送UTF-8而不告诉您时,...it就能工作:
filename=os.path.basename(f).encode('utf-8')文件名将正确显示。
这似乎与文档的说法相矛盾,后者指出:
如果该值包含非ASCII字符,则必须将其指定为格式(字符集、语言、值)的三个元组,其中字符集是命名用于编码值的字符集的字符串,通常可以将语言设置为None或空字符串(其他可能性见RFC 2231 ),值是包含非ASCII代码点的字符串值。
这是行不通的,但是python 3文档补充道:
如果未传递三个元组,且该值包含非ASCII字符,则使用utf-8的字符集和无语言自动以RFC 2231格式编码。
尽管在文档中没有提到这种情况,但是即使在python2.7中也是如此。
发布于 2021-09-06 16:23:42
正如苏珊娜所指出的,在python 3文档中,您不需要对utf-8文件名进行编码,只需让库为您编写:
part.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', filename))这在python 3.8中是正确的。
https://stackoverflow.com/questions/34668240
复制相似问题