HTML メールの送信

いろいろなコミュニケーションチャネルが出来てきましたが、 メールは今でも健在です。 用途によっては Twitter やらテキストメッセージなどに取って代わられる場面はあるでしょうが、 各種通知機能としてメールが消えることはまず無いでしょう。

Webサイトを構築していても、ユーザーにメールを送信したい場面は度々発生します。

この資料では Django の EmailMultiAlternatives を用いたメールの送信方法を示します。

EmailMultiAlternatives とは?

EmailMultiAlternativesEmailMessage クラスから派生したクラスです。 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_BACKENDdjango.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 で指定したディレクトリ内にテキストファイルが作成され、そこにメールメッセージの内容が出力されます。

サーバーが利用できない開発時などは、バックエンドをファイルベースに指定すると便利です。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門