{"title":"发送邮件","version":"5.1","locale":"zh-hans","docname":"topics/email","url":"/zh-hans/5.1/topics/email/","canonical":"https://djangodocs.dev/zh-hans/5.1/topics/email/","summary":"虽然 Python 通过 smtplib 模块提供了邮件发送的接口，但是 Django 在其基础上提供了更简化的支持。这些封装意在加快邮件发送，在开发时测试发送邮件，在不支持 SMTP 的平台上支持发送邮件。 这些代码位于 django.core.mail 模块。 快速示例 Link to this heading # 使用…","html":"<span id=\"sending-email\"></span><h1>发送邮件<a class=\"heading-anchor\" href=\"#module-django.core.mail\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>虽然 Python 通过 <a class=\"reference external\" href=\"https://docs.python.org/3/library/smtplib.html#module-smtplib\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">smtplib</span></code></a> 模块提供了邮件发送的接口，但是 Django 在其基础上提供了更简化的支持。这些封装意在加快邮件发送，在开发时测试发送邮件，在不支持 SMTP 的平台上支持发送邮件。</p>\n<p>这些代码位于 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail</span></code> 模块。</p>\n<section id=\"quick-examples\">\n<h2>快速示例<a class=\"heading-anchor\" href=\"#quick-examples\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>使用 <a class=\"reference internal\" href=\"#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code></a> 进行简单的邮件发送。例如，发送纯文本消息：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">send_mail</span>\n\n<span class=\"n\">send_mail</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;Subject here&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Here is the message.&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;from@example.com&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">[</span><span class=\"s2\">&quot;to@example.com&quot;</span><span class=\"p\">],</span>\n    <span class=\"n\">fail_silently</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>当需要额外的邮件发送功能时，使用 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 或 <a class=\"reference internal\" href=\"#django.core.mail.EmailMultiAlternatives\" title=\"django.core.mail.EmailMultiAlternatives\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMultiAlternatives</span></code></a>。例如，发送包含 HTML 和纯文本版本的多部分邮件，使用特定模板和自定义标头，可以采用以下方法：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">EmailMultiAlternatives</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template.loader</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render_to_string</span>\n\n<span class=\"c1\"># First, render the plain text content.</span>\n<span class=\"n\">text_content</span> <span class=\"o\">=</span> <span class=\"n\">render_to_string</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;templates/emails/my_email.txt&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">context</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;my_variable&quot;</span><span class=\"p\">:</span> <span class=\"mi\">42</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n\n<span class=\"c1\"># Secondly, render the HTML content.</span>\n<span class=\"n\">html_content</span> <span class=\"o\">=</span> <span class=\"n\">render_to_string</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;templates/emails/my_email.html&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">context</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;my_variable&quot;</span><span class=\"p\">:</span> <span class=\"mi\">42</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n\n<span class=\"c1\"># Then, create a multipart email instance.</span>\n<span class=\"n\">msg</span> <span class=\"o\">=</span> <span class=\"n\">EmailMultiAlternatives</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;Subject here&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">text_content</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;from@example.com&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">[</span><span class=\"s2\">&quot;to@example.com&quot;</span><span class=\"p\">],</span>\n    <span class=\"n\">headers</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;List-Unsubscribe&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&lt;mailto:unsub@example.com&gt;&quot;</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n\n<span class=\"c1\"># Lastly, attach the HTML content to the email instance and send.</span>\n<span class=\"n\">msg</span><span class=\"o\">.</span><span class=\"n\">attach_alternative</span><span class=\"p\">(</span><span class=\"n\">html_content</span><span class=\"p\">,</span> <span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">msg</span><span class=\"o\">.</span><span class=\"n\">send</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>邮件是通过 SMTP 主机和端口发送的，由配置项 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST</span></code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_PORT</span></code></a> 指定。如果配置了 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_HOST_USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST_USER</span></code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_HOST_PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST_PASSWORD</span></code></a> ，那么它们将被用来验证  SMTP 服务器。配置项 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_USE_TLS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_USE_TLS</span></code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_USE_SSL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_USE_SSL</span></code></a> 控制是否使用安全连接。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail</span></code> 发送的邮件的字符编码由 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-DEFAULT_CHARSET\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEFAULT_CHARSET</span></code></a> 设置项指定。</p>\n</aside>\n</section>\n<section id=\"send-mail\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code><a class=\"heading-anchor\" href=\"#send-mail\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.mail.send_mail\">\n<span class=\"sig-name descname\"><span class=\"pre\">send_mail</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">subject</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">message</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">from_email</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">recipient_list</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fail_silently</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">auth_user</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">auth_password</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">connection</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">html_message</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.mail.send_mail\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在大多数情况里，你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail.send_mail()</span></code> 来发送邮件。</p>\n<p>参数 <code class=\"docutils literal notranslate\"><span class=\"pre\">subject</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">message</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">from_email</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">recipient_list</span></code> 是必须的。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">subject</span></code>: 一个字符串。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">message</span></code>: 一个字符串。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">from_email</span></code> ：字符串。如果为 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> ，Django 将使用 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-DEFAULT_FROM_EMAIL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEFAULT_FROM_EMAIL</span></code></a> 设置的值。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">recipient_list</span></code>: 一个字符串列表，每项都是一个邮箱地址。<code class=\"docutils literal notranslate\"><span class=\"pre\">recipient_list</span></code> 中的每个成员都可以在邮件的 &quot;收件人:&quot; 中看到其他的收件人。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">fail_silently</span></code>: 一个布尔值。若为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>， <code class=\"docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code> 会在发生错误时抛出 <a class=\"reference external\" href=\"https://docs.python.org/3/library/smtplib.html#smtplib.SMTPException\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">smtplib.SMTPException</span></code></a> 。可在 <a class=\"reference external\" href=\"https://docs.python.org/3/library/smtplib.html#module-smtplib\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">smtplib</span></code></a> 文档找到一系列可能的异常，它们都是 <a class=\"reference external\" href=\"https://docs.python.org/3/library/smtplib.html#smtplib.SMTPException\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">SMTPException</span></code></a> 的子类。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">auth_user</span></code>: 可选的用户名，用于验证登陆 SMTP 服务器。 若未提供，Django 会使用 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_HOST_USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST_USER</span></code></a> 指定的值。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">auth_password</span></code>: 可选的密码，用于验证登陆 SMTP 服务器。若未提供， Django 会使用 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_HOST_PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST_PASSWORD</span></code></a> 指定的值。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection</span></code>: 可选参数，发送邮件使用的后端。若未指定，则使用默认的后端。查询 <a class=\"reference internal\" href=\"#topic-email-backends\"><span class=\"std std-ref\">邮件后端</span></a> 文档获取更多细节。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">html_message</span></code>: 若提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">html_message</span></code>，会使邮件成为 <em class=\"mimetype\">multipart/alternative</em> 的实例， <code class=\"docutils literal notranslate\"><span class=\"pre\">message</span></code> 的内容类型则是 <em class=\"mimetype\">text/plain</em> ，并且 <code class=\"docutils literal notranslate\"><span class=\"pre\">html_message</span></code> 的内容类型是 <em class=\"mimetype\">text/html</em> 。</p></li>\n</ul>\n<p>返回值会是成功发送的信息的数量（只能是 <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code> ，因为同时只能发送一条消息）。</p>\n</section>\n<section id=\"send-mass-mail\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">send_mass_mail()</span></code><a class=\"heading-anchor\" href=\"#send-mass-mail\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.mail.send_mass_mail\">\n<span class=\"sig-name descname\"><span class=\"pre\">send_mass_mail</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">datatuple</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fail_silently</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">auth_user</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">auth_password</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">connection</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.mail.send_mass_mail\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail.send_mass_mail()</span></code> 用于批量发送邮件。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">datatuple</span></code> 是一个元组，形式如下:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">(</span><span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"p\">,</span> <span class=\"n\">from_email</span><span class=\"p\">,</span> <span class=\"n\">recipient_list</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">fail_silently</span></code>， <code class=\"docutils literal notranslate\"><span class=\"pre\">auth_user</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">auth_password</span></code> 拥有在 <a class=\"reference internal\" href=\"#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code></a> 中一样的功能。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">datatuple</span></code> 参数的每个元素会生成一份独立的邮件内容。就像 <a class=\"reference internal\" href=\"#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code></a> 中的一样， <code class=\"docutils literal notranslate\"><span class=\"pre\">recipient_list</span></code> 中的每个收件人会在邮件的 &quot;收件人:&quot; 中看到其他收件人的地址一样。</p>\n<p>举个例子，以下代码会向两个不同的收件人列表发送两封不同的邮件，却复用了同一条连接:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">message1</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n    <span class=\"s2\">&quot;Subject here&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Here is the message&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;from@example.com&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">[</span><span class=\"s2\">&quot;first@example.com&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;other@example.com&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">)</span>\n<span class=\"n\">message2</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n    <span class=\"s2\">&quot;Another Subject&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Here is another message&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;from@example.com&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">[</span><span class=\"s2\">&quot;second@test.com&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">)</span>\n<span class=\"n\">send_mass_mail</span><span class=\"p\">((</span><span class=\"n\">message1</span><span class=\"p\">,</span> <span class=\"n\">message2</span><span class=\"p\">),</span> <span class=\"n\">fail_silently</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>返回值是成功发送的消息的数量。</p>\n<section id=\"send-mass-mail-vs-send-mail\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">send_mass_mail()</span></code> vs. <code class=\"docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code><a class=\"heading-anchor\" href=\"#send-mass-mail-vs-send-mail\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The main difference between <a class=\"reference internal\" href=\"#django.core.mail.send_mass_mail\" title=\"django.core.mail.send_mass_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mass_mail()</span></code></a> and\n<a class=\"reference internal\" href=\"#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code></a> is that\n<a class=\"reference internal\" href=\"#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code></a> opens a connection to the mail server\neach time it's executed, while <a class=\"reference internal\" href=\"#django.core.mail.send_mass_mail\" title=\"django.core.mail.send_mass_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mass_mail()</span></code></a> uses\na single connection for all of its messages. This makes\n<a class=\"reference internal\" href=\"#django.core.mail.send_mass_mail\" title=\"django.core.mail.send_mass_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mass_mail()</span></code></a> slightly more efficient.</p>\n</section>\n</section>\n<section id=\"mail-admins\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">mail_admins()</span></code><a class=\"heading-anchor\" href=\"#mail-admins\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.mail.mail_admins\">\n<span class=\"sig-name descname\"><span class=\"pre\">mail_admins</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">subject</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">message</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fail_silently</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">connection</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">html_message</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.mail.mail_admins\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail.mail_admins()</span></code> 是定义在 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ADMINS</span></code></a> 配置项中，用于向网站所有者快速发送邮件。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">mail_admins()</span></code> 在主题前面添加 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_SUBJECT_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_SUBJECT_PREFIX</span></code></a> 指定的前缀，默认是 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;[Django]</span> <span class=\"pre\">&quot;</span></code> 。</p>\n<p>邮件头的 &quot;发件人:&quot; 由 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-SERVER_EMAIL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SERVER_EMAIL</span></code></a> 配置项指定。</p>\n<p>创建这个方法是为了方便和可读性。</p>\n<p>若提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">html_message</span></code>，会使邮件成为 <em class=\"mimetype\">multipart/alternative</em> 的实例， <code class=\"docutils literal notranslate\"><span class=\"pre\">message</span></code> 的内容类型则是 <em class=\"mimetype\">text/plain</em> ，并且 <code class=\"docutils literal notranslate\"><span class=\"pre\">html_message</span></code> 的内容类型是 <em class=\"mimetype\">text/html</em> 。</p>\n</section>\n<section id=\"mail-managers\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">mail_managers()</span></code><a class=\"heading-anchor\" href=\"#mail-managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.mail.mail_managers\">\n<span class=\"sig-name descname\"><span class=\"pre\">mail_managers</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">subject</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">message</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fail_silently</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">connection</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">html_message</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.mail.mail_managers\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail.mail_managers()</span></code> 类似 <code class=\"docutils literal notranslate\"><span class=\"pre\">mail_admins()</span></code>，但它向 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-MANAGERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MANAGERS</span></code></a> 指定的管理员们发送邮件。</p>\n</section>\n<section id=\"examples\">\n<h2>示例<a class=\"heading-anchor\" href=\"#examples\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>以下发送了一封邮件给 <a class=\"reference external\" href=\"mailto:john&#37;&#52;&#48;example&#46;com\">john<span>&#64;</span>example<span>&#46;</span>com</a> 和 <a class=\"reference external\" href=\"mailto:jane&#37;&#52;&#48;example&#46;com\">jane<span>&#64;</span>example<span>&#46;</span>com</a>，他们都出现在 &quot;收件人:&quot;:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">send_mail</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;Subject&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Message.&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;from@example.com&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">[</span><span class=\"s2\">&quot;john@example.com&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;jane@example.com&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>以下分别发送了一封邮件给 <a class=\"reference external\" href=\"mailto:john&#37;&#52;&#48;example&#46;com\">john<span>&#64;</span>example<span>&#46;</span>com</a> 和 <a class=\"reference external\" href=\"mailto:jane&#37;&#52;&#48;example&#46;com\">jane<span>&#64;</span>example<span>&#46;</span>com</a>，他们收到了独立的邮件:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">datatuple</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;Subject&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Message.&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;from@example.com&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;john@example.com&quot;</span><span class=\"p\">]),</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;Subject&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Message.&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;from@example.com&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;jane@example.com&quot;</span><span class=\"p\">]),</span>\n<span class=\"p\">)</span>\n<span class=\"n\">send_mass_mail</span><span class=\"p\">(</span><span class=\"n\">datatuple</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"preventing-header-injection\">\n<h2>防止头注入<a class=\"heading-anchor\" href=\"#preventing-header-injection\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference external\" href=\"http://www.nyphp.org/phundamentals/8_Preventing-Email-Header-Injection.html\">Header injection</a> 是一个开发漏洞，攻击者可以利用它在邮件头插入额外信息，以控制脚本生成的邮件中的  &quot;收件人:&quot; 和 &quot;发件人:&quot; 内容。</p>\n<p>Django 的邮件函数包含了以上所有的反头注入功能，通过在头中禁止新的行。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">subject</span></code>， <code class=\"docutils literal notranslate\"><span class=\"pre\">from_email</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">recipient_list</span></code> 包含了新行（不管是 Unix，Windows 或 Mac 格式中的哪一种），邮件函数（比如 <a class=\"reference internal\" href=\"#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code></a> ）都会抛出一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail.BadHeaderError</span></code> （ <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code> 的子类），这会中断邮件发送。你需要在将参数传给邮件函数前确保数据的有效性和合法性。</p>\n<p>如果邮件的 <code class=\"docutils literal notranslate\"><span class=\"pre\">内容</span></code> 的开始部分包含了邮件头信息，这些头信息只会作为邮件内容原样打印。</p>\n<p>以下是一个实例视图，从请求的 POST 数据中获取 <code class=\"docutils literal notranslate\"><span class=\"pre\">subject</span></code>， <code class=\"docutils literal notranslate\"><span class=\"pre\">message</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">from_email</span></code>，并将其发送至 <a class=\"reference external\" href=\"mailto:admin&#37;&#52;&#48;example&#46;com\">admin<span>&#64;</span>example<span>&#46;</span>com</a> ，成功后再重定向至 &quot;/contact/thanks/&quot;</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BadHeaderError</span><span class=\"p\">,</span> <span class=\"n\">send_mail</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span><span class=\"p\">,</span> <span class=\"n\">HttpResponseRedirect</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">send_email</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">subject</span> <span class=\"o\">=</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;subject&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;message&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">from_email</span> <span class=\"o\">=</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;from_email&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">subject</span> <span class=\"ow\">and</span> <span class=\"n\">message</span> <span class=\"ow\">and</span> <span class=\"n\">from_email</span><span class=\"p\">:</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"n\">send_mail</span><span class=\"p\">(</span><span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"p\">,</span> <span class=\"n\">from_email</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;admin@example.com&quot;</span><span class=\"p\">])</span>\n        <span class=\"k\">except</span> <span class=\"n\">BadHeaderError</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;Invalid header found.&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"s2\">&quot;/contact/thanks/&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"c1\"># In reality we&#39;d use a form class</span>\n        <span class=\"c1\"># to get proper validation errors.</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;Make sure all fields are entered and valid.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"the-emailmessage-class\">\n<span id=\"emailmessage-and-smtpconnection\"></span><h2><code class=\"docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code> 类<a class=\"heading-anchor\" href=\"#the-emailmessage-class\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django 的 <a class=\"reference internal\" href=\"#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code></a> 和 <a class=\"reference internal\" href=\"#django.core.mail.send_mass_mail\" title=\"django.core.mail.send_mass_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mass_mail()</span></code></a> 函数仅是对类 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 的简单封装利用。</p>\n<p>通过 <a class=\"reference internal\" href=\"#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code></a> 和其它关联的封装函数，不是所有 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 的功能都是可用的。如果你想用进阶功能，比如密送收件人，附件，分段邮件，你需要直接创建 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 的实例。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>这是一种设计方式。最初 Django 只提供了 <a class=\"reference internal\" href=\"#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">send_mail()</span></code></a> 和其它关联的函数。但是，随着时间的推移，它们的参数列表在慢慢地变长。所以，我们转向了更加面向对象的设计。在兼顾发送邮件的功能的同时，出于向后兼容的考虑，保留了这些函数。</p>\n</aside>\n<p><a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 用于创建邮件消息。 <a class=\"reference internal\" href=\"#topic-email-backends\"><span class=\"std std-ref\">邮件后端</span></a> 用于发送邮件。</p>\n<p>出于方便起见， <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 提供了一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">send()</span></code> 方法，用于发送一封邮件。如果你需要发送多封邮件，邮件后端 API <a class=\"reference internal\" href=\"#topics-sending-multiple-emails\"><span class=\"std std-ref\">提供了选择</span></a>。</p>\n<section id=\"emailmessage-objects\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code> 对象<a class=\"heading-anchor\" href=\"#emailmessage-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.mail.EmailMessage\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">EmailMessage</span></span><a class=\"heading-anchor\" href=\"#django.core.mail.EmailMessage\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>类 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 通过以下参数构造（可选参数要按指定顺序提供）。所以的参数都是可选的，且可在调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">send()</span></code> 方法前设置。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">subject</span></code>: 邮件的主题。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">body</span></code>: 邮件内容，需要为纯文本格式。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">from_email</span></code>: 发件人地址。  <code class=\"docutils literal notranslate\"><span class=\"pre\">fred&#64;example.com</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">Fred</span> <span class=\"pre\">&lt;fred&#64;example.com&gt;</span></code> 形式都是合法的。若省略，则使用 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-DEFAULT_FROM_EMAIL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEFAULT_FROM_EMAIL</span></code></a> 配置的值。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">to</span></code>: 一个包含收件人地址的列表或元组。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">bcc</span></code>: 一个包含地址的列表或元组，指定“密送”对象。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection</span></code>：一个 <a class=\"reference internal\" href=\"#topic-email-backends\"><span class=\"std std-ref\">邮件后端</span></a> 实例。如果你通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">send()</span></code> 发送 <code class=\"docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code> 并希望为多条消息使用相同的连接，请使用此参数。如果省略，则在调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">send()</span></code> 时会创建一个新连接。使用 <a class=\"reference internal\" href=\"#topics-sending-multiple-emails\"><span class=\"std std-ref\">send_messages()</span></a> 时，此参数将被忽略。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">attachments</span></code>: 附加在邮件中的附件列表。 可以是 <a class=\"reference external\" href=\"https://docs.python.org/3/library/email.mime.html#email.mime.base.MIMEBase\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">MIMEBase</span></code></a> 的实例，或 <code class=\"docutils literal notranslate\"><span class=\"pre\">(文件名，内容，mimetype)</span></code> 的元组。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">headers</span></code>: 一个字典，包含邮件中额外的头信息。字典的关键字是头的名称，值为头的值。需要由调用者确保头名和值的正确性。对应的属性是 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra_headers</span></code> 。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">cc</span></code>: 一个包含收件人地址的列表或元组，指定“抄送”对象。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">reply_to</span></code>: 一个包含收件人地址的列表或元组，指定“回复”对象。</p></li>\n</ul>\n<p>例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">EmailMessage</span>\n\n<span class=\"n\">email</span> <span class=\"o\">=</span> <span class=\"n\">EmailMessage</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Body goes here&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;from@example.com&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">[</span><span class=\"s2\">&quot;to1@example.com&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;to2@example.com&quot;</span><span class=\"p\">],</span>\n    <span class=\"p\">[</span><span class=\"s2\">&quot;bcc@example.com&quot;</span><span class=\"p\">],</span>\n    <span class=\"n\">reply_to</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;another@example.com&quot;</span><span class=\"p\">],</span>\n    <span class=\"n\">headers</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;Message-ID&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>这个类拥有以下方法：</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">send(fail_silently=False)</span></code> 发送邮件消息。如果在构造邮件时指定了连接，将使用该连接。否则，将实例化并使用默认后端的实例。如果关键字参数 <code class=\"docutils literal notranslate\"><span class=\"pre\">fail_silently</span></code> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，则在发送邮件消息时引发的异常将被抑制。如果收件人列表为空，不会引发异常。如果消息成功发送，将返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code>，否则返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code>。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">message()</span></code> 构建了一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail.SafeMIMEText</span></code> 对象（ <a class=\"reference external\" href=\"https://docs.python.org/3/library/email.mime.html#email.mime.text.MIMEText\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">MIMEText</span></code></a> 的子类）或一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail.SafeMIMEMultipart</span></code> 对象用于存储邮件内容。如果你想继承 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> ，你可能期望重写这个方法，在 MIME 对象中放入你期望的内容。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">recipients()</span></code> 返回一个包含邮件所以收件人的列表，不管他们是收件人，抄送人，密送人中的哪一个。这可能是另一个你在创建子类时想复现的方法，因为 SMTP 服务器需要你在发送邮件时告诉它完整的收件人列表。如果你在子类中实现了另一个方法，指定收件人列表，这个方法必须也返回相同的结果。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">attach()</span></code> 创建一个新的附件，并加到邮件。有两种调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">attach()</span></code> 的方式:</p>\n<ul>\n<li><p>可以仅传送一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/email.mime.html#email.mime.base.MIMEBase\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">MIMEBase</span></code></a> 的实例。这会被直接插入邮件。</p></li>\n<li><p>另一个可选的方案，你可以向 <code class=\"docutils literal notranslate\"><span class=\"pre\">attach()</span></code> 传递 3 个参数： <code class=\"docutils literal notranslate\"><span class=\"pre\">filename</span></code> ， <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">mimetype</span></code>。 <code class=\"docutils literal notranslate\"><span class=\"pre\">filename</span></code> 是文件附件的名字，它会显示在邮件中， <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> 是附件包含的数据，而 <code class=\"docutils literal notranslate\"><span class=\"pre\">mimetype</span></code> 是一个可选参数，指定附件的 MIME 类型。如果你省略了 <code class=\"docutils literal notranslate\"><span class=\"pre\">mimetype</span></code>，MIME 类型将会参考附件的文件名。</p>\n<p>例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">message</span><span class=\"o\">.</span><span class=\"n\">attach</span><span class=\"p\">(</span><span class=\"s2\">&quot;design.png&quot;</span><span class=\"p\">,</span> <span class=\"n\">img_data</span><span class=\"p\">,</span> <span class=\"s2\">&quot;image/png&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你指定 <em class=\"mimetype\">message/rfc822</em> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">mimetype</span></code>，它也会接受 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.core.mail.EmailMessage</span></code></a> 和 <a class=\"reference external\" href=\"https://docs.python.org/3/library/email.compat32-message.html#email.message.Message\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">email.message.Message</span></code></a>。</p>\n<p>对于以 <em class=\"mimetype\">text/</em> 开头的 <code class=\"docutils literal notranslate\"><span class=\"pre\">mimetype</span></code> 类型，其内容应该是字符串。二进制数据将尝试以 UTF-8 解码，如果失败了，MIME 类型会被改为 <em class=\"mimetype\">application/octet-stream</em> ，并不会修改数据内容。</p>\n<p>此外， <em class=\"mimetype\">message/rfc822</em> 附件不再是 base64 编码，因为违反了 <span class=\"target\" id=\"index-2\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc2046.html#section-5.2.1\"><strong>RFC 2046 Section 5.2.1</strong></a> 。之前在 <a class=\"reference external\" href=\"https://bugzilla.gnome.org/show_bug.cgi?id=651197\">Evolution</a> 和 <a class=\"reference external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=333880\">Thunderbird</a> 会造成显示问题。</p>\n</li>\n</ul>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">attach_file()</span></code> 通过从本地文件系统中选择一个文件的方式创建附件。调用时，传入文件的路径。附件的 MIME 类型是可选的。如果省略了 MIME 类型，会参考文件名。你可以这样使用：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">message</span><span class=\"o\">.</span><span class=\"n\">attach_file</span><span class=\"p\">(</span><span class=\"s2\">&quot;/images/weather_map.png&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>对于 MIME 类型以 <em class=\"mimetype\">text/</em> 开头的，二进制数据的处理方式与 <code class=\"docutils literal notranslate\"><span class=\"pre\">attach()</span></code> 中的一样。</p>\n</li>\n</ul>\n</section>\n<section id=\"sending-alternative-content-types\">\n<h3>发送可选的内容类型。<a class=\"heading-anchor\" href=\"#sending-alternative-content-types\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"sending-multiple-content-versions\">\n<h4>发送多个内容版本<a class=\"heading-anchor\" href=\"#sending-multiple-content-versions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>在电子邮件中包含多个版本的内容可能很有用；经典的例子是同时发送文本和 HTML 版本的消息。使用 Django 的邮件库，你可以通过 <a class=\"reference internal\" href=\"#django.core.mail.EmailMultiAlternatives\" title=\"django.core.mail.EmailMultiAlternatives\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMultiAlternatives</span></code></a> 类来实现这一点。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.mail.EmailMultiAlternatives\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">EmailMultiAlternatives</span></span><a class=\"heading-anchor\" href=\"#django.core.mail.EmailMultiAlternatives\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 的一个子类，它有一个额外的 <code class=\"docutils literal notranslate\"><span class=\"pre\">attach_alternative()</span></code> 方法，用于在电子邮件中包含消息正文的额外版本。所有其他方法（包括类初始化）都直接从 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 继承。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.mail.EmailMultiAlternatives.attach_alternative\">\n<span class=\"sig-name descname\"><span class=\"pre\">attach_alternative</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">content</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">mimetype</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.mail.EmailMultiAlternatives.attach_alternative\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>在电子邮件中附加消息正文的替代表示。</p>\n<p>例如，要发送文本和 HTML 组合，你可以这样写：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">EmailMultiAlternatives</span>\n\n<span class=\"n\">subject</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;hello&quot;</span>\n<span class=\"n\">from_email</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;from@example.com&quot;</span>\n<span class=\"n\">to</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;to@example.com&quot;</span>\n<span class=\"n\">text_content</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;This is an important message.&quot;</span>\n<span class=\"n\">html_content</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;&lt;p&gt;This is an &lt;strong&gt;important&lt;/strong&gt; message.&lt;/p&gt;&quot;</span>\n<span class=\"n\">msg</span> <span class=\"o\">=</span> <span class=\"n\">EmailMultiAlternatives</span><span class=\"p\">(</span><span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">text_content</span><span class=\"p\">,</span> <span class=\"n\">from_email</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">to</span><span class=\"p\">])</span>\n<span class=\"n\">msg</span><span class=\"o\">.</span><span class=\"n\">attach_alternative</span><span class=\"p\">(</span><span class=\"n\">html_content</span><span class=\"p\">,</span> <span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">msg</span><span class=\"o\">.</span><span class=\"n\">send</span><span class=\"p\">()</span>\n</code></pre></div>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"updating-the-default-content-type\">\n<h4>更新默认内容类型<a class=\"heading-anchor\" href=\"#updating-the-default-content-type\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>默认情况下，<a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">body</span></code> 参数的 MIME 类型是 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;text/plain&quot;</span></code>。经验告诉我们，不改它会更好。因为这样能确保不管收件人使用何种邮件客户端都可以正常的阅读邮件。不过，如果你能确保你的收件人都能处理可选的内容类型，你可以使用 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 类的 <code class=\"docutils literal notranslate\"><span class=\"pre\">content_subtype</span></code> 属性改变主要内容的类型。主类型一般总是 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;text&quot;</span></code>，但你可以修改子类型。比如:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">msg</span> <span class=\"o\">=</span> <span class=\"n\">EmailMessage</span><span class=\"p\">(</span><span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">html_content</span><span class=\"p\">,</span> <span class=\"n\">from_email</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">to</span><span class=\"p\">])</span>\n<span class=\"n\">msg</span><span class=\"o\">.</span><span class=\"n\">content_subtype</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;html&quot;</span>  <span class=\"c1\"># Main content is now text/html</span>\n<span class=\"n\">msg</span><span class=\"o\">.</span><span class=\"n\">send</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n</section>\n</section>\n<section id=\"email-backends\">\n<span id=\"topic-email-backends\"></span><h2>邮件后端<a class=\"heading-anchor\" href=\"#email-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>发送邮件的动作是由邮件后端执行的。</p>\n<p>邮件后端类拥有以下方法：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">open()</span></code> 创建一个发送邮件的长连接。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">close()</span></code> 关闭当前发送邮件的连接。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">send_messages(email_messages)</span></code> 发送一个 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 对象列表。如果连接没有打开，此调用将隐式打开连接，并在邮件发送后关闭连接。如果连接已经打开，邮件发送后将保持连接处于打开状态。</p></li>\n</ul>\n<p>这也可以用作内容管理器，它会在需要的时候自动调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">open()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">close()</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">mail</span>\n\n<span class=\"k\">with</span> <span class=\"n\">mail</span><span class=\"o\">.</span><span class=\"n\">get_connection</span><span class=\"p\">()</span> <span class=\"k\">as</span> <span class=\"n\">connection</span><span class=\"p\">:</span>\n    <span class=\"n\">mail</span><span class=\"o\">.</span><span class=\"n\">EmailMessage</span><span class=\"p\">(</span>\n        <span class=\"n\">subject1</span><span class=\"p\">,</span>\n        <span class=\"n\">body1</span><span class=\"p\">,</span>\n        <span class=\"n\">from1</span><span class=\"p\">,</span>\n        <span class=\"p\">[</span><span class=\"n\">to1</span><span class=\"p\">],</span>\n        <span class=\"n\">connection</span><span class=\"o\">=</span><span class=\"n\">connection</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">send</span><span class=\"p\">()</span>\n    <span class=\"n\">mail</span><span class=\"o\">.</span><span class=\"n\">EmailMessage</span><span class=\"p\">(</span>\n        <span class=\"n\">subject2</span><span class=\"p\">,</span>\n        <span class=\"n\">body2</span><span class=\"p\">,</span>\n        <span class=\"n\">from2</span><span class=\"p\">,</span>\n        <span class=\"p\">[</span><span class=\"n\">to2</span><span class=\"p\">],</span>\n        <span class=\"n\">connection</span><span class=\"o\">=</span><span class=\"n\">connection</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">send</span><span class=\"p\">()</span>\n</code></pre></div>\n<section id=\"obtaining-an-instance-of-an-email-backend\">\n<h3>获取邮件后端的一个实例<a class=\"heading-anchor\" href=\"#obtaining-an-instance-of-an-email-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail</span></code> 中的 <a class=\"reference internal\" href=\"#django.core.mail.get_connection\" title=\"django.core.mail.get_connection\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_connection()</span></code></a> 函数返回一个你能使用的邮件后端实例。</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.mail.get_connection\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_connection</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">backend</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fail_silently</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.mail.get_connection\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>默认情况下，调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_connection()</span></code> 会返回配置项 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_BACKEND</span></code></a> 指定的后端。如果你传入了 <code class=\"docutils literal notranslate\"><span class=\"pre\">backend</span></code> 参数，将会返回该后端的实例。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">fail_silently</span></code> 控制后端怎么处理错误。若 <code class=\"docutils literal notranslate\"><span class=\"pre\">fail_silently</span></code> 为 True，发送邮件过程中的异常都会被和谐掉。</p>\n<p>剩余的参数将直接传给邮件后端的构造器。</p>\n<p>Django 自带了几种邮件后端。除了 SMTP 后端（默认值）外，这些后端应仅在开发和测试阶段使用。如果对发送邮件有特殊的需求，你可以 <a class=\"reference internal\" href=\"#topic-custom-email-backend\"><span class=\"std std-ref\">编写自定义后端</span></a>。</p>\n<section id=\"smtp-backend\">\n<span id=\"topic-email-smtp-backend\"></span><h4>SMTP 后端<a class=\"heading-anchor\" href=\"#smtp-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.mail.backends.smtp.EmailBackend\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">backends.smtp.</span></span><span class=\"sig-name descname\"><span class=\"pre\">EmailBackend</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">host</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">port</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">username</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">password</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">use_tls</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fail_silently</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">use_ssl</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">ssl_keyfile</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">ssl_certfile</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.mail.backends.smtp.EmailBackend\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这是默认的后端。邮件将会通过 SMTP 服务器发送。</p>\n<p>若以下某个参数值为 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>，则会从匹配的设置项中读取：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">host</span></code>: <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">port</span></code>: <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_PORT</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">username</span></code>: <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_HOST_USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST_USER</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">password</span></code>: <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_HOST_PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST_PASSWORD</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">use_tls</span></code>: <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_USE_TLS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_USE_TLS</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">use_ssl</span></code>: <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_USE_SSL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_USE_SSL</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code>: <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_TIMEOUT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_TIMEOUT</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ssl_keyfile</span></code>: <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_SSL_KEYFILE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_SSL_KEYFILE</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ssl_certfile</span></code>: <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_SSL_CERTFILE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_SSL_CERTFILE</span></code></a></p></li>\n</ul>\n<p>SMTP 后端是 Django 默认配置的。如果你想显示的指定，将以下内容放入你的配置中：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">EMAIL_BACKEND</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;django.core.mail.backends.smtp.EmailBackend&quot;</span>\n</code></pre></div>\n<p>若未指定，<code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> 的默认值将由 <a class=\"reference external\" href=\"https://docs.python.org/3/library/socket.html#socket.getdefaulttimeout\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">socket.getdefaulttimeout()</span></code></a> 的返回值确定，其默认值为 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> （无超时）。</p>\n</dd></dl>\n\n</section>\n<section id=\"console-backend\">\n<span id=\"topic-email-console-backend\"></span><h4>控制台后端<a class=\"heading-anchor\" href=\"#console-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>控制台后端仅将邮件发送至标准输出，而不是真的发送。默认情况下，控制台后端输出至 <code class=\"docutils literal notranslate\"><span class=\"pre\">stdout</span></code>。在创建连接时，你可以提供 <code class=\"docutils literal notranslate\"><span class=\"pre\">stream</span></code> 关键字参数来使用另一个类似 stream 的对象。</p>\n<p>为了使用该后端，将以下代码加入你的配置中：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">EMAIL_BACKEND</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;django.core.mail.backends.console.EmailBackend&quot;</span>\n</code></pre></div>\n<p>该后端不是为了在生产环境使用的——出于方便的目的，让你在开发阶段使用。</p>\n</section>\n<section id=\"file-backend\">\n<span id=\"topic-email-file-backend\"></span><h4>文件后端<a class=\"heading-anchor\" href=\"#file-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>文件后端将邮件写入文件。对该后端的每次会话都会创建新文件。存储这些文件的目录可以从配置项 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_FILE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_FILE_PATH</span></code></a> 获取，也可在调用 <a class=\"reference internal\" href=\"#django.core.mail.get_connection\" title=\"django.core.mail.get_connection\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_connection()</span></code></a> 时以关键字参数 <code class=\"docutils literal notranslate\"><span class=\"pre\">file_path</span></code> 指定。</p>\n<p>为了使用该后端，将以下代码加入你的配置中：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">EMAIL_BACKEND</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;django.core.mail.backends.filebased.EmailBackend&quot;</span>\n<span class=\"n\">EMAIL_FILE_PATH</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;/tmp/app-messages&quot;</span>  <span class=\"c1\"># change this to a proper location</span>\n</code></pre></div>\n<p>该后端不是为了在生产环境使用的——出于方便的目的，让你在开发阶段使用。</p>\n</section>\n<section id=\"in-memory-backend\">\n<span id=\"topic-email-memory-backend\"></span><h4>内存后端<a class=\"heading-anchor\" href=\"#in-memory-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>该缓存式后端将内容存在 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail</span></code> 模块的某个属性值中。<code class=\"docutils literal notranslate\"><span class=\"pre\">outbox</span></code> 属性会在第一条消息发送时创建。这是一个列表，每项都是一个 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 实例，代表一条要被发送的消息。</p>\n<p>为了使用该后端，将以下代码加入你的配置中：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">EMAIL_BACKEND</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;django.core.mail.backends.locmem.EmailBackend&quot;</span>\n</code></pre></div>\n<p>该后端不是为了在生产环境使用的——出于方便的目的，让你在开发阶段使用。</p>\n<p>Django 的测试器 <a class=\"reference internal\" href=\"/zh-hans/5.1/topics/testing/tools/#topics-testing-email\"><span class=\"std std-ref\">自动为测试使用这个后端</span></a>。</p>\n</section>\n<section id=\"dummy-backend\">\n<span id=\"topic-email-dummy-backend\"></span><h4>虚拟后端<a class=\"heading-anchor\" href=\"#dummy-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>就像该后端的名字表示的一样，该后端对你发送的消息什么也不做。指定该后端，将以下代码加入你的配置中：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">EMAIL_BACKEND</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;django.core.mail.backends.dummy.EmailBackend&quot;</span>\n</code></pre></div>\n<p>该后端不是为了在生产环境使用的——出于方便的目的，让你在开发阶段使用。</p>\n</section>\n</section>\n<section id=\"defining-a-custom-email-backend\">\n<span id=\"topic-custom-email-backend\"></span><h3>自定义邮件后端<a class=\"heading-anchor\" href=\"#defining-a-custom-email-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>若你需要修改邮件发送的方式，你可以编写自定义的邮件后端。后面要在 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_BACKEND</span></code></a> 配置项中指定你的后端类的路径。</p>\n<p>自定义邮件后端需继承 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.mail.backends.base</span></code> 模块中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseEmailBackend</span></code> 类。自定义邮件后端类必须实现 <code class=\"docutils literal notranslate\"><span class=\"pre\">send_messages(email_messages)</span></code> 方法。该方法接受一个包含 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 对象的列表。若你的后端还处理了持久性会话和连接，你还需要实现 <code class=\"docutils literal notranslate\"><span class=\"pre\">open()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">close()</span></code> 方法。可以参考 <code class=\"docutils literal notranslate\"><span class=\"pre\">smtp.EmailBackend</span></code> 的实现。</p>\n</section>\n<section id=\"sending-multiple-emails\">\n<span id=\"topics-sending-multiple-emails\"></span><h3>发送多封邮件<a class=\"heading-anchor\" href=\"#sending-multiple-emails\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>创建和关闭 SMTP 连接（或其它网络连接）是一项耗时的进程。如果你有很多封邮件要发送，复用连接就显得很有意义，而不是在每次发送邮件时创建和关闭连接。</p>\n<p>有两种方式可以让邮件后端复用连接。</p>\n<p>首先，你可以在连接上使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">send_messages()</span></code> 方法。这需要一个 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage`（或其子类）实例的列表，并使用该单一连接发送它们。因此，在单个消息上设置的任何</span> <span class=\"pre\">:class:`connection</span></code></a> 都会被忽略。</p>\n<p>举个例子，你有一个函数，叫做 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_notification_email()</span></code> ，他会返回一个包含 <a class=\"reference internal\" href=\"#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailMessage</span></code></a> 对象的列表。这些对象是你想要发送的定期邮件。你可以简单的调用一次 send_messages 来发送它们：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">mail</span>\n\n<span class=\"n\">connection</span> <span class=\"o\">=</span> <span class=\"n\">mail</span><span class=\"o\">.</span><span class=\"n\">get_connection</span><span class=\"p\">()</span>  <span class=\"c1\"># Use default email connection</span>\n<span class=\"n\">messages</span> <span class=\"o\">=</span> <span class=\"n\">get_notification_email</span><span class=\"p\">()</span>\n<span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">send_messages</span><span class=\"p\">(</span><span class=\"n\">messages</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>在该例子中，调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">send_messages()</span></code> 在后端创建了一条连接，发送完邮件列表后，关闭了这条连接。</p>\n<p>第二种方式是在后端使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">open()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">close()</span></code> 手动控制连接。<code class=\"docutils literal notranslate\"><span class=\"pre\">send_messages()</span></code> 在连接已经建立的情况下不会控制连接的开关，故此，若你手动打开了连接，你可以决定何时关闭它。比如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">mail</span>\n\n<span class=\"n\">connection</span> <span class=\"o\">=</span> <span class=\"n\">mail</span><span class=\"o\">.</span><span class=\"n\">get_connection</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Manually open the connection</span>\n<span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">open</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Construct an email message that uses the connection</span>\n<span class=\"n\">email1</span> <span class=\"o\">=</span> <span class=\"n\">mail</span><span class=\"o\">.</span><span class=\"n\">EmailMessage</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Body goes here&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;from@example.com&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">[</span><span class=\"s2\">&quot;to1@example.com&quot;</span><span class=\"p\">],</span>\n    <span class=\"n\">connection</span><span class=\"o\">=</span><span class=\"n\">connection</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n<span class=\"n\">email1</span><span class=\"o\">.</span><span class=\"n\">send</span><span class=\"p\">()</span>  <span class=\"c1\"># Send the email</span>\n\n<span class=\"c1\"># Construct two more messages</span>\n<span class=\"n\">email2</span> <span class=\"o\">=</span> <span class=\"n\">mail</span><span class=\"o\">.</span><span class=\"n\">EmailMessage</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Body goes here&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;from@example.com&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">[</span><span class=\"s2\">&quot;to2@example.com&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">)</span>\n<span class=\"n\">email3</span> <span class=\"o\">=</span> <span class=\"n\">mail</span><span class=\"o\">.</span><span class=\"n\">EmailMessage</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Body goes here&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;from@example.com&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">[</span><span class=\"s2\">&quot;to3@example.com&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">)</span>\n\n<span class=\"c1\"># Send the two emails in a single call -</span>\n<span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">send_messages</span><span class=\"p\">([</span><span class=\"n\">email2</span><span class=\"p\">,</span> <span class=\"n\">email3</span><span class=\"p\">])</span>\n<span class=\"c1\"># The connection was already open so send_messages() doesn&#39;t close it.</span>\n<span class=\"c1\"># We need to manually close the connection.</span>\n<span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"configuring-email-for-development\">\n<h2>为了开发配置邮件<a class=\"heading-anchor\" href=\"#configuring-email-for-development\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>曾经有很多次，你并不想 Django 真的发送邮件。举个例子，在开发网站时，你可能并不期望发送成千上万封邮件——但你想要确保这些邮件将会在正确的时间，包含正确的内容，发送给正确的人。</p>\n<p>在本地开发中配置电子邮件的最简单方法是使用 <a class=\"reference internal\" href=\"#topic-email-console-backend\"><span class=\"std std-ref\">console</span></a> 电子邮件后端。该后端将所有电子邮件重定向到 <code class=\"docutils literal notranslate\"><span class=\"pre\">stdout</span></code>，允许您查看邮件的内容。</p>\n<p><a class=\"reference internal\" href=\"#topic-email-file-backend\"><span class=\"std std-ref\">文件</span></a> 邮件后端在开发时也很有用——这个后端将每次 SMTP 连接的内容输出至一个文件，你可以在你闲暇时查看这个文件。</p>\n<p>另一种方法是使用一个“哑”SMTP 服务器，它在本地接收电子邮件并将其显示到终端，但实际上并不发送任何内容。<a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/aiosmtpd/\">aiosmtpd</a> 包提供了一种实现此目的的方法：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>aiosmtpd\n\npython<span class=\"w\"> </span>-m<span class=\"w\"> </span>aiosmtpd<span class=\"w\"> </span>-n<span class=\"w\"> </span>-l<span class=\"w\"> </span>localhost:8025\n</code></pre></div>\n<p>这个命令将启动一个最小的 SMTP 服务器，监听在 localhost 的 8025 端口上。该服务器将打印所有电子邮件头和电子邮件正文到标准输出。然后，您只需要相应地设置 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST</span></code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/settings/#std-setting-EMAIL_PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_PORT</span></code></a>。有关 SMTP 服务器选项的更详细讨论，请参阅 <a class=\"reference external\" href=\"https://aiosmtpd.readthedocs.io/en/latest/\">aiosmtpd</a> 模块的文档。</p>\n<p>关于发送邮件的单元测试资料，参见测试文档中 <a class=\"reference internal\" href=\"/zh-hans/5.1/topics/testing/tools/#topics-testing-email\"><span class=\"std std-ref\">邮件服务</span></a> 章节。</p>\n</section>","rootId":"module-django.core.mail","toc":[{"title":"快速示例","anchor":"quick-examples","children":[]},{"title":"send_mail()","anchor":"send-mail","children":[]},{"title":"send_mass_mail()","anchor":"send-mass-mail","children":[{"title":"send_mass_mail() vs. send_mail()","anchor":"send-mass-mail-vs-send-mail","children":[]}]},{"title":"mail_admins()","anchor":"mail-admins","children":[]},{"title":"mail_managers()","anchor":"mail-managers","children":[]},{"title":"示例","anchor":"examples","children":[]},{"title":"防止头注入","anchor":"preventing-header-injection","children":[]},{"title":"EmailMessage 类","anchor":"the-emailmessage-class","children":[{"title":"EmailMessage 对象","anchor":"emailmessage-objects","children":[]},{"title":"发送可选的内容类型。","anchor":"sending-alternative-content-types","children":[{"title":"发送多个内容版本","anchor":"sending-multiple-content-versions","children":[]},{"title":"更新默认内容类型","anchor":"updating-the-default-content-type","children":[]}]}]},{"title":"邮件后端","anchor":"email-backends","children":[{"title":"获取邮件后端的一个实例","anchor":"obtaining-an-instance-of-an-email-backend","children":[{"title":"SMTP 后端","anchor":"smtp-backend","children":[]},{"title":"控制台后端","anchor":"console-backend","children":[]},{"title":"文件后端","anchor":"file-backend","children":[]},{"title":"内存后端","anchor":"in-memory-backend","children":[]},{"title":"虚拟后端","anchor":"dummy-backend","children":[]}]},{"title":"自定义邮件后端","anchor":"defining-a-custom-email-backend","children":[]},{"title":"发送多封邮件","anchor":"sending-multiple-emails","children":[]}]},{"title":"为了开发配置邮件","anchor":"configuring-email-for-development","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"使用 Django","url":"/zh-hans/5.1/topics/"}],"prev":{"docname":"topics/signing","title":"加密签名","url":"/zh-hans/5.1/topics/signing/"},"next":{"docname":"topics/i18n/index","title":"国际化和本地化","url":"/zh-hans/5.1/topics/i18n/"},"formats":{"html":"/zh-hans/5.1/topics/email/","markdown":"/zh-hans/5.1/topics/email.md","json":"/zh-hans/5.1/topics/email.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/topics/email.txt","official":"https://docs.djangoproject.com/zh-hans/5.1/topics/email/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}