在EC2上部署的Django中使用AWS SES

首先

有几种方法可以通过EC2发送电子邮件。
作为个人备忘,我将记录使用SES进行电子邮件发送的最主要方式。

购买域名

要发送电子邮件,需要一个域名。(就是@mail.com部分咯)
我们可以通过以下网站获得一个。

如果您从Route53直接购买的话

「直到将域名注册到Route 53为止」。详见链接:https://dev.classmethod.jp/articles/relaxing-send-limit-and-removing-sandbox-restriction-in-ses/。

使用其他服务

您无需在Route53上购买域名,也可以使用其他域名注册服务。最著名的是お名前.com。
您可以先获取域名,然后在お名前.com的设置页面的域名服务器栏中粘贴Route53的NS记录,完成设置。
建议您在お名前.com购买,因为往往会有优惠活动,价格会更便宜。

我也会在这里贴上DevelopersIO的网站链接,请看:
https://dev.classmethod.jp/articles/route53-domain-onamae/

Django的一面

安装django-ses

一旦成功获取域名,接下来需要在Django端进行操作。
通过安装Django-ses,就能轻松地在Django中操作SES。

pip install django-ses

由于django-ses需要连接名为boto的Python库和AWS服务,所以也需要安装它。

pip install boto3

通过这个功能,现在可以在Django的标准版本中使用SES了。

修改setting.py

打开setting.py文件并进行以下修改。
另外,…表示省略的意思。

INSTALLED_APPS = [
    ...
    'django_ses' #追加する

]
...
AWS_SES_REGION_NAME="ap-northeast-1" #追加する
AWS_SES_REGION_ENDPOINT="email.ap-northeast-1.amazonaws.com" #追加する
EMAIL_BACKEND="django_ses.SESBackend" #追加する
DEFAULT_FROM_EMAIL = "no-reply@mail.com" #追加する、@の後ろは取得したドメイン

我会简要地在每个项目上做一下笔记,虽然通过名字大致上也能明白。

AWS_SES_REGION_NAME是用来选择运行SES的区域。如果选择东京区域,则像例子中那样。

AWS_SES_REGION_ENDPOINT(亚马逊简易邮件服务地区终端节点)是SES(Simple Email Service)的终端节点。Django将通过此终端节点访问SES。请注意,还有一个类似的SMTP终端节点,但这不是它。

按照我个人的理解,我认为SES主要用于作为简单的SMTP服务器,而不是作为AWS服务。

电子邮件后端
电子邮件后端是Django中选择电子邮件服务的核心应用程序。
我认为默认情况下,它应该是以下的样子。

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

在Django中发送电子邮件时,这是指定SMTP服务器的默认后端。
如果在setting.py中配置了SMTP服务器,可以使用这个默认后端发送电子邮件,但这次我们将指定django-ses的后端。

DEFAULT_FROM_EMAIL是用于设置邮件的发件人地址。
如果不设置它,则默认情况下将使用webmaster@localhost作为发件人。由于SES中不存在localhost域名,因此会出现错误。

Django的配置已经完成。

EC2一侧

接下来是EC2的设置。
在运行Django的EC2和SES之间,将使用IAM角色进行认证。

在之前的setting.py文件中

AWS_ACCESS_KEY_ID = "***********************"

AWS_SECRET_ACCESS_KEY = "***********************"

通过输入IAM用户的访问密钥和秘密访问密钥,也可以进行认证。然而,直接在程序中写入访问密钥是不可取的,所以我们会使用IAM角色,尤其是对于环境变量而言。

制定政策

undefined

输入政策

undefined
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SESSendMail",
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail",
                "ses:GetSendQuota"
            ],
            "Resource": "*"
        }
    ]
}

SES有发送限额,可以通过GetSendQuota了解到该限额。如果角色中没有此权限,将会出现错误。
有关详细信息,请参考以下链接:https://docs.aws.amazon.com/ja_jp/ses/latest/dg/manage-sending-quotas-monitor.html

让我们根据屏幕的指示继续前进吧。在途中会出现一个设置名称的画面,请记住这个名称,因为稍后会用到它。

スクリーンショット 2022-04-29 0.10.48.png

这样,我们的政策就制定完成了。

创建IAM角色并附加策略。

スクリーンショット 2022-04-15 23.44.01.png

点击创建角色

スクリーンショット 2022-04-15 23.44.21.png

实体选择

スクリーンショット 2022-04-15 23.44.52.png

请选择要附加的策略

在创建中的身份上附加策略时,选择策略。
这里会显示您自己创建的策略,以及AWS提供的预设策略。
请使用之前创建策略时指定的名称”SES_SendMail”进行搜索。

スクリーンショット 2022-04-29 0.16.07.png

请输入您的姓名以完成创建。

最后,让我们输入该角色的名称并点击创建按钮。

スクリーンショット 2022-04-29 0.16.53.png

附加到EC2

只要再努力一下,就快成功了!

点击更改IAM角色

スクリーンショット 2022-04-29 0.24.34.png

选择并保存一个角色

スクリーンショット 2022-04-29 0.24.59.png

Django的配置方式

创建这样一个函数并调用它,就能发送邮件。

from django.core.mail import EmailMultiAlternatives

def send_email(subject,text_content,html_content,from_email,to_emails):
    msg = EmailMultiAlternatives(subject, text_content, from_email, [to_emails])
    msg.attach_alternative(html_content, "text/html")
    msg.send()

以下是对应的中文翻译:
请参考Django官方文档以获取更详细的说明,简单来说,
主题:邮件主题
text_content:纯文本邮件正文(用于当收件人无法支持HTML邮件时显示)
html_content:以HTML格式编写的邮件正文
from_email:发件人
to_emails:收件人(可以用列表指定)

只要没有需要发送HTML邮件的情况,似乎只需要这个就能发送。

from django.core.mail import send_mail

send_mail(
    'Subject here',
    'Here is the message.',
    'from@example.com',
    ['to@example.com'],
    fail_silently=False,
)

总结

在AWS上,您不需要在EC2上建立邮件服务器,也可以通过托管服务轻松发送电子邮件。而且,如果像本次一样通过EC2托管的应用程序使用SES发送电子邮件,那么有62,000封/月的无限免费额度,对于个人开发者来说几乎可以免费使用。

广告
将在 10 秒后关闭
bannerAds