[PYTHON] Django-Une histoire qui s'est bloquée lors de la tentative d'exploitation du courrier avec SES et Amazon SES (Présentation de la procédure d'opération la plus rapide)

introduction

Ceci est l'article du 24ème jour du Calendrier de l'Avent Django 2019. J'ai écrit un article avec fierté en pensant à Django la veille de Noël. Lol

Je suis encore un débutant, mais j'étudiais Django et à un moment donné, je suis resté coincé pendant des heures (une petite nouvelle façon de rester coincé?). Même si la référence était en anglais, il n'y avait pas d'article qui était juste, j'ai donc décidé d'écrire cet article avec le sentiment que "je ne veux pas que les autres trébuchent ici".

Structure de cet article

Tout d'abord, je vais vous présenter la procédure la plus rapide pour envoyer du courrier en utilisant Django-ses et Amazon-SES pour élargir le lectorat (. ・ _ ・.) Ensuite, je voudrais vous présenter la partie emballée qui est le sujet principal de cette fois!

Public cible

Comme le titre l'indique, cet article est destiné aux «personnes qui souhaitent envoyer des e-mails en utilisant ** django-ses ** et ** Amazon SES ** (Amazon Simple Email Service)».

Environnement de développement

Confirmer cet objectif

Cette fois, "Si vous pouvez send_mail en utilisant Amazon SES et Django-SES, vous atteindrez votre objectif! Je dirais.

Le formulaire rempli du programme (la fourmi qui doit ajuster les paramètres avec le paramètre KEY d'Amazon SES) est répertorié dans GitHub here.

Créer un programme

Fichiers Docker

Tout d'abord, je vais mettre les fichiers de type Docker. Créez le fichier suivant dans le répertoire docker-ses-sample.

dockerfile


FROM python:3

ENV PYTHONUNBUFFERED 1

RUN mkdir /code
WORKDIR /code

COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

docker-compose.yml


version: "3"
services: 
    django-ses-sample:
        build: .
        volumes: 
            - .:/code
        ports: 
            - "8000:8000"
        command: python manage.py runserver 0.0.0.0:8000

Voici une liste de packages à installer ensuite.

requirements.txt


Django==2.2.9
boto3==1.10.44
django-ses==0.8.13

↓ Répertoire actuel comme celui-ci ↓

Directeur de travail


django-ses-sample
           ├ dockerfile
           ├ docker-compose.yml
           └ requirements.txt

D'ici au projet de départ à la fois. Tout d'abord, ouvrez la CLI où vous pouvez jouer avec le docker. (J'utilise la CLI Ubuntu 18.04 LTS)

Accédez ensuite à votre répertoire de travail.

CLI que le docker peut jouer


~/$ cd django-ses-sample
~/django-ses-sample$ docker-compose run --rm django-ses-sample django-admin startproject config .

Cela facilite les choses car vous pouvez accéder au projet de démarrage pendant la construction. Et quand un tel affichage arrive, c'est réussi.

CLI que le docker peut jouer


Successfully tagged djangosessample_django-ses-sample:latest

Et si vous pouvez voir le projet de démarrage sous django-ses-sample, passons à autre chose!

Fichiers Django

Ensuite, nous jouerons avec settings.py dans la configuration créée par startproject. Il y a une colonne appelée INSTALLED_APPS dans settings.py, alors ajoutez django_ses ici.

settings.py


     :
INSTALLED_APPS = [
         :
    'django_ses', #Ajoutée
]

Puis faites défiler vers le bas et ajoutez le nouveau programme suivant.

settings.py


    :
# AWS settings 
AWS_ACCESS_KEY_ID = 'AKI***********'       #ID de la clé d'accès
AWS_SECRET_ACCESS_KEY = '****************************'     #Clé d'accès secrète

# Email settings
EMAIL_BACKEND = 'django_ses.SESBackend'         #C'est obligatoire
DEFAULT_FROM_EMAIL = SERVER_EMAIL = '**** <****@******>' #Nom d'utilisateur et adresse e-mail de l'expéditeur(Exemple:'Asuka<[email protected]>')

Vous devez définir l'ID de la clé d'accès et la clé d'accès secrète comme ceci. Cela sera créé dans AWS dans le chapitre suivant, vous pouvez donc le laisser vide pour le moment. En outre, la distribution des e-mails est définie par EMAIL_BACKEND. Je déclare utiliser Django-SES ici. La dernière ligne contient les informations de l'expéditeur.

Le programme à ce stade a été placé sur GitHub here.

Accédez à AWS pour divers paramètres

Procédure d'enregistrement Amazon SES

  1. Commencez par préparer un compte AWS.

  2. Après vous être connecté, entrez SES (Simple Email Service) dans le service et accédez à cette page.

  3. Si vous avez probablement défini ici la région standard de Tokyo, vous serez invité à sélectionner une région, assurez-vous donc de sélectionner ** Est des États-Unis (Virginie du Nord): us-east-1 *. ( Je suis coincé ici. [Aller en bas de l'article](# Je vais entrer dans le sujet principal de cet article))

  4. Les adresses e-mail apparaîtront dans la colonne de gauche, alors sélectionnez-la.

  5. Sélectionnez [Varify a New mail a dress] et enregistrez une adresse e-mail recevable.

  6. Ici, veuillez enregistrer une autre adresse e-mail recevable avec [Varify a New mail a dress].

  7. Ensuite, un e-mail sera envoyé d'AWS à l'adresse e-mail enregistrée en 5 et 6, veuillez donc accéder à cette URL et authentifier votre adresse e-mail.

  8. Ceci termine

Enregistrement IAM

Pour utiliser AmazonSES, vous devez générer l'ID de clé d'accès et la clé d'accès secrète introduits précédemment.

  1. Recherchez la page IAM du service et volez
  2. Sélectionnez un utilisateur dans la colonne de gauche
  3. Sélectionnez Ajouter un utilisateur
  4. Entrez le nom d'utilisateur comme vous le souhaitez
  5. Vérifiez l'accès programmatique
  6. Sélectionnez l'étape suivante ci-dessous
  7. Sélectionnez Attacher directement la stratégie existante
  8. Recherchez SES et sélectionnez Amazon SES Full Access.
  9. Après cela, veuillez passer par et créer un utilisateur
  10. Vous pouvez télécharger csv lorsque vous le créez, alors téléchargez-le
  11. Vérifiez l'ID de la clé d'accès et la clé d'accès secrète avec csv
  12. Ceci termine

Enfin, entrez l'ID de la clé d'accès et la clé d'accès secrète dans config / settings.py! !!

Vérifiez si SES fonctionne avec Django

La méthode de confirmation était le but de cette fois, "Si vous pouvez send_mail en utilisant Amazon SES et Django-SES, vous atteindrez l'objectif! ], Donc send_mail est utilisé, alors importez-le avec le shell python et exécutez-le.

CLI


~/django-ses-sample$ docker-compose run --rm django-ses-sample python3 manage.py shell
>>> from django.core.mail import send_mail
>>> title = 'C'est Asuka Saito.'
>>> content = 'Le Noël de demain n'est-il pas gratuit?'
>>> host_email = 'Adresse e-mail enregistrée auprès de SES ①'    #Exemple:[email protected]
>>> rece_email = ['Adresse e-mail enregistrée auprès de SES ②']  #Exemple:['[email protected]']
>>> send_mail(title,content,host_email,rece_email)

Vous devriez maintenant recevoir un e-mail (pleurer)

Entrons dans le sujet principal de cet article! !! !! (Histoire bouchée)

S'il vous plaît, jetez-y un coup d'oeil comme note latérale. Lol

Je vais vous dire où j'ai trébuché en premier!

  1. ** Créer un environnement avec Django 3.0 **
  2. ** Définition de la région à Mumbai en Asie-Pacifique **

① À propos de la création d'un environnement avec Django 3.0

Vous voudrez l'utiliser quand il sera officiellement publié ... lol

Cependant, lorsque je construis l'environnement avec Django 3.0, j'obtiens cette erreur liée aux fichiers de boto ou django-ses.

CLI


ImportError: cannot import name 'python_2_unicode_compatible' from 'django.utils.encoding

Il semble que Django 3.0 a commencé à générer des erreurs en raison de l'abolition de l'API de compatibilité Python 2. * 2 Documentation Officielle Django * 3 problèmes GitHub

Apparemment, il semble guéri si je joue avec le fichier, mais le fichier n'a pas été trouvé dans la base de données du conteneur Docker (développé à l'origine avec PostgreSQL), et en utilisant la série Django 2.2, je ne lance plus d'erreur.

② À propos de la définition de la région sur Mumbai de l'Asie-Pacifique

J'ai été frappé par les informations que j'ai vues ici et là, "Une région plus proche de ma région a une réponse plus rapide" ...

J'ai cherché dans divers documents le problème ici, mais aucun d'entre eux ne semblait convenir. J'ai donc décidé d'écrire cette fois.

Cependant, il est probable que les experts le soulignent, donc je vais d'abord écrire ici.

Il était impossible d'écrire les paramètres dans settings.py

En définissant AWS_SES_REGION_NAME et AWS_SES_REGION_ENDPOINT, il est possible de définir des régions autres que "Est des États-Unis (Virginie du Nord)" (us-east-1).

Par exemple, dans "Ouest des États-Unis (Oregon)" (us-west-2), après avoir authentifié votre adresse e-mail auprès d'Amazon SES, vous pouvez envoyer un e-mail en écrivant ceci dans settings.py.

settings.py


AWS_ACCESS_KEY_ID = 'AKI***********'       #ID de la clé d'accès
AWS_SECRET_ACCESS_KEY = '**************************'        #Clé d'accès secrète
AWS_SES_REGION_NAME = 'us-west-2'          #Ajoutée
AWS_SES_REGION_ENDPOINT = 'email.us-west-2.amazonaws.com'   #Ajoutée

mais! !! !! ** Avec "Asia Pacific (Mumbai)" (ap-south-1), vous ne pouvez pas envoyer d'e-mail même si vous le définissez comme ceci! !! ** **

settings.py


AWS_ACCESS_KEY_ID = 'AKI***********'       #ID de la clé d'accès
AWS_SECRET_ACCESS_KEY = '**************************'        #Clé d'accès secrète
AWS_SES_REGION_NAME = 'ap-south-1'          #Ajoutée
AWS_SES_REGION_ENDPOINT = 'email.ap-south-1.amazonaws.com'   #Ajoutée

Alors qu'est-ce qui n'allait pas après tout? ??

Ma conclusion est qu'AWS propose certains services qui ne sont pas mis en œuvre pour chaque région, donc ** l'Asie-Pacifique (Oregon) n'a pas encore implémenté ce service **. Je suppose que non.

En fait, il semble que l'Oregon a été ajouté au service SES récemment, et je pense que "je pense qu'il sera probablement disponible dans les futures mises à jour" (/ ・ ω ・) /

à la fin

Merci d'avoir lu jusqu'au bout. Si vous ajoutez le package allauth etc. au programme créé cette fois-ci, vous serez en mesure d'implémenter une fonction de courrier électronique solide, veuillez donc profiter de la procédure la plus rapide. Si vous avez des erreurs ou des impressions, n'hésitez pas à commenter! !!

Je vous serais reconnaissant de bien vouloir suivre mon Twitter, qui étudie les backends tels que Django, AWS et Docker, et fait également des efforts en matière d'apprentissage automatique! !@ heacet43

Les références

Recommended Posts

Django-Une histoire qui s'est bloquée lors de la tentative d'exploitation du courrier avec SES et Amazon SES (Présentation de la procédure d'opération la plus rapide)
Une histoire bloquée lors de la tentative de mise à niveau de la version Python avec GCE
Une histoire qui a échoué lors de la tentative de suppression du suffixe d'une chaîne avec rstrip
Problèmes et solutions survenus lors de la tentative de mettre rbenv avec le sous-module git (également pyenv)
Une histoire qui nécessitait des préparatifs pour essayer de faire un tutoriel Django avec des centos simples
Je suis resté bloqué en essayant de spécifier un chemin relatif avec relative_to () en python
Une histoire sur la tentative de contribuer à l'analyse COVID-19 avec l'offre gratuite d'AWS et l'échec
Lors de l'écriture dans un fichier csv avec python, une histoire que j'ai fait une légère erreur et n'a pas respecté la date de livraison