HTML メールの送信
いろいろなコミュニケーションチャネルが出来てきましたが、 メールは今でも健在です。 用途によっては Twitter やらテキストメッセージなどに取って代わられる場面はあるでしょうが、 各種通知機能としてメールが消えることはまず無いでしょう。
Webサイトを構築していても、ユーザーにメールを送信したい場面は度々発生します。
この資料では Django の EmailMultiAlternatives を用いたメールの送信方法を示します。
EmailMultiAlternatives とは?
EmailMultiAlternatives は EmailMessage クラスから派生したクラスです。 EmailMultiAlternatives は multipart/alternative なマルチパートのメールメッセージを作成、送信するために利用できます。
multipart/alternative なるメッセージはどういうものかというと、これを使うと例えば同じメールのテキスト版と HTML 版を両方含んだメッセージを作ることができます。そうすると、メールの受け取り手の都合によって 一番シンプルなバージョンのテキストメールを表示するもよし、 あるいは可能ならば表現力に富んだ HTML 版を表示するもよし、という風にできます。
メールクライアントで HTML の表示を好まない人もいますから、 HTMLメールを送る場合には multipart/alternative 形式としてテキストメッセージも同時に送るとよいでしょう。
尚、Alternative サブタイプについて興味がありましたら、 RFC2046 の Section-5.1.4 をご覧ください。
HTMLメールを送る! 実装例
さて、ここでは現実的な利用例として、テキストメール、HTMLメールの両方をそれぞれのテンプレートから読み込み、 EmailMultiAlternatives を利用してメールを送信する例を示します。
from django.template.loader import get_template
from django.template import Context
from django.core.mail import EmailMultiAlternatives
...
# HTML/TEXT email
text_template = get_template('text_mail_template.txt')
html_template = get_template('html_mail_template.html')
subject, from_email = 'Subject!', 'example@keicode.com'
text_content = text_template.render(Context({
'var1':var1,
'var2':var2 }))
html_content = html_template.render(Context({
'var1':var1,
'var2':var2 }))
msg = EmailMultiAlternatives(
subject,
text_content,
from_email,
[to_email])
msg.attach_alternative(html_content, "text/html")
msg.send()
EmailMultiAlternatives は django.core.mail に含まれるので最初に取り込んでいます。 それから get_template でテンプレートを読み込み、 render で変数をセット。
テキスト版の内容を EmailMultiAlternatives のコンストラクタで渡し、 HTML 版の内容を attach_alternative に MIME タイプ付きで渡しています。
multipart/alternative メッセージでは、"シンプル版" » "エンリッチ版" » "さらなるエンリッチ版" ... という風に、 代替コンテンツを設定するので、コンストラクタでテキスト版、attach_alternative で (エンリッチ版といえる) HTML 版をメッセージに追加します。
ちなみに、 本来 multipart/alternative メッセージではマルチパートの順番にも意味があるので、 attach_alternative というより序列を意識した append_alternative なんて名前の方がいいんじゃないかな、とおもいます。
メッセージを作成したら、最後に send メソッドでメールを送信しますが、さて、このメールはどこに送信されるのでしょうか。
このメールシステムの設定がなかなか気が利いています。
メール・バックエンドの設定。ファイルシステムも選択可
メールを送信するための SMTP サーバーの設定及びそれを利用するための各種設定は settings.py に書きます。
設定例は次の通りです。
EMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST='your hostname goes here'
EMAIL_HOST_PASSWORD='your passwourd'
EMAIL_HOST_USER='your user name'
EMAIL_PORT='25'
EMAIL_BACKENDに django.core.mail.backends.smtp.EmailBackendを設定することで、SMTPを利用してメッセージを送信することを指定しています。
そのための各種設定は上記の通りです。パラメータの名前でそれぞれ意味がわかるでしょうから、一つ一つ説明しません。 ちなみに、EMAIL_HOST_PASSWORDを設定すれば SMTPの認証が要求される場合もサポートします。
ファイルベースも利用可能
ちなみに、SMTPサーバーが利用可能でない場合にはファイルベースのバックエンドも利用可能です。
例えば次のように設定します。smtp ではなく filebased が指定されていることに注目してください。
EMAIL_BACKEND='django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH='/home/accountname/temp'
このように指定すると、send メソッドでメール送信を試みると、EMIL_FILE_PATH で指定したディレクトリ内にテキストファイルが作成され、そこにメールメッセージの内容が出力されます。
サーバーが利用できない開発時などは、バックエンドをファイルベースに指定すると便利です。