当我尝试使用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,使用前需要先注册发送和接收邮件的电子邮件地址。

    1. 首先请准备好一个AWS账号。

 

    1. 登录后,在服务中输入SES(Simple Email Service)并跳转到该页面。

 

    1. 在这里,如果你之前选择的是默认区域为东京,你将被要求选择一个区域,请务必选择美国东部(弗吉尼亚北部):us-east-1。(※这里我曾经遇到了困难,请跳转到文末)

 

    1. 在左侧栏会出现邮箱地址,请进行选择。

 

    1. 选择【Verify a New Mail Address】并注册一个可接收邮件的邮箱地址。

 

    1. 在这里,再次选择【Verify a New Mail Address】并注册另一个可接收邮件的邮箱地址。

 

    1. 接下来,你将会收到来自AWS的邮件,在邮件中点击链接以认证邮箱地址。

 

    至此完成。

我对IAM进行注册

为使用AmazonSES,需要生成前面介绍的访问密钥ID和秘钥。

    1. 在服务中搜索IAM页面并跳转

 

    1. 在左侧栏中选择用户

 

    1. 选择“添加用户”

 

    1. 输入您喜欢的用户名

 

    1. 勾选访问程序

 

    1. 选择下方的“下一步”

 

    1. 选择直接附加现有策略

 

    1. 搜索SES并选择AmazonSESFullAccess

 

    1. 然后继续创建用户

 

    1. 在创建时可以下载csv文件

 

    1. 通过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]

bannerAds