E-Mail mit BytesIO-Anhang über SMTP in Python senden

English Deutsch

Dieses Beispiel beschreibt, wie man in Python eine E-Mail mit einem Anhang aus einer io.BytesIO-Instanz sendet, anstatt den Anhang aus einer Datei auf dem Dateisystem zu lesen:

example-5.txt
__author__ = "Uli Köhler"
__license__ = "CC0 1.0 Universal (public domain)"
__version__ = "1.0"
import smtplib
import mimetypes
from io import BytesIO
from email.message import EmailMessage

# Nachricht erstellen und Textinhalt setzen
msg = EmailMessage()
msg['Subject'] = 'This email contains an attachment'
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
# Textinhalt setzen
msg.set_content('Please see attached file')

def attach_bytesio_to_email(email, buf, filename):
    """Datei mit filename an E-Mail-Nachricht anhängen"""
    # Leseposition zurücksetzen & Daten extrahieren
    buf.seek(0)
    binary_data = buf.read()
    # MIME-Typ erraten oder 'application/octet-stream' verwenden
    maintype, _, subtype = (mimetypes.guess_type(filename)[0] or 'application/octet-stream').partition("/")
    # Als Anhang hinzufügen
    email.add_attachment(binary_data, maintype=maintype, subtype=subtype, filename=filename)

# Dateien anhängen
buf = BytesIO()
buf.write(b"This is a test text")
attach_bytesio_to_email(msg, buf, "test.txt")

def send_mail_smtp(mail, host, username, password):
    s = smtplib.SMTP(host)
    s.starttls()
    s.login(username, password)
    s.send_message(msg)
    s.quit()

send_mail_smtp(msg, 'smtp.my-domain.com', '[email protected]', 'sae7ooka0S')

Das obige Skript verwendet die folgenden Hilfsfunktionen:

example-4.py
    """Datei mit filename an E-Mail-Nachricht anhängen"""
    # Leseposition zurücksetzen & Daten extrahieren
    buf.seek(0)
    binary_data = buf.read()
    # MIME-Typ erraten oder 'application/octet-stream' verwenden
    maintype, _, subtype = (mimetypes.guess_type(filename)[0] or 'application/octet-stream').partition("/")
    # Als Anhang hinzufügen
    email.add_attachment(binary_data, maintype=maintype, subtype=subtype, filename=filename

def send_mail_smtp(mail, host, username, password):
    s = smtplib.SMTP(host)
    s.starttls()
    s.login(username, password)
    s.send_message(msg)
    s.quit()

die man direkt im eigenen Code verwenden kann. Die einfachste Möglichkeit, die E-Mail-Nachricht zu initialisieren, ist

example-3.py
msg = EmailMessage()
msg['Subject'] = 'This email contains an attachment'
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
# Textinhalt setzen
msg.set_content('Please see attached file')

und dann die BytesIO-Instanz (named buf) anhängen mit

example-2.py

und sobald alle Anhänge hinzugefügt sind, die Nachricht senden mit

example-1.py

Check out similar posts by category: E-Mail, Python