Tagebuch-Eintrag #44
E-Mail senden mit Python
Ich habe mich nochmal mit meinem ersten Python-Projekt zum drucken von PDF-Dateien aus E-Mails beschäftigt, weil da noch eine nützliche Funktion gefehlt hat.
Ich möchte nämlich eine Bestätigungsemail an den Absender schicken und auflisten, dass die Dateien gedruckt wurden.
Und für das Senden der E-Mails brauche ich auch ein andere Python-Modul, welches smtplib heißt.
Dieses Modul ermöglich es sich mit dem SMTP-Server zu verbinden und eine einfach Email zu senden. Der Code mit der Grundfunktion sieht wie folgt aus:
import smtplib
host = "HOST/SMTP SERVER"
port = "PORT"
smtp_user = "SMTP_USER"
smtp_pass = "PASWORT"
from_email ="ABSENDER@DOMAIN.DE"
to_email = "EMPFÄNGER@DOMAIN.DE"
smtp = smtplib.SMTP(host, port)
smtp.login(smtp_user, smtp_pass)
message = "Hallo!\nDiese Nachricht wurde automatisch mit Python gesendet."
smtp.sendmail(from_email, to_email, message)
smtp.close()
Das Senden der E-Mail mit der Nachricht funktioniert zwar, aber es fehlen noch wichtig Informationen im E-Mail Header wie Absender, Betreff, Empfänger.

Email mit Email-Header + Nachricht
Damit auch der E-Mail Header mit Informationen gefüllt werden kann, gibt es dafür ein weiteres Python-Moduls namens EmailMessage.
Damit lassen sich neben dem Inhalt (Body), auch Absender, Empfänger und Betreff definieren und zusammenführen.
import smtplib
from email.message import EmailMessage
host = "HOST/SMTP SERVER"
port = "PORT"
smtp_user = "SMTP_USER"
smtp_pass = "PASSWORT"
from_email ="ABSENDER@DOMAIN.DE"
to_email = "EMPFÄNGER@DOMAIN.DE"
msg = EmailMessage()
msg["FROM"] = from_email
msg["To"] = to_email
msg["Subject"] = "Python Nachricht"
msg.set_content("Hallo!\nDiese Nachricht wurde automatisch mit Python gesendet!!!!.")
text = msg.as_string()
smtp = smtplib.SMTP(host, port)
smtp.login(smtp_user, smtp_pass)
smtp.sendmail(from_email, to_email, text)
smtp.close()
Und schon sieht die Email schon besser aus, wie eine ordentliche Email 😉

Damit habe ich die Grundlage geschaffen, um die Funktion „Bestätigungsemail nach ausdrucken der PDF“ zu integrieren.
Dateinamen in Email-Body
Die Funktion zum Versenden der Email musste ich inhaltlich noch anpassen, dass die Dateinamen in Email-Body eingefügt werden sollen.
Der bisherige Python-Code speichert alle Dateien in einem Order und diesen Ordner lese ich in einer for-Schleife aus. Weil die Ausgabe in der for-Schleife den kompletten Pfad zur Datei ausgibt und ich nur den Dateinamen für den Email-Body benötige, habe ich jeden einzelnen Pfad aufgesplittet mit split() und immer nur den letzten Wert in einer neuen Liste hinzugefügt. Der letzte Wert ist natürlich der Dateiname. Das ist sicher 😉
Diese neue Liste mit den Dateinamen kommt dann in die Senden-Funktion. Wofür ich auch neue Funktionen wie MIMEMultipart und MIMEText von Python benötige.
Senden der Dateinamen aus einem Order
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
source = [LISTE MIT DATEIN INKL. PFAD]
# Aufsplitten der Dateipfade, so dass nur Dateinamen in die neue Liste übertragen werden..
file_list = []
for a in source:
splited = a.split("\\")[-1]
file_list.append(splited)
host = "HOST"
port = "PORT"
smtp_user = "USER"
smtp_pass = "PASS"
from_email ="ABSENDER@"
to_email = "EMPFÄNGER@"
msg = MIMEMultipart()
msg["FROM"] = from_email
msg["To"] = to_email
msg["Subject"] = "Python Nachricht"
# mit join wird jede Datei, also Listen-Wert eine neue Zeile erstellt
body = "\r\n".join(file_list)
msg.attach(MIMEText("Liste der Dateien:\n\n" + body, 'plain'))
text = msg.as_string()
smtp = smtplib.SMTP(host, port)
smtp.login(smtp_user, smtp_pass)
smtp.sendmail(from_email, to_email, text)
smtp.close()
Mein Python-Programm habe ich mit dieser Funktion ergänzt und nun bekommt jemand eine Email, dass Dateien X, Y, Z ausgedruckt wurden, ohne dass die Dateien als Anhang zurückgeschickt werden
Verwendete Tutorials oder Dokumentationen
Natürlich habe die es nicht komplett alleine geschrieben und musste mich auf diversen Seiten belesen. Ich bin ja immer noch ein Anfänger, das möchte ich weiterhin betonen. Und ich möchte hier neben den oben verlinkten Python-Dokumentationen, die hilfreichen Seiten verlinken, die mir geholfen haben: