LoginSignup
0
2

More than 5 years have passed since last update.

csv添付メール送付時のファイル名指定

Posted at

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==?="
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2