pythonでcsv添付ファイルを添付したメールを送付する際に,
windowsに送付すると 無題のドキュメント.txt
になってハマったのでメモ.
from email.mime.text import MIMEText
from django.core.mail import EmailMessage
filename = 'test.csv'
encoding = 'cp932'
contents = create_csv() # ここでcsvファイル作成
contents = contents.encode(encoding, 'ignore') # python3のunicode型からstr型へ変換
csv_file = MIMEText(
contents,
'csv',
encoding,
)
csv_file.set_param('name', filename) # outlook対応
csv_file.add_header('Content-Disposition', 'attachment',
filename=('iso2022-jp', '', filename))
email = EmailMessage(
'メールタイトル',
'メール本文\n',
to=['hoge@example.com'],
attachments=(csv_file,),
)
email.send()
実際に送付されるメールの添付ファイル部分は以下の通り.
--===============3879210183231680079==
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Type: text/csv; charset="cp932"; name="test.csv"
Content-Disposition: attachment; filename*=iso2022-jp''test.csv
ファイルの内容
--===============3879210183231680079==--
EmailMessageはdjangoで用意されている送付用のメソッド.
attachementsで添付したいファイル等を追加していく.
添付するファイルのMIMETypeは text/csv
なので email.mine.text.MIMEText
を使う.
ファイル名は Content-Disposition
で指定.
macのmailやgmailはこれで問題ないが,outlookはこのヘッダを見てくれない.
Content-Type
の最後にある name="test.csv"
が重要で,outlookはこれを見てファイル名を表示しているらしい.
日本語のファイルの場合はnameをbase64encodeで変換する必要があるらしい.
Content-Type: application/applefile;
name="=?utf-8?B?5pel5pys6Kqe44Gu44OV44Kh44Kk44OrLmNzdg==?="