Djangoを使ったメールの送信方法まとめ
スポンサーリンク
Python の smtplib モジュール に慣れている人には不要かもしれませんが、Django にもメール送信するための仕組みが備わっていますので簡単に紹介してみます。
Django 自体使ったことがないという方はこちらをどうぞ。
はじめに
本記事はこちらのコマンドでダミーSMTPサーバを起動している前提で話を進めます。
$ sudo python -m smtpd -n -c DebuggingServer -d localhost:25
settings.py に上記のサーバーへのアクセス情報を記載しておきましょう。これだけで Django がSMTPサーバを認識してくれます。
EMAIL_HOST = 'localhost' EMAIL_PORT = 25
なお、AWSの SES 等を利用する場合は当然認証情報が必要ですので、以下の項目を追加しておいてください。
EMAIL_HOST_USER = ユーザー
EMAIL_HOST_PASSWORD = パスワード
EMAIL_USE_TLS = True
単純なメール送信
それでは Django のインタラクティブコンソールでメールを送ってみます。使うのは一番単純なメール送信関数である send_mail
です。
$ ./manage.py shell >>> from django.core.mail import send_mail >>>send_mail('hello', 'this is message', 'from@racchai.com', ['to@racchai.com']) 1
返り値は送信に成功した数なので、今回は1が返れば成功です。起動しておいたダミーSMTPサーバのコンソールを確認してみます。
MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: hello From: from@racchai.com To: to@racchai.com Date: Wed, 27 Apr 2016 08:54:50 -0000 Message-ID: <20160427085450.80900.67436@ubuntu.local> X-Peer: 127.0.0.1 this is message
無事メールが送れていますね。
複数のメールを一度に送信する
メール本文に名前を入れる等の理由で送信先毎に内容が異なるような場合には send_mass_mail
を使います。
$ ./manage.py shell >>> from django.core.mail import send_mass_mail >>> message1 = ('message1 subject', 'this is message1', 'from@racchai.com', ['to1@racchai.com']) >>> message2 = ('message2 subject', 'this is message2', 'from@racchai.com', ['to2@racchai.com']) >>> send_mass_mail((message1, message2)) 2
2通のメール送信に成功しました。
---------- MESSAGE FOLLOWS ---------- MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: message1 subject From: from@racchai.com To: to1@racchai.com Date: Wed, 27 Apr 2016 09:04:22 -0000 Message-ID: <20160427090422.80900.33900@ubuntu.local> X-Peer: 127.0.0.1 this is message1 ------------ END MESSAGE ------------ ---------- MESSAGE FOLLOWS ---------- MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: message2 subject From: from@racchai.com To: to2@racchai.com Date: Wed, 27 Apr 2016 09:04:22 -0000 Message-ID: <20160427090422.80900.62258@ubuntu.local> X-Peer: 127.0.0.1 this is message2 ------------ END MESSAGE ------------
SMTP サーバの方にも確かに2通分届いていますね。
ちなみに send_mass_mail
では複数のメールを送る場合でも一度しかSMTPサーバとの接続を張らないようになっているため、大量の接続が張られてしまう心配はありません。
メールにファイルを添付する
send_mail
と send_mass_mail
にはファイルを添付する機能がありません。シンプルにテキストメールを送ることしかできないのです。そのため、ファイル添付のようなことをやりたくなったら、ある程度は自分で処理を書く必要があります。とはいっても大した処理ではありません。
添付ファイルを送る処理はこのようになります。
>>> from django.core.mail import EmailMessage >>> message = EmailMessage('subject', 'this is message', from_email='from@racchai.com', to=['to@racchai.com']) >>> message.attach('sample.txt', 'contents', 'text/plain') >>> message.send() 1
では実際に送信されるメールを見てみます。
---------- MESSAGE FOLLOWS ---------- Content-Type: multipart/mixed; boundary="===============5970738729801732969==" MIME-Version: 1.0 Subject: subject From: from@racchai.com To: to@racchai.com Date: Wed, 27 Apr 2016 12:28:09 -0000 Message-ID: <20160427122809.80900.57799@ubuntu.local> X-Peer: 127.0.0.1 --===============5970738729801732969== MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit this is message --===============5970738729801732969== MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="sample.txt" contents --===============5970738729801732969==-- ------------ END MESSAGE ------------
multipart なメッセージになり、sample.txt が添付されていますね。
ちなみに、CC や BCC も EmailMessage を使うことで実現できます。以下のように cc と bcc を指定してあげればOKです。
EmailMessage('subject', 'this is message', from_email='from@racchai.com', to=['to@racchai.com'], cc=['cc@racchai.com'], bcc=['bcc@racchai.com'])
複数の EmailMessageを一度に送信する
send_mass_mail
の中で、複数のメールを送る際に一度しかSMTPサーバとの接続を張らないようになっているという話をしました。以下のようにすることで、send_mass_mail
と同様に複数のEmailMessage を効率的に送信することができるようになります。
>>> from django.core import mail >>> connection = mail.get_connection() >>> message1 = mail.EmailMessage('subject', 'this is message1', from_email='from@racchai.com', to=['to1@racchai.com']) >>> message2 = mail.EmailMessage('subject', 'this is message2', from_email='from@racchai.com', to=['to2@racchai.com']) >>> connection.send_messages([message1, message2]) 2 >>> connection.close()
connection を手動で張っているため、クローズするのを忘れないように注意しましょう。
ひとこと
Django でのメール送信には多少のコードを書く必要がありますが、それでも smtplib モジュールを使うよりは楽に送信することができますね。それではまた!
Django×Python (LLフレームワークBOOKS)
- 作者: 露木誠
- 出版社/メーカー: 技術評論社
- 発売日: 2009/02/16
- メディア: 単行本(ソフトカバー)
- 購入: 10人 クリック: 129回
- この商品を含むブログ (36件) を見る