Ich habe die SMTP-Kommunikation mit Python versucht

Ich hatte die Möglichkeit, die SMTP-Kommunikation in Python zu implementieren, daher werde ich schreiben, wie sie implementiert wird.

Als ich nach verschiedenen Implementierungsmethoden recherchierte, fand ich viele Informationen zur Implementierung mit der Legacy-API der Standardbibliothek, konnte jedoch mit der derzeit empfohlenen API nicht viele Methoden finden. Django, ein Webframework, verwendet auch ältere APIs, sodass ich nicht auf den Code der wichtigsten Bibliotheken und Frameworks verweisen konnte. Also habe ich es implementiert, während ich den Code gelesen habe, der sich auf die Standardbibliotheken von Pythons smtplib und email konzentriert.

Umgebung

Implementierungsdetails

  1. Herstellen einer Verbindung mit dem SMTP-Server
  2. SMTP Auth
  3. Mail-Inhalt senden
  4. Protokollieren Sie die Ziele, die beim Senden an mehrere Ziele fehlgeschlagen sind

Quellcode

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

Kommentar

Anforderungsmethode

Starten Sie eine Verbindung mit dem SMTP-Server mit smtplib.SMTP. Wenn Sie TLS verwenden, verwenden Sie "smtplib.SMTP_SSL" oder stellen Sie eine Verbindung im Klartext her und verwenden Sie dann "starttls ()", um eine Verbindung mit TLS herzustellen. Authentifizieren Sie sich nach erfolgreichem Verbindungsaufbau mit "login ()". Dann senden Sie die Daten mit send_message. Es ist sendmail, das tatsächlich für das Senden von Daten verantwortlich ist. Führen Sie den SMTP-Befehl in dieser Funktion aus, um eine E-Mail zu senden. In Bezug auf die Fehlerbehandlung habe ich keinen Versuch geschrieben - außer diesmal, da ich einfach auslösen kann, wenn eine Ausnahme auftritt. Wenn jedoch beim Senden an mehrere Ziele auch nur eines fehlschlägt, wird es als Protokoll aufgezeichnet. Diese Information ist der Rückgabewert von "send_message" und wird in der Variablen "fehler" gespeichert. Der Fehlertyp ist Dict, der Schlüssel ist die Zieladresse und der Wert ist ein Taple, das den STMP-Antwortcode und die entsprechende Nachricht enthält. Weitere Informationen darüber, wann send_message / sendmail einen Wert zurückgibt, finden Sie unter hier. Es gibt einen Quellcode, bitte lesen Sie ihn.

Nachrichtenmethode

Dieses Mal werden die E-Mail-Daten mit EmailMessage des E-Mail-Moduls erstellt. Sie können jedoch direkt "send_message" oder "sendmail" eine Zeichenfolge zuweisen. Wir empfehlen es jedoch nicht, da es schwierig ist, wenn Sie die Protokollspezifikationen nicht verstehen. Verwenden Sie nach Möglichkeit E-Mail-Nachrichten.

abschließend

Ich hatte vor, diesen Artikel früher zu veröffentlichen, aber ich habe vergessen, ihn zur Hälfte zu schreiben, so dass es wie das Schreiben eines Blogs wurde (lacht). Ich wünsche dir ein schönes Jahr: snowman2:

Referenzmaterial

Recommended Posts

Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Serielle Kommunikation mit Python
Socket-Kommunikation mit Python
Serielle Kommunikation mit Python
Ich habe Python> autopep8 ausprobiert
HTTP-Kommunikation mit Python
Ich habe Python> Decorator ausprobiert
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, mit Python Faiss zu laufen, Go, Rust
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, Deep Floor Plan mit Python 3.6.10 auszuführen.
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Ich habe einen Blackjack mit Python gemacht!
Ich habe versucht, mit PyCaret zu clustern
Ich habe die C-Erweiterung von Python ausprobiert
Ich habe mit Python einen Blackjack gemacht.
Ich habe Wordcloud mit Python gemacht.
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, eine CSV-Datei mit Python zu berühren
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Mayungos Python-Lernfolge 1: Ich habe versucht, mit Druck zu drucken
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Ich habe versucht, die API mit dem Python-Client von echonest zu erreichen
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich habe versucht, Kubernetes Pods / Helm Chart mit Pulumi (Python) bereitzustellen.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Socket-Kommunikation mit Python LEGO Mindstorms
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe versucht, Python zu berühren (Installation)
Ich habe versucht, mit Python eine E-Mail von Amazon SES zu senden