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.
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
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.
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.
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:
Recommended Posts