如何在Django中发送电子邮件

343 阅读4分钟

如何在Django中发送电子邮件

在大多数客户驱动的网络应用中,可能都需要发送电子邮件。用Django发送电子邮件是非常简单的。

在本教程的第一部分,我们将从头开始快速建立一个新的Django项目,包括一些URL、视图和模板。

然后,我们将看看如何配置谷歌的SMTP服务提供商,最后是如何使用Django中的send_mail() 功能来帮助我们发送邮件。

前提条件

要继续学习本教程,你需要一个谷歌账户。

还需要有Django的知识。

项目设置和概述

打开你的终端或命令提示符,并运行以下命令。

mkdir mail && cd mail

pipenv install django

pipenv shell

我们使用pipenv 命令创建了一个新的虚拟环境。

如果你没有安装Pipenv,你可以使用下面的命令安装它。

pip install pipenv

接下来,创建一个新的Python项目和应用程序。

django-admin startproject send_mail .

python manage.py startapp mailer

python manage.py migrate

python manage.py runserver

用你的浏览器导航到http://127.0.0.1:8000/。你应该看到默认的Django主页。

Django homepage

将新的应用程序添加到你的settings.py 文件中。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # new
    'mailer.apps.MailerConfig',
]

更新你的项目的send_mail/urls.py ,看起来像这样。

from django.contrib import admin
from django.urls import path, include # new

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('mailer.urls')), # new
]

然后在mailer 目录内创建一个新文件,名为urls.py ,并添加以下代码。

from django.urls import path
from .views import sendMail

urlpatterns = [
    path('', sendMail),
]

在你的mailer 目录中创建一个新的文件,称为forms.py ,并添加以下代码。

from django import forms

class EmailForm(forms.Form):
    recipient = forms.EmailField()
    message = forms.CharField(widget=forms.Textarea)

这里发生了什么?

我们创建了一个继承自Form 基类的表单类。然后我们创建了两个属性(收件人和消息),我们希望在表单中显示。

基于属性配置,Django将决定如何为这些字段生成HTML,以及如何验证这些字段。

接下来,让我们更新一下我们的邮件程序的views.py ,看起来像这样。

from django.shortcuts import render
from .forms import EmailForm
from django.core.mail import send_mail
from django.conf import settings


def sendMail(request):

    # create a variable to keep track of the form
    messageSent = False

    # check if form has been submitted
    if request.method == 'POST':

        form = EmailForm(request.POST)

        # check if data from the form is clean
        if form.is_valid():
            cd = form.cleaned_data
            subject = "Sending an email with Django"
            message = cd['message']

            # send the email to the recipent
            send_mail(subject, message,
                      settings.DEFAULT_FROM_EMAIL, [cd['recipient']])

            # set the variable initially created to True
            messageSent = True

    else:
        form = EmailForm()

    return render(request, 'index.html', {

        'form': form,
        'messageSent': messageSent,

    })

这里发生了什么?

我们创建了一个名为sendMail 的函数。然后我们检查表单是否被提交。如果是,我们验证用户的输入,发送邮件,然后返回True

最后,如果表格没有提交,我们就返回一个空的表格,或者如果表格有一些错误,我们就把这些错误送回去,以便对表格输入进行修正

另外,请注意send_email() 这个函数。它需要三个必要的参数。主题,其次是消息发件人,最后是收件人列表

接下来,在你的邮件程序中创建一个新的templates 文件夹,并在一个名为index.html 的文件内,添加以下代码。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link
      href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
      rel="stylesheet"
      integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
      crossorigin="anonymous"
    />
    <title>Send Email</title>
  </head>
  <body>
    {% if messageSent %}
    <div class="container">
      <h3><strong>Email successfully sent</strong></h3>
      <p>Your message was successfully sent to {{ form.cleaned_data.to }}</p>
    </div>
    {% else %}
    <div class="container">
      <h3><strong>Send E-mail</strong></h3>

      <form method="post">
        {% csrf_token %} {{ form.as_p }}
        <br />
        <div class="text-center">
          <input
            type="submit"
            class="btn btn-secondary"
            style="width: 100%"
            value="Send e-mail"
          />
        </div>
      </form>
    </div>
    {% endif %}
  </body>
</html>

这里发生了什么?

我们正在检查变量messageSent 是否是True 。如果是,我们就显示一个成功的消息。否则,我们将显示一个空的表单供用户填写。

现在我们已经成功地设置了我们的项目。在下一节中,我们将把注意力转向使用Google Gmail SMTP提供商实际发送电子邮件。

为了测试所有的工作是否顺利,请更新你的settings.py 文件并添加这些配置。

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

DEFAULT_FROM_EMAIL = 'test@test.com'

打开应用程序并尝试提交表单。邮件应该在你的控制台中被打印出来。

配置谷歌Gmail SMTP提供商。

要使用你的谷歌Gmail账户发送电子邮件。

Google Less Secure Homepage

请注意,开启了2步验证的谷歌账户不能用于安全应用程序。相反,你要使用应用程序密码。

使用谷歌Gmail SMTP提供商发送电子邮件

为了完成使用谷歌Gmail SMTP提供商发送电子邮件的过程,你必须用你的谷歌Gmail账户的详细信息更新和添加一些额外的设置到你的项目中

DEFAULT_FROM_EMAIL = '<paste your gmail account here>'

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '<paste your gmail account here>'
EMAIL_HOST_PASSWORD = '<paste Google password or app password here>'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

请注意,一些细节如账户和密码应该保持隐藏。这可以通过将它们设置为环境变量来实现。一个非常好的第三方应用程序来实现这一点,那就是django-environ

在这一点上,我们已经准备好发送邮件了。打开应用程序并尝试发送一些邮件。

homepage

success page

总结

在本教程中,我们简单地建立了一个新的Django项目,用来使用免费服务(Google Gmail SMTP)提供商发送电子邮件。