ファイル名に 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')))
2 回目の試行:
次のように文字セットをグローバルに設定します。
from email import Charset
Charset.add_charset('utf-8', Charset.QP, Charset.QP, 'utf-8')
3 回目の試行
使用する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))
4 回目の試行
urllib.quote()
ファイル名を urlencode するために使用します。これは、ファイル名に対して 3 番目の方法と同じ効果があります。
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 を使用しています。