Comment recevoir des e-mails avec le framework Flask pour Python

Publié: 2020-04-30

S'il existe de nombreux tutoriels sur Internet concernant l'envoi d'e-mails, il y a très peu de choses sur la façon de configurer une application pour les recevoir et les traiter. C'est une tâche qui peut être incroyablement difficile si vous essayez de tout configurer par vous-même, mais c'est aussi simple que de recevoir une requête Web lorsque vous utilisez la fonction Inbound Parse de Twilio SendGrid .

Dans ce court didacticiel, vous allez apprendre à faire en sorte que Twilio SendGrid transmette vos e-mails directement à votre application Web, en utilisant Python et le framework Web Flask.

Conditions

Voici les conditions requises pour terminer ce didacticiel :

  • Python 3 : si votre système d'exploitation ne fournit pas d'interpréteur Python 3, vous pouvez vous rendre sur python.org pour télécharger un programme d'installation.
  • Un compte Twilio SendGrid : Si vous êtes nouveau sur Twilio SendGrid, vous pouvez créer un compte gratuit , qui vous permet d'envoyer 100 e-mails par jour pour toujours.
  • Un domaine sur lequel vous recevrez des emails : Tout au long de cet article, je vais utiliser votredomaineici.com . Vous devrez le remplacer par votre propre nom de domaine.
  • ngrok : Nous utiliserons cet utilitaire pratique pour connecter l'application Flask exécutée localement sur votre ordinateur à une URL publique à laquelle SendGrid peut envoyer des requêtes. Ceci est nécessaire pour la version de développement de l'application car votre ordinateur est probablement derrière un routeur ou un pare-feu, il n'est donc pas directement accessible sur Internet. Si vous n'avez pas installé ngrok, vous pouvez télécharger une copie pour Windows, MacOS ou Linux .

Authentification de domaine

Avant que Twilio SendGrid puisse accepter les e-mails sur votre domaine, vous devez l' authentifier , afin que Twilio SendGrid sache que le domaine est sous votre contrôle.

Lancer l'authentification du domaine

Pour authentifier votre domaine, connectez- vous à votre compte SendGrid et, dans la barre de navigation de gauche, ouvrez "Paramètres" puis sélectionnez Authentification de l'expéditeur .

Dans la page Authentification de l'expéditeur , cliquez sur le bouton "Commencer" dans la section "Authentification de domaine".

Il vous sera demandé de sélectionner votre fournisseur DNS, qui dans la plupart des cas est la même société auprès de laquelle vous avez acheté votre domaine. Si votre fournisseur DNS n'apparaît pas dans la liste, ou si vous ne savez pas qui il est, sélectionnez simplement "Je ne suis pas sûr".

Il vous sera ensuite demandé d'ajouter une marque aux liens qui apparaissent dans les e-mails sortants. Ce n'est pas un sujet qui nous préoccupe pour le moment, alors sélectionnez "Non". Vous pouvez activer cette option ultérieurement si vous souhaitez l'utiliser.

Cliquez sur le bouton "Suivant" pour passer à la page suivante.

Dans la page suivante, il vous sera demandé de fournir votre nom de domaine. J'ai entré votredomaineici.com , et vous devrez entrer le domaine que vous avez l'intention d'utiliser. Vous n'avez rien à changer dans la section "Paramètres avancés".

Cliquez sur le bouton "Suivant" pour continuer.

La page affichera maintenant 3 nouveaux enregistrements DNS que vous devez ajouter à la configuration de votre domaine, chacun avec un type, un nom d'hôte et une valeur. Pour votre commodité, l'hôte et les valeurs peuvent tous être copiés dans le presse-papiers. Ci-dessous, vous pouvez voir les paramètres qui m'ont été donnés. Les vôtres seront similaires, mais avec votre propre nom de domaine :

Ajouter des entrées DNS à votre domaine

La prochaine étape sera différente selon votre fournisseur DNS. Visitez la page de configuration de votre domaine et trouvez où les paramètres DNS sont modifiés.

Les captures d'écran ci-dessous concernent Google Domains . Vous pouvez voir comment j'ai ajouté le premier des trois enregistrements DNS dans l'image suivante. Notez que les 3 enregistrements avec les noms @, ftp et www ne sont pas liés à ce tutoriel et ont déjà été définis sur mon domaine.

Faites attention à la façon dont vous entrez le nom de l'enregistrement DNS. Alors que certains fournisseurs s'attendent à un nom complet pour vos enregistrements DNS, comme indiqué par SendGrid, d'autres attendent uniquement la partie avant le nom de domaine. Par exemple, l'enregistrement affiché par SendGrid sous la forme em3329.yourdomainhere.com devait être saisi sous la forme em3329 sur Google Domains. Vérifiez vos autres enregistrements DNS et soyez cohérent dans la façon dont vous entrez ces nouveaux.

Voici à quoi ressemblaient les 3 nouveaux enregistrements DNS après que je les ai saisis :

Vérification de domaine

Revenez maintenant à la page Authentification de l'expéditeur SendGrid , où votre domaine apparaîtra comme en attente. Cliquez dessus pour poursuivre le processus d'authentification.

Dans l'écran suivant, vous verrez les 3 enregistrements DNS. Cliquez sur le bouton "Vérifier" en haut à droite de la page pour que SendGrid extraie vos enregistrements DNS et confirme que vous avez ajouté les entrées demandées.

Si SendGrid est en mesure de vérifier votre domaine, vous obtiendrez un "Ça a marché!" page:

Si, en revanche, SendGrid ne peut pas vérifier vos entrées DNS, vous devrez réessayer plus tard. Chaque fois que des modifications DNS sont apportées, il faut un certain temps pour que les modifications se propagent sur les serveurs DNS. Un échec juste après avoir modifié vos entrées DNS signifie simplement que vous devez lui donner un peu plus de temps avant d'appuyer à nouveau sur le bouton "Vérifier". Notez que la propagation complète du DNS peut prendre jusqu'à 48 heures, bien que cela prenne généralement beaucoup moins de temps.

Une fois que vous obtenez le "Cela a fonctionné!" page, vous êtes sur la bonne voie pour recevoir des e-mails publiés sur votre application Web Flask.

Une application de messagerie Flask

Nous sommes maintenant prêts à écrire une simple application Web Flask où SendGrid peut transférer nos e-mails.

Créer un environnement virtuel Python

En suivant les meilleures pratiques Python, nous allons créer un répertoire séparé pour notre projet, et à l'intérieur, nous allons créer un environnement virtuel . Nous allons ensuite installer le framework Flask dessus.

Si vous utilisez un système Unix ou Mac OS, ouvrez un terminal et entrez les commandes suivantes pour effectuer les tâches décrites ci-dessus :

Si vous suivez le didacticiel sous Windows, entrez les commandes suivantes dans une fenêtre d'invite de commande :

Une route de courrier entrant

Écrivons maintenant une application Flask qui recevra les e-mails entrants. Le code de l'application complète est indiqué ci-dessous. Mettez ce code dans un fichier nommé app.py .

L'application n'a qu'une seule route Web connectée à l' URL /email . Nous demanderons à SendGrid d'invoquer cette route pour nous transmettre les e-mails entrants. La demande qu'ils envoient contiendra tous les détails liés à l'e-mail envoyé sous la forme d'un message de formulaire HTTP standard. Cela signifie qu'à partir de Flask, nous pouvons facilement accéder à tous ces détails à partir du dictionnaire `request.form`.

Les variables de formulaire suivantes sont particulièrement intéressantes :

  • `request.form['from']` : l'expéditeur de l'e-mail
  • `request.form['to']` : le(s) destinataire(s) de l'e-mail
  • `request.form['subject']` : l'objet de l'e-mail
  • `request.form['text']` le corps de l'e-mail au format texte brut
  • `request.form['html']` le corps de l'e-mail au format HTML

Notez que ce ne sont pas les seuls champs soumis par SendGrid. Consultez la liste complète des paramètres de messagerie dans la documentation SendGrid.

Étant donné que le traitement des e-mails dépend en grande partie de chaque application, pour l'exemple d'application Flask, tout ce que nous faisons est d'imprimer les champs d'e-mail sur la console.

Après avoir enregistré app.py , vous pouvez démarrer l'application Flask comme suit :

L'application est maintenant en cours d'exécution et écoute les demandes entrantes, mais elle n'est accessible qu'à partir de votre propre ordinateur. Laissez l'application en cours d'exécution sur la fenêtre de votre terminal pour le moment. Dans la section suivante, nous l'exposerons à Internet.

Le webhook SendGrid Inbound Parse

Le dernier de ce tutoriel consiste à configurer SendGrid pour transférer les e-mails entrants sur votre domaine vers l'application Flask.

Démarrage ngrok

L'outil ngrok crée une URL accessible au public et la mappe à une application exécutée localement. Il s'agit d'une technique courante utilisée pour exposer des services sur Internet à des fins de développement et de test. Une fois votre application Flask terminée, vous la déploierez pour la production sur un serveur approprié et cela ne sera plus nécessaire.

Si vous ne l'avez pas encore fait, installez ngrok sur votre système. Laissez l'application Flask en cours d'exécution et ouvrez une deuxième fenêtre de terminal pour démarrer ngrok comme suit :

Cela indique à ngrok de créer un "tunnel" de l'Internet public vers le port 5000 de notre machine locale, où l'application Flask attend les requêtes Web. La sortie de ngrok va ressembler à ceci :

Notez les lignes commençant par "Transfert" dans l'écran ngrok. Ceux-ci affichent une URL publique générée de manière aléatoire que ngrok utilise pour rediriger les demandes vers notre service. Nous allons utiliser l' URL https:// car elle utilise le cryptage.

Enregistrement de l'URL du webhook avec SendGrid

Revenez au tableau de bord SendGrid et sous Paramètres, sélectionnez Inbound Parse , puis cliquez sur "Ajouter un hôte et une URL".

Dans la page suivante, entrez le sous- domaine sur lequel vous recevrez des e-mails. Il peut s'agir de n'importe quel sous-domaine qui n'est pas encore utilisé sur votre domaine, ou si vous préférez recevoir des e-mails directement sur votre domaine de premier niveau, il peut simplement être laissé vide. Dans l'image ci-dessous, j'ai utilisé le sous-domaine parse , ce qui signifie que les e-mails acceptés par SendGrid auront le format < thing>@parse.yourdomainhere.com . Laisser le champ de sous-domaine vide permettra à SendGrid d'accepter les e-mails pour <anything>@yourdomainhere.com , ce qui dans certains cas peut être préférable.

Ensuite, vous devez sélectionner votre nom de domaine . Il s'agit d'une liste déroulante qui affiche tous les domaines que vous avez vérifiés avec SendGrid. Si vous faites cela pour la première fois, vous ne verrez que le domaine que vous avez vérifié précédemment.

Le champ suivant correspond à l' URL de destination de votre webhook. Il s'agit de l'URL générée par ngrok ajoutée à l'URL Flask /email . Dans mon cas, c'était https://bbf1b72b.ngrok.io/email . Vous aurez une URL similaire, mais la première partie du nom d'hôte ngrok sera différente.

Cliquez sur "Ajouter" pour configurer votre webhook.

Vous verrez maintenant une entrée pour votre webhook dans la page principale Inbound Parse :

Remarque : les URL ngrok changent à chaque fois que ngrok est arrêté et redémarré, donc pendant le développement, vous devrez modifier votre webhook pour mettre à jour l'URL chaque fois que vous redémarrez ngrok. Lorsque vous déployez votre webhook pour une utilisation en production, vous l'hébergerez directement sur une URL publique, de sorte que ngrok ne sera pas utilisé.

Enregistrement du sous-domaine d'analyse

Le sous-domaine que vous avez sélectionné pour recevoir les e-mails dans la section précédente doit être défini dans la configuration DNS de votre domaine avec un enregistrement "MX". La valeur de cet enregistrement est la même pour tous les clients SendGrid : `mx.sendgrid.net.` (notez le point de fin après "net").

Dans ma configuration DNS Google Domains, j'ai défini mon sous-domaine d' analyse comme suit :

Rappelez-vous que selon le fournisseur de domaine que vous utilisez, vous devrez peut-être entrer le nom d'hôte complet pour cet enregistrement DNS, donc dans ce cas, ce serait parse.yourdomainhere.com .

Si vous avez décidé de ne pas définir de sous-domaine dans la section précédente, votre nom d'hôte sera votredomaineici.com , qui pour certains fournisseurs DNS doit être donné sous la forme « @ ».

N'oubliez pas que ce changement DNS devra également se propager, vous ne pourrez donc peut-être pas recevoir d'e-mails immédiatement.

Envoi d'un e-mail de test

Pendant que votre application Flask et ngrok sont en cours d'exécution, ouvrez votre client de messagerie et envoyez un e-mail de test. Dans le champ "À :", vous pouvez entrer le nom d'utilisateur de votre choix, car SendGrid capture tous les noms d'utilisateur. Ce qui se passe après le @ doit être votre domaine complet de réception d'e-mails.

Dans l'exemple ci-dessous, j'ai envoyé un e-mail à [email protected] :

Attendez une minute ou deux pour que SendGrid reçoive l'e-mail et le transfère à l'URL du webhook ngrok, qui à son tour le transmettra au point de terminaison /email de Flask. Comme vous l'avez vu ci-dessus, le point de terminaison simple que j'ai écrit dans l'application Flask imprime les données d'e-mail reçues sur la console :

Alors ça y est, nous recevons maintenant des e-mails sous forme de requêtes Web dans notre application Flask !

Déploiement en production

Dans cette section, je souhaite souligner quelques différences importantes entre les webhooks déployés pendant le développement et ceux destinés à une utilisation en production.

Déploiements sans ngrok

Comme mentionné ci-dessus, ngrok n'est pas un outil de production et ne doit jamais être utilisé dans un déploiement de production. Au lieu de cela, vous déploierez votre application Flask sur un serveur directement connecté à Internet. Il existe plusieurs options de déploiement décrites dans la documentation de Flask.

Sécurité Webhook

Considérez que votre point de terminaison de réception d'e-mails est disponible publiquement sur Internet, de sorte que toute personne connaissant l'URL peut lui envoyer une demande, exposant potentiellement votre application à de fausses invocations envoyées par des utilisateurs malveillants se faisant passer pour des demandes SendGrid.

Une bonne mesure pour empêcher ce type d'attaque consiste à implémenter l' authentification de base sur votre point de terminaison Flask. L' extension Flask-HTTPAuth peut être utile pour implémenter ce type de sécurité.

Si vous ajoutez l'authentification à votre point de terminaison, vous devez ensuite inclure le nom d'utilisateur et le mot de passe dans l'URL du webhook donnée à SendGrid. Le webhook que j'ai utilisé ci-dessus devrait être donné comme https://username:[email protected]/email.

Conclusion

Même s'il y a beaucoup d'étapes impliquées dans la configuration de tout pour recevoir des e-mails, c'est l'un des moyens les plus simples d'y parvenir. Pour plus d'informations sur Inbound Parse, consultez notre page de documentation.

Nous avons hâte de voir ce que vous construisez avec Inbound Parse !