首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用python电子邮件发送带有非ascii文件名的附件

用python电子邮件发送带有非ascii文件名的附件
EN

Stack Overflow用户
提问于 2016-01-08 01:49:16
回答 2查看 7.2K关注 0票数 4

如何发送带有文件名包含unicode字符的电子邮件?

到目前为止,该文件将到达,但与文件名"noname“。

这部分非常适合ASCII文件名:

代码语言:javascript
复制
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)

第一次尝试

添加编码、语言和编码字符串的元组,而不仅仅是文件名。

代码语言:javascript
复制
part.add_header('Content-Disposition', 'attachment', filename=('utf-8', 'fr', os.path.basename(f).encode('utf-8')))

第二次尝试:

在全局设置字符集如下:

代码语言:javascript
复制
from email import Charset
Charset.add_charset('utf-8', Charset.QP, Charset.QP, 'utf-8')

第三次尝试

使用utils.encode_rfc2231

代码语言:javascript
复制
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。这与第三种方法对文件名的影响相同。

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-08 11:08:56

而不是告诉服务器它是这样的UTF-8:

代码语言:javascript
复制
filename=('utf-8', 'fr', os.path.basename(f).encode('utf-8'))

当我只发送UTF-8而不告诉您时,...it就能工作:

代码语言:javascript
复制
filename=os.path.basename(f).encode('utf-8')

文件名将正确显示。

这似乎与文档的说法相矛盾,后者指出:

如果该值包含非ASCII字符,则必须将其指定为格式(字符集、语言、值)的三个元组,其中字符集是命名用于编码值的字符集的字符串,通常可以将语言设置为None或空字符串(其他可能性见RFC 2231 ),值是包含非ASCII代码点的字符串值。

这是行不通的,但是python 3文档补充道:

如果未传递三个元组,且该值包含非ASCII字符,则使用utf-8的字符集和无语言自动以RFC 2231格式编码。

尽管在文档中没有提到这种情况,但是即使在python2.7中也是如此。

票数 4
EN

Stack Overflow用户

发布于 2021-09-06 16:23:42

正如苏珊娜所指出的,在python 3文档中,您不需要对utf-8文件名进行编码,只需让库为您编写:

代码语言:javascript
复制
part.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', filename))

这在python 3.8中是正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34668240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档