gpt4 book ai didi

python - 使用 python 电子邮件发送具有非 ascii 文件名的附件

转载 作者:行者123 更新时间:2023-11-28 22:39:32 26 4
gpt4 key购买 nike

如何发送一封电子邮件,其中附有文件名包含 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。

最佳答案

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

filename=('utf-8', 'fr', os.path.basename(f).encode('utf-8'))

...当我只是发送 UTF-8 而不告诉它时它有效:

filename=os.path.basename(f).encode('utf-8')

文件名将正确显示。

这似乎与 documentation 矛盾其中指出:

If the value contains non-ASCII characters, it must be specified as athree tuple in the format (CHARSET, LANGUAGE, VALUE), where CHARSET isa string naming the charset to be used to encode the value, LANGUAGEcan usually be set to None or the empty string (see RFC 2231 for otherpossibilities), and VALUE is the string value containing non-ASCIIcode points.

这不起作用,但是 python 3 documentation添加:.

If a three tuple is not passed and the value contains non-ASCIIcharacters, it is automatically encoded in RFC 2231 format using aCHARSET of utf-8 and a LANGUAGE of None.

只有这个有效,即使对于 python 2.7,尽管它没有在文档中提到。

关于python - 使用 python 电子邮件发送具有非 ascii 文件名的附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34668240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com