メールを送信する¶
Python は smtplib モジュールを使ってメール送信インタフェースを提供していますが、Django はさらにいくつかの軽いラッパーを用意しています。これらのラッパーは、 メールをよりすばやく送信したり、開発中にメール送信をテストしたり、SMTP を使用できないプラットフォームをサポートしたりするために用意されています。
コードは django.core.mail モジュールにあります。
簡単な例¶
簡単なメール送信には send_mail() を使用します。たとえば、プレーンテキストのメッセージを送信するには、次のようにします。
from django.core.mail import send_mail
send_mail(
"Subject here",
"Here is the message.",
"from@example.com",
["to@example.com"],
fail_silently=False,
)
追加のメール送信機能が必要な場合は、EmailMessage または EmailMultiAlternatives を使用してください。例えば、特定のテンプレートとカスタムヘッダーを使用して、HTMLバージョンとプレーンテキストバージョンの両方を含むマルチパートメールを送信する場合は、次のようにします。
from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
# First, render the plain text content.
text_content = render_to_string(
"templates/emails/my_email.txt",
context={"my_variable": 42},
)
# Secondly, render the HTML content.
html_content = render_to_string(
"templates/emails/my_email.html",
context={"my_variable": 42},
)
# Then, create a multipart email instance.
msg = EmailMultiAlternatives(
subject="Subject here",
body=text_content,
from_email="from@example.com",
to=["to@example.com"],
headers={"List-Unsubscribe": "<mailto:unsub@example.com>"},
)
# Lastly, attach the HTML content to the email instance and send.
msg.attach_alternative(html_content, "text/html")
msg.send()
設定内の EMAIL_HOST と EMAIL_PORT で指定された SMTP ホストとポートを使用して、メールが送信されます。EMAIL_HOST_USER と EMAIL_HOST_PASSWORD が指定されている場合は、SMTP サーバーの認証に使われます。そして、EMAIL_USE_TLS と EMAIL_USE_SSL 設定により、セキュアコネクションを使うかどうかをコントロールします。
注釈
django.core.mail で送信されるメールの文字セットは、DEFAULT_CHARSET 設定の値にセットされます。
send_mail()¶
- send_mail(subject, message, from_email, recipient_list, *, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None)[ソース]¶
ほとんどの場合、 django.core.mail.send_mail() を使ってメールを送信できます。
subject、message、from_email、recipient_list の 4 つの引数は必須です。
subject: 文字列。message: 文字列。from_email: 文字列。もしNoneなら、 Django はDEFAULT_FROM_EMAIL設定の値を使います。recipient_list: メールアドレスを表す文字列のリスト。recipient_listの各メンバーは、メールメッセージの "To:" フィールドで他の受信者を見ることができます。
The following parameters are optional, and must be given as keyword arguments if used.
fail_silently: 真偽値です。これがFalseの場合、エラーが発生したときにsend_mail()はsmtplib.SMTPExceptionを発生させます。可能な例外のリストについてはsmtplibのドキュメントを参照してください。これらの例外はすべてSMTPExceptionのサブクラスです。auth_user: SMTP サーバー認証のためのユーザー名で、省略可能。指定されなかった場合、DjangoEMAIL_HOST_USER設定の値を使います。auth_password: SMTP サーバー認証のためのパスワードで、省略可能。指定されなかった場合、Django はEMAIL_HOST_PASSWORD設定の値を使います。connection: メール送信のために使うバックエンドで、省略可能。指定しなかった場合、デフォルトのバックエンドのインスタンスが使われます。詳しくは メールのバックエンド を参照してください。html_message:html_messageが指定された場合、送信されるメールは multipart/alternative となり、text/plain コンテンツタイプを持つmessageと text/html コンテンツタイプを持つhtml_messageを合わせ持つものになります。
返り値は、送信に成功したメッセージの数です (送信されるメッセージが 1 つだけの場合もあるため、0 や 1 になることもあります)。
Deprecated since version 6.0: Passing fail_silently and later parameters as positional arguments is
deprecated.
send_mass_mail()¶
- send_mass_mail(datatuple, *, fail_silently=False, auth_user=None, auth_password=None, connection=None)[ソース]¶
django.core.mail.send_mass_mail() は、大量のメール送信を扱うために用意されています。
datatuple はメッセージの集合を表すタプルです。タプル内の各要素は、それぞれ1種類のメッセージを表すタプルであり、次の形式を持ちます。
(subject, message, from_email, recipient_list)
fail_silently, auth_user, auth_password and connection have the
same functions as in send_mail(). They must be given as keyword arguments
if used.
Each separate element of datatuple results in a separate email message.
As in send_mail(), recipients in the same recipient_list will all see
the other addresses in the email messages' "To:" field.
たとえば、次のコードは異なる 2 つのメッセージを 異なる 2 つの受信者のセットに送信します。しかし、メールサーバーへのコネクションは 1 つしか開かれません。
message1 = (
"Subject here",
"Here is the message",
"from@example.com",
["first@example.com", "other@example.com"],
)
message2 = (
"Another Subject",
"Here is another message",
"from@example.com",
["second@test.com"],
)
send_mass_mail((message1, message2), fail_silently=False)
戻り値は、メッセージ送信に成功した数です。
Deprecated since version 6.0: Passing fail_silently and later parameters as positional arguments is
deprecated.
send_mass_mail() と send_mail() の比較¶
The main difference between send_mass_mail() and send_mail() is
that send_mail() opens a connection to the mail server each time it's
executed, while send_mass_mail() uses a single connection for all of its
messages. This makes send_mass_mail() slightly more efficient.
mail_admins()¶
django.core.mail.mail_admins() は、ADMINS 設定で定義されているサイト管理者 (admin) に対してメールを送信するためのショートカットです。
mail_admins() は件名の前に EMAIL_SUBJECT_PREFIX 設定の値を付けますが、デフォルトでは "[Django] " です。
メールの "From: " ヘッダは SERVER_EMAIL 設定の値になります。
このメソッドは利便性と読みやすさのために存在します。
html_message が指定された場合、送信されるメールは multipart/alternative となり、text/plain コンテンツタイプを持つ message と text/html コンテンツタイプを持つ html_message を合わせ持つものになります。
Deprecated since version 6.0: Passing fail_silently and later parameters as positional arguments is
deprecated.
mail_managers()¶
django.core.mail.mail_managers() は、mail_admins() とほぼ同じで、MANAGERS 設定で定義されているサイト管理者 (manager) にメールを送信します。
Deprecated since version 6.0: Passing fail_silently and later parameters as positional arguments is
deprecated.
例¶
以下の例は、john@example.com と jane@example.com に1つのメールを送信します。2人とも "To:" 内に宛先が見られます。
send_mail(
"Subject",
"Message.",
"from@example.com",
["john@example.com", "jane@example.com"],
)
This sends a message to john@example.com and jane@example.com, with
them both receiving a separate email:
datatuple = (
("Subject", "Message.", "from@example.com", ["john@example.com"]),
("Subject", "Message.", "from@example.com", ["jane@example.com"]),
)
send_mass_mail(datatuple)
ヘッダインジェクションを防止する¶
ヘッダインジェクション は、攻撃者が 、スクリプトで生成されたメールメッセージの "To:" と "From:" をコントロールするために、メールヘッダを挿入してしまうセキュリティ上の脆弱性です。
The Django email functions outlined above all protect against header injection
by forbidding newlines in header values. If any subject, from_email or
recipient_list contains a newline (in either Unix, Windows or Mac style),
the email function (e.g. send_mail()) will raise ValueError and,
hence, will not send the email. It's your responsibility to validate all data
before passing it to the email functions.
ヘッダーが含まれている文字列を message として渡した場合、ヘッダー部分はメールメッセージの冒頭に出力されます。
Here's an example view that takes a subject, message and from_email
from the request's POST data, sends that to admin@example.com and redirects
to "/contact/thanks/" when it's done:
from django.core.mail import send_mail
from django.http import HttpResponse, HttpResponseRedirect
def send_email(request):
subject = request.POST.get("subject", "")
message = request.POST.get("message", "")
from_email = request.POST.get("from_email", "")
if subject and message and from_email:
try:
send_mail(subject, message, from_email, ["admin@example.com"])
except ValueError:
return HttpResponse("Invalid header found.")
return HttpResponseRedirect("/contact/thanks/")
else:
# In reality we'd use a form class
# to get proper validation errors.
return HttpResponse("Make sure all fields are entered and valid.")
Older versions raised django.core.mail.BadHeaderError for some
invalid headers. This has been replaced with ValueError.
EmailMessage クラス¶
Django's send_mail() and send_mass_mail() functions are actually
thin wrappers that make use of the EmailMessage class.
Not all features of the EmailMessage class are available through the
send_mail() and related wrapper functions. If you wish to use advanced
features, such as BCC'ed recipients, file attachments, or multi-part email,
you'll need to create EmailMessage instances directly.
注釈
This is a design feature. send_mail() and related functions were
originally the only interface Django provided. However, the list of
parameters they accepted was slowly growing over time. It made sense to
move to a more object-oriented design for email messages and retain the
original functions only for backwards compatibility.
EmailMessage is responsible for creating the email message itself. The
email backend is then responsible for sending the
email.
For convenience, EmailMessage provides a send()
method for sending a single email. If you need to send multiple messages, the
email backend API provides an alternative.
EmailMessage オブジェクト¶
- class EmailMessage[ソース]¶
The
EmailMessageclass is initialized with the following parameters. All parameters are optional and can be set at any time prior to calling thesend()method.The first four parameters can be passed as positional or keyword arguments, but must be in the given order if positional arguments are used:
subject: メールの件名の行。body: 本文のテキスト。プレーンテキストのメッセージでなければなりません。from_email: 送信者のアドレス。fred@example.comと"Fred" <fred@example.com>のどちらの形式でも構いません。省略された場合はDEFAULT_FROM_EMAILの設定が使用されます。to: 受信者のメールアドレスのリストまたはタプル。
The following parameters must be given as keyword arguments if used:
メールを送信するときに "Cc" ヘッダ内で使われる、受信者のアドレスのリストまたはタプル。
bcc: メールを送信するときに "Bcc" ヘッダ内で使われるメールアドレスのリストまたはタプル。reply_to: メールを送信するときに "Reply-To" ヘッダ内で使われる、受信者のアドレスのリストまたはタプル。attachments: A list of attachments to put on the message. Each can be an instance ofMIMEPartorEmailAttachment, or a tuple with attributes(filename, content, mimetype).Changed in Django 5.2:Support for
EmailAttachmentitems ofattachmentswas added.Changed in Django 6.0:Support for
MIMEPartobjects in theattachmentslist was added.headers: メッセージに追加するヘッダーの辞書。キーはヘッダ名、値はヘッダ値です。メールメッセージに対して適切なヘッダ名と値にするのは、呼び出す側の責任です。対応する属性はextra_headersです。connection: An email backend instance. Use this parameter if you are sending theEmailMessageviasend()and you want to use the same connection for multiple messages. If omitted, a new connection is created whensend()is called. This parameter is ignored when using send_messages().
Deprecated since version 6.0: Passing all except the first four parameters as positional arguments is deprecated.
例:
from django.core.mail import EmailMessage email = EmailMessage( subject="Hello", body="Body goes here", from_email="from@example.com", to=["to1@example.com", "to2@example.com"], bcc=["bcc@example.com"], reply_to=["another@example.com"], headers={"Message-ID": "foo"}, )
このクラスには以下のメソッドがあります。
- send(fail_silently=False)[ソース]¶
Sends the message. If a connection was specified when the email was constructed, that connection will be used. Otherwise, an instance of the default backend will be instantiated and used. If the keyword argument
fail_silentlyisTrue, exceptions raised while sending the message will be quashed. An empty list of recipients will not raise an exception. It will return1if the message was sent successfully, otherwise0.
- message(policy=email.policy.default)[ソース]¶
Constructs and returns a Python
email.message.EmailMessageobject representing the message to be sent.The keyword argument
policyallows specifying the set of rules for updating and serializing the representation of the message. It must be anemail.policy.Policyobject. Defaults toemail.policy.default. In certain cases you may want to useSMTP,SMTPUTF8or a custom policy. For example,django.core.mail.backends.smtp.EmailBackenduses theSMTPpolicy to ensure\r\nline endings as required by the SMTP protocol.If you ever need to extend Django's
EmailMessageclass, you'll probably want to override this method to put the content you want into the Python EmailMessage object.Changed in Django 6.0:The
policykeyword argument was added and the return type was updated to an instance ofEmailMessage.
- recipients()[ソース]¶
Returns a list of all the recipients of the message, whether they're recorded in the
to,ccorbccattributes. This is another method you might need to override when subclassing, because the SMTP server needs to be told the full list of recipients when the message is sent. If you add another way to specify recipients in your class, they need to be returned from this method as well.
- attach(filename, content, mimetype)[ソース]¶
- attach(mimepart)
Creates a new attachment and adds it to the message. There are two ways to call
attach():You can pass it three arguments:
filename,contentandmimetype.filenameis the name of the file attachment as it will appear in the email,contentis the data that will be contained inside the attachment andmimetypeis the optional MIME type for the attachment. If you omitmimetype, the MIME content type will be guessed from the filename of the attachment.例:
message.attach("design.png", img_data, "image/png")
If you specify a
mimetypeof message/rfc822,contentcan be adjango.core.mail.EmailMessageor Python'semail.message.EmailMessageoremail.message.Message.text/ で始まる
mimetypeでは、コンテンツは文字列であることが期待されます。バイナリデータはUTF-8でデコードされ、それが失敗した場合、MIMEタイプは application/octet-stream に変更され、データは変更されずに添付されます。Or for attachments requiring additional headers or parameters, you can pass
attach()a single PythonMIMEPartobject. This will be attached directly to the resulting message. For example, to attach an inline image with a Content-ID:cid = email.utils.make_msgid() inline_image = email.message.MIMEPart() inline_image.set_content( image_data_bytes, maintype="image", subtype="png", disposition="inline", cid=f"<{cid}>", ) message.attach(inline_image) message.attach_alternative(f'… <img src="cid:${cid}"> …', "text/html")
Python's
email.contentmanager.set_content()documentation describes the supported arguments forMIMEPart.set_content().Changed in Django 6.0:Support for
MIMEPartattachments was added.Deprecated since version 6.0: Support for
email.mime.base.MIMEBaseattachments is deprecated. UseMIMEPartinstead.
- attach_file(path, mimetype=None)[ソース]¶
Creates a new attachment using a file from your filesystem. Call it with the path of the file to attach and, optionally, the MIME type to use for the attachment. If the MIME type is omitted, it will be guessed from the filename. You can use it like this:
message.attach_file("/images/weather_map.png")
For MIME types starting with text/, binary data is handled as in
attach().
- class EmailAttachment¶
- New in Django 5.2.
メールに添付するファイルを保持するための名前付きタプルです。
この名前付きタプルは、下記のインデックスを持ちます:
filenamecontentmimetype
代替のコンテンツタイプを送信する¶
複数のバージョンを持つコンテンツを送る¶
It can be useful to include multiple versions of the content in an email; the
classic example is to send both text and HTML versions of a message. With
Django's email library, you can do this using the
EmailMultiAlternatives class.
- class EmailMultiAlternatives[ソース]¶
attach_alternative()メソッドを通じて、メール本文の別バージョンを追加できるようにしたEmailMessageのサブクラスです。このクラスはEmailMessageからすべてのメソッド(初期化メソッドも含む)をそのまま継承しています。- alternatives¶
A list of
EmailAlternativenamed tuples. This is particularly useful in tests:self.assertEqual(len(msg.alternatives), 1) self.assertEqual(msg.alternatives[0].content, html_content) self.assertEqual(msg.alternatives[0].mimetype, "text/html")
代替コンテンツは、
attach_alternative()メソッドを使って追加するか、コンストラクタに渡して指定する必要があります。Changed in Django 5.2:In older versions,
alternativeswas a list of regular tuples, as opposed toEmailAlternativenamed tuples.
- attach_alternative(content, mimetype)[ソース]¶
メール内にメッセージ本文の代替の表現を添付します。
例えば、テキスト版とHTML版を組み合わせて送信する場合、次のようにします。
from django.core.mail import EmailMultiAlternatives subject = "hello" from_email = "from@example.com" to = "to@example.com" text_content = "This is an important message." html_content = "<p>This is an <strong>important</strong> message.</p>" msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) msg.attach_alternative(html_content, "text/html") msg.send()
- body_contains(text)[ソース]¶
- New in Django 5.2.
指定された
textが、メールのbodyおよびすべてのtext/*MIME タイプの代替コンテンツに含まれているかどうかを示す真偽値を返します。これはメールのテストのときに便利です。たとえば:
def test_contains_email_content(self): subject = "Hello World" from_email = "from@example.com" to = "to@example.com" msg = EmailMultiAlternatives(subject, "I am content.", from_email, [to]) msg.attach_alternative("<p>I am content.</p>", "text/html") self.assertIs(msg.body_contains("I am content"), True) self.assertIs(msg.body_contains("<p>I am content.</p>"), False)
- class EmailAlternative¶
- New in Django 5.2.
メールコンテンツの別バージョンを保持するための名前付きタプルです。
この名前付きタプルは、下記のインデックスを持ちます:
contentmimetype
デフォルトのコンテンツタイプを変更する¶
By default, the MIME type of the body parameter in an EmailMessage
is "text/plain". It is good practice to leave this alone, because it
guarantees that any recipient will be able to read the email, regardless of
their mail client. However, if you are confident that your recipients can
handle an alternative content type, you can use the content_subtype
attribute on the EmailMessage class to change the main content type.
The major type will always be "text", but you can change the subtype. For
example:
msg = EmailMessage(subject, html_content, from_email, [to])
msg.content_subtype = "html" # Main content is now text/html
msg.send()
メールのバックエンド¶
実際のメール送信は、メールバックエンドによって処理されます。
メールバックエンドのクラスには以下のメソッドがあります:
open()は、長寿命のメール送信のコネクションをインスタンス化します。close()は、現在のメール送信のコネクションを閉じます。send_messages(email_messages)sends a list ofEmailMessageobjects. If the connection is not open, this call will implicitly open the connection, and close the connection afterward. If the connection is already open, it will be left open after mail has been sent.
コンテキストマネジャーとしても使うことができ、必要に応じて自動的に open() と close() 呼びます:
from django.core import mail
with mail.get_connection() as connection:
mail.EmailMessage(
subject1,
body1,
from1,
[to1],
connection=connection,
).send()
mail.EmailMessage(
subject2,
body2,
from2,
[to2],
connection=connection,
).send()
メールバックエンドのインスタンスを取得する¶
django.core.mail 内の get_connection() 関数は、利用可能なメールバックエンドのインスタンスを返します。
デフォルトでは、get_connection() を呼び出すと EMAIL_BACKEND 内で指定されたメールバックエンドのインスタンスを返します。backend 引数を指定した場合、そのバックエンドがインスタンス化されます。
The keyword-only fail_silently argument controls how the backend should
handle errors. If fail_silently is True, exceptions during the email
sending process will be silently ignored.
その他のキーワード引数はメールバックエンドのコンストラクタに直接渡されます。
Django には複数のメール送信バックエンドを付属しています。SMTP バックエンド (デフォルトです) を除いて、これらのバックエンドはテストと開発のみで役立ちます。特別なメール送信が必要な場合には、独自のメールバックエンドを記述する を参照してください。
Deprecated since version 6.0: Passing fail_silently as positional argument is deprecated.
SMTP バックエンド¶
- class backends.smtp.EmailBackend(host=None, port=None, username=None, password=None, use_tls=None, fail_silently=False, use_ssl=None, timeout=None, ssl_keyfile=None, ssl_certfile=None, **kwargs)¶
デフォルトのバックエンド。メールは SMTP サーバを通して送信されます。
引数が
Noneの場合、各引数に対する値は、以下のそれぞれの設定から取得されます。host:EMAIL_HOSTport:EMAIL_PORTusername:EMAIL_HOST_USERpassword:EMAIL_HOST_PASSWORDuse_tls:EMAIL_USE_TLSuse_ssl:EMAIL_USE_SSLtimeout:EMAIL_TIMEOUTssl_keyfile:EMAIL_SSL_KEYFILEssl_certfile:EMAIL_SSL_CERTFILE
SMTP バックエンドは、Django によって継承されるデフォルトの構成です。明示的に指定したい場合は、設定内で以下の通り記述してください:
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
If unspecified, the default
timeoutwill be the one provided bysocket.getdefaulttimeout(), which defaults toNone(no timeout).
コンソールバックエンド¶
実際のメールを送信する代わりに、コンソールバックエンドは単に標準出力に送信されるメールを書き込みます。 デフォルトでは、コンソールバックエンドは stdout に書き込みます。 コネクションを構築するときに stream キーワード引数を指定することで、別のストリーム的なオブジェクトを使用できます。
このバックエンドを指定するには、設定内に以下の通り記述してください:
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
このバックエンドはプロダクトでの使用を想定していません -- 開発中の利便性のために提供されています。
ファイルバックエンド¶
The file backend writes emails to a file. A new file is created for each new
session that is opened on this backend. The directory to which the files are
written is either taken from the EMAIL_FILE_PATH setting or from the
file_path keyword when creating a connection with get_connection().
このバックエンドを指定するには、設定内に以下の通り記述してください:
EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend"
EMAIL_FILE_PATH = "/tmp/app-messages" # change this to a proper location
このバックエンドはプロダクトでの使用を想定していません -- 開発中の利便性のために提供されています。
インメモリーバックエンド¶
The 'locmem' backend stores messages in a special attribute of the
django.core.mail module. The outbox attribute is created when the first
message is sent. It's a list with an EmailMessage instance for each
message that would be sent.
このバックエンドを指定するには、設定内に以下の通り記述してください:
EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"
このバックエンドはプロダクトでの使用を想定していません -- 開発とテストにおける利便性のために提供されています。
Django のテストランナーは 自動的にこのバックエンドをテストに使います 。
ダミーバックエンド¶
名前が示すように、ダミーバックエンドはメッセージに何もしません。このバックエンドを指定するには、設定内に以下の通り記述してください:
EMAIL_BACKEND = "django.core.mail.backends.dummy.EmailBackend"
このバックエンドはプロダクトでの使用を想定していません -- 開発中の利便性のために提供されています。
There are community-maintained solutions too!
Django has a vibrant ecosystem. There are email backends highlighted on the Community Ecosystem page. The Django Packages Email grid has even more options for you!
独自のメールバックエンドを定義する¶
メール送信の方法を変更する必要がある場合、独自のメールバックエンドを記述できます。設定ファイル内の EMAIL_BACKEND 設定が独自のバックエンドのクラスへの Python のインポートパスとなります。
Custom email backends should subclass BaseEmailBackend that is located in
the django.core.mail.backends.base module. A custom email backend must
implement the send_messages(email_messages) method. This method receives a
list of EmailMessage instances and returns the number of successfully
delivered messages. If your backend has any concept of a persistent session or
connection, you should also implement the open() and close() methods.
Refer to smtp.EmailBackend for a reference implementation.
複数のメールを送信する¶
SMTP コネクション (またはその他のネットワークコネクション) の確立とクローズは、負荷の高い処理です。 送信するメールがたくさんある場合は、メールを送信するたびにコネクションの生成と破棄を繰り返すのではなく、SMTP コネクションを再利用する方が効率的です。
メールバックエンドにコネクションを再利用するよう通知するには、2 つの方法があります。
1つめは、1つの接続のもとで send_messages() メソッドを使用する方法です。このメソッドは、 EmailMessage (またはそのサブクラス)のインスタンスのリストを受け取り、それらすべてを1つの接続を使用して送信します。その結果、個々のメッセージに設定された connection は無視されます。
For example, if you have a function called get_notification_email() that
returns a list of EmailMessage objects representing some periodic
email you wish to send out, you could send these emails using a single call to
send_messages():
from django.core import mail
connection = mail.get_connection() # Use default email connection
messages = get_notification_email()
connection.send_messages(messages)
この例では、send_messages() を呼び出してバックエンドのコネクションを開き、メッセージのリストを送信した後、再びコネクションを閉じています。
2つ目のアプローチは、メールバックエンドの open() メソッドと close() メソッドを使って手動でコネクションをコントロールする方法です。send_messages() は、すでにコネクションが開いている場合、自動でコネクションを開いたり閉じたりはしません。手動でコネクションを開いた場合、閉じるタイミングを自分でコントロールできます。たとえば、次のように書くことができます。
from django.core import mail
connection = mail.get_connection()
# Manually open the connection
connection.open()
# Construct an email message that uses the connection
email1 = mail.EmailMessage(
"Hello",
"Body goes here",
"from@example.com",
["to1@example.com"],
connection=connection,
)
email1.send() # Send the email
# Construct two more messages
email2 = mail.EmailMessage(
"Hello",
"Body goes here",
"from@example.com",
["to2@example.com"],
)
email3 = mail.EmailMessage(
"Hello",
"Body goes here",
"from@example.com",
["to3@example.com"],
)
# Send the two emails in a single call -
connection.send_messages([email2, email3])
# The connection was already open so send_messages() doesn't close it.
# We need to manually close the connection.
connection.close()
開発用にメールを設定する¶
Django に電子メールをまったく送信させたくない場合もあるでしょう。たとえば、ウェブサイトの開発中に数千通のメールを送信したくはないでしょう。しかし、適切な条件で適切な人々にメールが送信され、これらのメールが正しい内容を含んでいるか検証したいことがあるかもしれません。
ローカル開発用にメールを設定する最も簡単な方法は console メールバックエンドを使うことです。このバックエンドはすべてのメールを stdout にリダイレクトし、メールの内容を検査できるようにします。
ファイル メールバックエンドも開発に役立ちます。このバックエンドは全ての SMTP コネクションをファイルにダンプし、都合の良いときに調べられるようにします。
もう1つのアプローチは、「ダム」SMTPサーバーを使用することです。このサーバーはメールをローカルで受信し、端末に表示するだけで、実際には何も送信しません。これを実現するには、aiosmtpd パッケージを利用する方法があります。
python -m pip install "aiosmtpd >= 1.4.5"
python -m aiosmtpd -n -l localhost:8025
このコマンドは、localhostのポート8025で待ち受ける最小限のSMTPサーバを起動します。このサーバはすべてのメールヘッダとメール本文を標準出力に出力します。あとは EMAIL_HOST と EMAIL_PORT を適宜設定するだけです。SMTPサーバのオプションについてのより詳細な議論については、 aiosmtpd モジュールのドキュメントを参照してください。
アプリケーションでのメール送信のユニットテストについては、テストのドキュメントの メールサービス セクションを参照してください。