在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角色,尤其是对于环境变量而言。
制定政策
输入政策
{
"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
让我们根据屏幕的指示继续前进吧。在途中会出现一个设置名称的画面,请记住这个名称,因为稍后会用到它。
这样,我们的政策就制定完成了。
创建IAM角色并附加策略。
点击创建角色
实体选择
请选择要附加的策略
在创建中的身份上附加策略时,选择策略。
这里会显示您自己创建的策略,以及AWS提供的预设策略。
请使用之前创建策略时指定的名称”SES_SendMail”进行搜索。
请输入您的姓名以完成创建。
最后,让我们输入该角色的名称并点击创建按钮。
附加到EC2
只要再努力一下,就快成功了!
点击更改IAM角色
选择并保存一个角色
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封/月的无限免费额度,对于个人开发者来说几乎可以免费使用。