如何在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主页。

将新的应用程序添加到你的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账户发送电子邮件。

请注意,开启了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。
在这一点上,我们已经准备好发送邮件了。打开应用程序并尝试发送一些邮件。


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