许多行业利用简单邮件传输协议 (SMTP) 向最终用户发送电子邮件。SMTP 也检索消息,尽管这不是它的主要用例。像 Django 这样的开源框架(一个基于 Python 的 Web 框架)允许使用函数和表达式来更好地控制电子邮件的发送。
本文展示了如何在 Django 中配置 SMTP 服务器并使用 SMTP 发送电子邮件。
项目设置和概述
在继续之前,本教程需要在您首选的设备上安装代码编辑器(例如 VS Code 或 Codium)。
首先,使用终端中的命令创建一个新目录
mkdir exampledirectory
然后使用命令进入该目录
cd exampledirectory
在新创建的目录中,使用命令终端中内置的 venv 模块创建一个 虚拟环境
python -m venv
此命令在先前创建的文件夹中创建一个虚拟环境。要激活它,请在终端中使用以下命令
在 Linux 和 Mac 上
source .virtenv/bin/activate
在 Windows 上
\Scripts\activate
创建 Django 项目
激活虚拟环境后,继续从 pip 安装 Django 包
pip install django
创建一个新的 Django 项目
python -m django startproject NewEmailProject
此命令创建一个名为 NewEmailProject
的项目。要运行该项目,请前往项目目录 (NewEmailProject
) 并运行服务器
python manage.py runserver
在浏览器中打开开发服务器的链接。您将看到带有发行说明的 Django 首页。
发送电子邮件的配置
接下来,打开 settings.py
文件(在 NewEmailProject
文件夹中)以自定义使用 Django 发送电子邮件的配置。
滚动到代码末尾,并使用以下代码更新文件
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.yourserver.com'
EMAIL_USE_TLS = False
EMAIL_PORT = 465
EMAIL_USE_SSL = True
EMAIL_HOST_USER = 'your@djangoapp.com'
EMAIL_HOST_PASSWORD = 'your password'
根据您的电子邮件客户端更改 EMAIL_HOST
的值。以下是常用电子邮件客户端的可接受值
-
Gmail:
smtp.gmail.com
-
Outlook:
smtp-mail.outlook.com
-
Yahoo:
smtp.mail.yahoo.com
您可以更改 EMAIL_PORT
或保留 465 作为默认值。
您可以互换使用安全套接字层 (SSL) 和传输套接字层 (TSL),因为它们都指定连接安全性。
要了解您的电子邮件服务器的其他自定义配置,请查看完整的 Django 项目文档。
SMTP 电子邮件后端
当通过 Django SMTP 服务器发送电子邮件时,EMAIL_BACKEND
表达式有助于确定最合适的后端。此变量指向 smtp.EmailBackend
,它接收发送电子邮件所需的所有参数。它告诉 Django 使用 SMTP 将电子邮件发送给收件人电子邮件,而不是发送到控制台。
使用 SMTP 发送电子邮件
当环境设置好并且 settings.py
更新后,您可以在 Django 中发送电子邮件。您可以使用 HTML 表单,该表单发送发送电子邮件所需的必要信息的 post 请求。
创建一个用于发送电子邮件的 Django 应用程序
python manage.py startapp mail
接下来,打开 settings.py
文件,并将 Django 应用程序 (mail) 添加到 INSTALLED_APPS
列表中
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"mail"]
发送邮件函数
在 mail 应用程序的 views.py
文件中,首先从 django.core.mail
导入 EmailMessage
和 get_connection
from django.core.mail import EmailMessage, get_connection
EmailMessage
类负责创建电子邮件消息本身。get_connection()
函数返回 EMAIL_BACKEND
中指定的电子邮件后端的实例。
现在创建一个函数,它接受一个 POST
请求,其中包含从客户端提交的表单数据。然后是 get_connection()
函数参数,其中包含在项目 settings.py
文件中创建的电子邮件配置。
接下来,导入设置
from django.conf import settings
此导入允许访问在 settings.py
中创建的电子邮件配置。接下来,创建变量
subject, recipient_list,
然后您可以 message
,并存储 HTML 表单中使用的相应属性。email_from
变量包含发件人电子邮件,该电子邮件从 settings.py
文件中的 EMAIL_HOST_USER
获取。
变量处理完毕后,EmailMessage
类使用 sends()
方法发送电子邮件,然后关闭连接。send_email()
函数渲染包含电子邮件表单的 home.html
文件。
您可以在 mail 应用程序中创建一个 templates 文件夹,并将 HTML 文件存储在该文件夹中
from django.core.mail import EmailMessage, get_connection
from django.conf import settings
def send_email(request):
if request.method == "POST":
with get_connection(
host=settings.EMAIL_HOST,
port=settings.EMAIL_PORT,
username=settings.EMAIL_HOST_USER,
password=settings.EMAIL_HOST_PASSWORD,
use_tls=settings.EMAIL_USE_TLS
) as connection:
subject = request.POST.get("subject")
email_from = settings.EMAIL_HOST_USER
recipient_list = [request.POST.get("email"), ]
message = request.POST.get("message")
EmailMessage(subject, message, email_from, recipient_list, connection=connection).send()
return render(request, 'home.html')
这是一个用于生成消息的 bootstrap 表单
<form method="post" action="https://open-source.net.cn/.">
{% csrf_token %}
<div class="mb-3">
<label for="exampleFormControlInput1" class="form-label">Receipt email address</label>
<input type="text" class="form-control" name="email" id="exampleFormControlInput1" placeholder="Receipt email address">
</div>
<div class="mb-3">
<label for="exampleInputSubject" class="form-label">Subject</label>
<input type="text" class="form-control" name="subject" id="exampleInputSubject">
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">Message</label>
<textarea class="form-control" id="exampleFormControlTextarea1" name="message" rows="3"></textarea>
</div>
<button type="submit" class="btn btn-primary">Send</button>
</form>
此表单向 send_email()
函数发送 post 请求。这将处理表单数据并将电子邮件发送给收件人。
现在打开 NewEmailProject
文件夹中的 urls.py
文件以创建首页 URL。通过添加代码 path("", send_email)
来更新 urlpattern
列表。
向多个收件人发送电子邮件
要在发送同一封电子邮件时指定多个收件人,请在 views.py
文件中创建一个名为 send_emails
的新函数,并修改发送函数代码
def send_emails(request):
if request.method == "POST":
with get_connection(
host=settings.EMAIL_HOST,
port=settings.EMAIL_PORT,
username=settings.EMAIL_HOST_USER,
password=settings.EMAIL_HOST_PASSWORD,
use_tls=settings.EMAIL_USE_TLS
) as connection:
recipient_list = request.POST.get("email").split()
subject = request.POST.get("subject")
email_from = settings.EMAIL_HOST_USER
message = request.POST.get("message")
print(type(recipient_list))
EmailMessage(subject, message, email_from, recipient_list, connection=connection).send()
return render(request, 'send_emails.html')
对于 recipient_list
变量,我使用 Python 的 split()
方法将收件人电子邮件字符串转换为列表,以便我可以向所有人发送电子邮件。
接下来,在 templates 文件夹中创建另一个名为 send_emails.html
的 HTML 文件,并在其中使用与 home.html
文件相同的表单代码。
要指定多个电子邮件收件人,请在每个电子邮件地址之间使用空格
first@gmail.com second@gmail.com third@gmail.com
您还应该通过添加代码来更新 urlpattern
列表
path("send-emails/", send_email)
发送 HTML 电子邮件
您还可以使用略微修改版本的 send_email
函数,使用 Django 发送 HTML 电子邮件
html_message = '''<h1>this is an automated message</h1>'''
msg = EmailMessage(subject, html_message, email_from,recipient_list, connection=connection)
msg.content_subtype = "html"
msg.send()
发送带附件的电子邮件
要将附件包含到邮件中,请创建一个变量,并将其放在字符串中的文件路径中,如下所示
attachment = "mail/templates/example.png"
然后,将 EmailMessage
函数移动到一个变量,并调用 attach_file
方法,然后调用 send
方法
msg = EmailMessage(subject, message, email_from, recipient_list, connection=connection)
msg.attach_file(attachment)
msg.send()
Django 电子邮件库
如果我不提及用户可用的电子邮件库,那么这份关于在 Django 中发送电子邮件的指南将是不完整的。以下是一些值得注意的电子邮件库。
- Django mailer 是一个用于排队的 Django 应用程序,因为它将电子邮件保存在数据库中,并在指定的时间发送邮件。
- Django templated email 旨在发送模板化的电子邮件。它提供诸如可配置的模板命名和位置、模板继承以及将收件人添加到抄送和密件抄送列表等功能。
- Anymail 允许使用电子邮件服务提供商 (ESP)。通过使用
django.core.mail
,它提供了一个持久的 API,避免将您的代码绑定到单个 ESP。
使用 Django 发送电子邮件
在 Django 中发送电子邮件听起来可能令人生畏,但它就像创建一个虚拟环境一样简单。您可以将 Django 添加到环境中并创建一个电子邮件后端。最后,您可以设置一个 HTML 模板。试试看。
评论已关闭。