J'ai essayé la communication SMTP avec Python

J'ai eu la chance d'implémenter la communication SMTP en Python, donc j'écrirai comment l'implémenter.

Lorsque je recherchais diverses méthodes de mise en œuvre, j'ai trouvé beaucoup d'informations sur la mise en œuvre avec l'ancienne API de la bibliothèque standard, mais je n'ai pas trouvé beaucoup de méthode avec l'API actuellement recommandée. Django, un framework Web, utilise également des API héritées, je ne pouvais donc pas me référer au code des principales bibliothèques et frameworks. Donc, je l'ai implémenté en lisant le code centré sur les bibliothèques standard de Python smtplib et ʻemail`.

environnement

Détails d'implémentation

  1. Établissement d'une connexion avec le serveur SMTP
  2. SMTP Auth
  3. Envoyer le contenu de l'e-mail
  4. Enregistrez les destinations qui ont échoué lors de l'envoi vers plusieurs destinations

Code source

import smtplib
from email.message import EmailMessage

class MailClient:
    def __init__(self, mail_data: Dict[str, Any] = {}) -> None:
        """
        Args:
            mail_data(Dict[]): Defaults to {}.
        """

        self._mail_data = mail_data

    def request(self) -> bool:
        """
        Returns:
            bool
        """

        with smtplib.SMTP(host=SMTP_HOST, port=int(SMTP_PORT)) as smtp:
            smtp.login(SMTP_USER, SMTP_PASSWORD)
            errors = smtp.send_message(self.message())

            if isinstance(errors, dict) and len(errors) > 0:
                logger.warn(
                    f'''Failed to send to all recipients.
                    Details: {errors}'''
                )

        return True

    def message(self) -> EmailMessage:
        msg = EmailMessage()
        msg['From'] = self._mail_data['from_address']
        msg['To'] = self._mail_data['to_address']
        msg['Subject'] = self._mail_data['subject']
        msg.set_default_type('text/plain')
        msg.set_content(self._mail_data['message'])

        bcc = self._mail_data.get('bcc')
        if bcc:
            msg['Bcc'] = convert_to_str(bcc)

        cc = self._mail_data.get('cc')
        if cc:
            msg['Cc'] = convert_to_str(cc)

        return msg

Commentaire

méthode de demande

Démarrez une connexion avec le serveur SMTP avec smtplib.SMTP. Si vous utilisez TLS, utilisez smtplib.SMTP_SSL, ou établissez une connexion en texte brut puis connectez-vous avec starttls (). Après avoir établi la connexion avec succès, authentifiez-vous avec login (). Envoyez ensuite les données avec send_message. C'est sendmail qui est en fait responsable de l'envoi des données. Exécutez la commande SMTP dans cette fonction pour envoyer un e-mail. En ce qui concerne la gestion des erreurs, je n'ai pas écrit try - sauf cette fois car je peux simplement lever si une exception se produit. Cependant, lors de l'envoi vers plusieurs destinations, même si une seule échoue, elle est enregistrée sous forme de journal. Ces informations sont la valeur de retour de send_message et sont stockées dans la variable ʻerrors`. Le type d'erreur est Dict, la clé est l'adresse de destination et la valeur est un taple contenant le code de réponse STMP et le message correspondant. Pour plus d'informations sur le moment où send_message / sendmail renvoie une valeur, accédez à here Il existe un code source, veuillez donc le lire.

méthode de message

Cette fois, les données de messagerie sont créées à l'aide d'EmailMessage du module de messagerie, mais vous pouvez directement affecter une chaîne de caractères à send_message ou sendmail. Cependant, nous ne le recommandons pas car c'est difficile si vous ne comprenez pas les spécifications du protocole. Utilisez le message électronique chaque fois que possible.

en conclusion

J'avais prévu de publier cet article plus tôt, mais j'ai oublié de l'écrire à mi-chemin, c'est donc devenu comme écrire un blog (rires). Bonne année: bonhomme de neige2:

Matériel de référence

Recommended Posts

J'ai essayé la communication SMTP avec Python
J'ai essayé de gratter avec Python
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé webScraping avec python.
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
# J'ai essayé quelque chose comme Vlookup avec Python # 2
Communication série avec Python
Communication de socket avec Python
Communication série avec python
J'ai essayé Python> autopep8
Communication HTTP avec Python
J'ai essayé Python> décorateur
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé des centaines de millions de SQLite avec python
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé L-Chika avec Razpai 4 (édition Python)
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé la synthèse de fonctions et le curry avec python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé d'exécuter faiss avec python, Go, Rust
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé d'exécuter Deep Floor Plan avec Python 3.6.10.
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
J'ai fait un blackjack avec du python!
J'ai essayé le clustering avec PyCaret
Afficher la communication Python avec Fiddler
J'ai essayé l'extension C de Python
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de toucher un fichier CSV avec Python
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de démarrer avec le script python de blender_Partie 02
Mayungo's Python Learning Episode 1: J'ai essayé d'imprimer avec impression
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé la "conversion de morphologie" de l'image avec Python + OpenCV
J'ai essayé de frapper l'API avec le client python d'echonest
J'ai essayé de résoudre la théorie des nombres entiers d'AOJ avec Python
J'ai essayé de déployer Kubernetes Pods / Helm Chart avec Pulumi (Python)
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé de simuler la propagation de l'infection avec Python
Communication de socket avec Python LEGO Mindstorms
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé de toucher Python (installation)
J'ai essayé d'envoyer un e-mail d'Amazon SES avec Python