当我尝试使用Django-SES和Amazon SES进行邮件运营时,遇到了很多困难的经历(也介绍了最快的操作步骤)
首先
這是Django Advent Calendar 2019的第24篇文章。
我為了在聖誕夜思考Django而感到自豪,所以寫了這篇文章。笑
我仍然是个初学者,正在学习Django,但在某个问题上卡了好几个小时(一种稍微不同的困境?)。由于没有找到恰当的英文参考资料,我决定写这篇文章,希望其他人不要在同样的地方遇到困难。
这篇文章的结构
我們首先會介紹一個快速的方法,使用Django-ses和Amazon-SES來擴大讀者群並進行郵件發送。(。・_・。) 其次,我們也希望介紹一下本次主題中的困難部分!
目标读者
以下是针对那些打算使用django-ses和Amazon SES (Amazon Simple Email Service)来发送邮件的人的文章。
开发环境
-
- Python:3.8.0
-
- Django:2.2.9(※Django:3.0で環境構築すると詰まります。記事下へジャンプ)
-
- Django-ses:0.8.13
- boto3:1.10.44
确认本次目标
本次我们决定使用『AmazonSES和Django-SES』来实现send_mail的目标。
※由于环境搭建比目标本身更加困难,所以请允许我们在环境搭建方面使用Docker。
我已经在这里的GitHub上上传了程序的完成形式(需要在AmazonSES的KEY设置中修改settings)。
创建一个程序
Docker文件系列
首先,我会简单地放置一些Docker相关的文件。
请将以下文件创建在docker-ses-sample目录下。
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
version: "3"
services:
django-ses-sample:
build: .
volumes:
- .:/code
ports:
- "8000:8000"
command: python manage.py runserver 0.0.0.0:8000
下面是要安装的软件包清单。
Django==2.2.9
boto3==1.10.44
django-ses==0.8.13
↓当前目录是这样的↓
django-ses-sample
├ dockerfile
├ docker-compose.yml
└ requirements.txt
从这里开始一口气完成整个startproject过程。
首先,请打开能够操作docker的CLI。 (我使用的是Ubuntu18.04LTS的CLI)
接下来,将切换到工作目录。
~/$ cd django-ses-sample
~/django-ses-sample$ docker-compose run --rm django-ses-sample django-admin startproject config .
由于这个原因,在构建完成的同时,还可以直接启动项目,非常方便。
如果出现这样的提示,表示成功了。
Successfully tagged djangosessample_django-ses-sample:latest
当确认 django-ses-sample 文件夹下已经使用 startproject 创建好后,我们可以继续下一步!
Django相关的文件
接下来,我们将修改通过startproject创建的config目录中的settings.py文件。
在settings.py文件中有一个名为INSTALLED_APPS的字段,我们要在这里添加django_ses。
:
INSTALLED_APPS = [
:
'django_ses', #追加した
]
请向下滚动到最底部,并添加以下新的程序。
:
# AWS settings
AWS_ACCESS_KEY_ID = 'AKI***********' # アクセスキーID
AWS_SECRET_ACCESS_KEY = '****************************' # シークレットアクセスキー
# Email settings
EMAIL_BACKEND = 'django_ses.SESBackend' # これは必須
DEFAULT_FROM_EMAIL = SERVER_EMAIL = '**** <****@******>' #送信元のユーザ名とメールアドレス(例:'飛鳥 <asuka@nogi.com>')
现在需要设置访问密钥ID和机密访问密钥。因为这将在接下来的章节中在AWS上创建,所以现在留空即可。
另外,在EMAIL_BACKEND中设置了邮件传送配置。这里声明使用Django-SES。
最后一行将保留发件人的信息。
此时的程序已经放在这里的 GitHub 上。
我要去AWS进行各种设置。
亚马逊SES的注册步骤
只有解除了限制的帐户才能使用Amazon SES,使用前需要先注册发送和接收邮件的电子邮件地址。
-
- 首先请准备好一个AWS账号。
-
- 登录后,在服务中输入SES(Simple Email Service)并跳转到该页面。
-
- 在这里,如果你之前选择的是默认区域为东京,你将被要求选择一个区域,请务必选择美国东部(弗吉尼亚北部):us-east-1。(※这里我曾经遇到了困难,请跳转到文末)
-
- 在左侧栏会出现邮箱地址,请进行选择。
-
- 选择【Verify a New Mail Address】并注册一个可接收邮件的邮箱地址。
-
- 在这里,再次选择【Verify a New Mail Address】并注册另一个可接收邮件的邮箱地址。
-
- 接下来,你将会收到来自AWS的邮件,在邮件中点击链接以认证邮箱地址。
- 至此完成。
我对IAM进行注册
为使用AmazonSES,需要生成前面介绍的访问密钥ID和秘钥。
-
- 在服务中搜索IAM页面并跳转
-
- 在左侧栏中选择用户
-
- 选择“添加用户”
-
- 输入您喜欢的用户名
-
- 勾选访问程序
-
- 选择下方的“下一步”
-
- 选择直接附加现有策略
-
- 搜索SES并选择AmazonSESFullAccess
-
- 然后继续创建用户
-
- 在创建时可以下载csv文件
-
- 通过csv文件确认Access Key ID和Secret Access Key
- 至此完成。
请在config/settings.py中输入访问键ID和秘密访问键!
要确认SES是否在Django上能够运作
我们在设定的目标中确认了使用AmazonSES和Django-SES来实现send_mail的功能。因此,在Python的shell中导入并执行该功能。
~/django-ses-sample$ docker-compose run --rm django-ses-sample python3 manage.py shell
>>> from django.core.mail import send_mail
>>> title = '齋藤飛鳥です。'
>>> content = '明日のクリスマス空いてない?'
>>> host_email = 'SESで登録したメールアドレス①' # 例:asuka@nogi.com
>>> rece_email = ['SESで登録したメールアドレス②'] # 例:['hirochon@bocchi.com']
>>> send_mail(title,content,host_email,rece_email)
应该会收到邮件了(哭)。
今天我们来谈谈这篇文章的主题!(关于被卡住的故事)
请随意地看一下,就像顺道一样。哈哈笑
我先介绍一下遇到了什么问题!
- 我在Django3.0中成功配置了环境,并将区域设置为亚太区的孟买。
关于使用Django3.0构建环境的事项。
一旦正式发布,就会想要使用呢…哈哈
然而在Django 3.0中搭建环境时,会出现以下错误,可能与boto或django-ses的文件相关。
ImportError: cannot import name 'python_2_unicode_compatible' from 'django.utils.encoding
根据Django 3.0的官方文档和GitHub问题,看起来是由于废除了与Python 2兼容的API,导致出现了错误。
看起来如果修改文件的话,问题似乎会得到解决。但在 Docker 容器内(原本是在 PostgreSQL 上进行开发)的数据库中找不到该文件,通过使用 Django 2.2 版本,不再报错。
关于将地区设置为亚太地区的孟买一事。
偶尔会见到一些信息,说自己所在地区和附近地区的响应速度会更快,这让我无法控制地感到兴奋…
我在寻找各种文献来解决这个问题,但没有找到适合的。所以我决定写出来。
但是可能会有专家们的指责,所以我先写下这个。
在settings.py文件中写入设置是不可能的。
通过设置AWS_SES_REGION_NAME和AWS_SES_REGION_ENDPOINT,可以实现除了“美国东部(北弗吉尼亚)”(us-east-1)之外的区域设置。
例如,如果在亚马逊的SES中验证了电子邮件地址,只需将以下内容写入settings.py即可发送邮件,此处以“美国西部(俄勒冈州)”(us-west-2)为例。
AWS_ACCESS_KEY_ID = 'AKI***********' # アクセスキーID
AWS_SECRET_ACCESS_KEY = '**************************' # シークレットアクセスキー
AWS_SES_REGION_NAME = 'us-west-2' # 追加した
AWS_SES_REGION_ENDPOINT = 'email.us-west-2.amazonaws.com' # 追加した
但是!!!即使在“亚太地区(孟买)”(ap-south-1)进行了这种设置,也无法发送电子邮件!!
AWS_ACCESS_KEY_ID = 'AKI***********' # アクセスキーID
AWS_SECRET_ACCESS_KEY = '**************************' # シークレットアクセスキー
AWS_SES_REGION_NAME = 'ap-south-1' # 追加した
AWS_SES_REGION_ENDPOINT = 'email.ap-south-1.amazonaws.com' # 追加した
那最终到底哪里出了问题?
我得出的结论是,由于AWS在每个区域都有实施和未实施的服务,我猜想亚太地区(俄勒冈)可能还未实施该服务。
听说最近俄勒冈被添加到SES服务中,我觉得『可能在以后的更新中可以使用吧~』(/・ω・)/。
最后
感谢您一直阅读到最后。
如果在本次制作的程序中添加了allauth包等内容,就能够实现稳定的邮件功能。请务必利用最快的步骤来实施。如果有错误或意见等,请随意留言!
如果您能关注我的Twitter,我会感到高兴,因为我在那里分享我的后端学习经历,如Django、AWS和Docker,还涉猎一些机器学习。@heacet43
文献引用
1. Amazon SES 限制 (AmazonSES 文档 开发人员指南) [https://docs.aws.amazon.com/zh_cn/ses/latest/DeveloperGuide/limits.html]
2. Django 3.0 发行说明 (Django 文档) [https://docs.djangoproject.com/zh-hans/3.0/releases/3.0/#removed-private-python-2-compatibility-apis]
3. Django3 支持·问题 #598·treyhunner/django-simple-history(GitHub) [https://github.com/treyhunner/django-simple-history/issues/598]