らっちゃいブログ

日々の学びと気づきを発信するブログ

Djangoを使ったメールの送信方法まとめ

スポンサーリンク

Python の smtplib モジュール に慣れている人には不要かもしれませんが、Django にもメール送信するための仕組みが備わっていますので簡単に紹介してみます。

Django 自体使ったことがないという方はこちらをどうぞ。

racchai.hatenablog.com

はじめに

本記事はこちらのコマンドでダミーSMTPサーバを起動している前提で話を進めます。

$ sudo python -m smtpd -n -c DebuggingServer -d localhost:25

settings.py に上記のサーバーへのアクセス情報を記載しておきましょう。これだけで DjangoSMTPサーバを認識してくれます。

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_mailsend_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)

Django×Python (LLフレームワークBOOKS)