In diesem Beitrag möchte ich dir ausführlich zeigen, wie du eine E-Mail aus einem Python3 Skript senden kannst. Des Weiteren zeige ich dir auch wie du eine E-Mail inkl. Dateianhänge absenden kannst.
Inhaltsverzeichnis
E-Mail-Adresse zum Testen
Für diesen Beitrag verwende ich eine kostenfreie E-Mail von web.de. Du kannst natürlich auch jeden anderen E-Mail Dienst nutzen.
Bei der Verwendung von Gmail.com musst du jedoch noch eine zusätzliche App einrichten, was den Aufwand etwas erhöht.
Die Daten des SMTP Ausgangsservers von web.de sind:
Server | smtp.web.de |
Port | 587 |
Verschlüsselung | STARTTLS, TLS oder Verschlüsselung |
aktivieren von Pop3/IMAP in web.de
Damit jedoch das Absenden einer E-Mail von einem externen Programm mit einem web.de Account möglich ist, muss die Einstellung „POP3 und IMAP erlauben“ gesetzt (Haken ist gesetzt) werden.

Senden einer E-Mail mit Text
Zunächst möchte ich dir zeigen wie du einen einfachen Text per E-Mail senden kannst.
Dabei müssen Zeilenumbrüche in dem Text per „\n“ ersetzt oder gesetzt werden!
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # Serverdaten smtpServer = "smtp.web.de" smtpPort = 587 # Zugangsdaten username = "abc@web.de" password = "xyz#567" # Sender & Empfänger sender = "mytestmail0815@web.de" reciever = "info@draeger-it.blog" # Betreff & Inhalt subject = "Hallo Welt!" body = "Hier steht ein Text. \n Mit einem Zeilenumbruch." # Message Objekt für die E-Mail # später kann an dieses Objekt eine # oder mehrere Dateien angehängt # werden. msg = MIMEMultipart() msg['Subject'] = subject msg['From'] = sender msg['To'] = reciever part = MIMEText(body, 'plain') msg.attach(part) # Erzeugen einer Mail Session smtpObj = smtplib.SMTP(smtpServer, smtpPort) # Debuginformationen auf der Konsole ausgeben smtpObj.set_debuglevel(1) # Wenn der Server eine Authentifizierung benötigt dann... smtpObj.starttls() smtpObj.login(username, password) # absenden der E-Mail smtpObj.sendmail(sender, reciever, msg.as_string())
Wenn das Skript nun ausgeführt wird, dann erscheint beim Empfänger nachfolgende E-Mail.
Absenden von HTML Mails
Im ersten Beispiel habe ich gezeigt wie du eine einfache Mail mit einem „Plaintext“ senden kannst. Diese Form des Textes ist recht sicher da so ziemlich jeder Mail Client diesen Text anzeigen lassen kann.
Wenn es etwas schöner sein soll, dann greift man auf HTML Text zurück. Hier hat man deutlich mehr Möglichkeiten seine E-Mail zu gestalten.
body_html = "<html><body>"\ "<h1>Eine Überschrift</h1>"\ "<p style='color:red'>Ein Text in der Schriftfarbe rot</p>"\ "<div style='background-color:green'>Hier ist ein Text mit einer Hintergrundfarbe.</div>"\ "</body></html>" html_part = MIMEText(body_html, 'html') msg.attach(html_part)
Absenden einer E-Mail mit Dateianhängen
Möchte man nun eine Datei per E-Mail versenden, so muss diese als weiteren „part“ angehängt werden.
Jedoch muss diese Datei zuvor in BASE64 Codiert werden.
from email.mime.base import MIMEBase from email import encoders ... filename = "test.txt" file_part = MIMEBase('application', "octet-stream") file_part.set_payload(open(filename, "rb").read()) encoders.encode_base64(part) file_part.add_header('Content-Disposition', 'attachment; filename="'+filename+'"') msg.attach(file_part) ...
fertiges Python3 Skript zum senden von E-Mails mit Dateianhänge
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders # Serverdaten smtpServer = "smtp.web.de" smtpPort = 587 # Zugangsdaten username = "abc@web.de" password = "xyz#123" # Sender & Empfänger sender = "mytestmail0815@web.de" reciever = "info@draeger-it.blog" # Betreff subject = "Hallo Welt!" # Inhalt der Mail body = "Hier steht ein Text. \n Mit einem Zeilenumbruch." body_html = "<html><body>"\ "<h1>Eine Überschrift</h1>"\ "<p style='color:red'>Ein Text in der Schriftfarbe rot</p>"\ "<div style='background-color:green'>Hier ist ein Text mit einer Hintergrundfarbe.</div>"\ "</body></html>" # Message Objekt für die E-Mail # später kann an dieses Objekt eine # oder mehrere Dateien angehängt # werden. msg = MIMEMultipart() msg['Subject'] = subject msg['From'] = sender msg['To'] = reciever # Plain Text part = MIMEText(body, 'plain') msg.attach(part) # HTML Text html_part = MIMEText(body_html, 'html') msg.attach(html_part) # Dateianhang filename = "test.txt" file_part = MIMEBase('application', "octet-stream") file_part.set_payload(open(filename, "rb").read()) encoders.encode_base64(part) file_part.add_header('Content-Disposition', 'attachment; filename="'+filename+'"') msg.attach(file_part) # Erzeugen einer Mail Session smtpObj = smtplib.SMTP(smtpServer, smtpPort) # Debuginformationen auf der Konsole ausgeben smtpObj.set_debuglevel(1) # Wenn der Server eine Authentifizierung benötigt dann... smtpObj.starttls() smtpObj.login(username, password) # absenden der E-Mail smtpObj.sendmail(sender, reciever, msg.as_string())
Herzlichen Dank für diese gute Schritt-für-Schritt-Anleitung! So kann auch ein Programmier-Anfänger wie ich das Thema gut verstehen 😀 Vielen Dank für den Beitrag und weiter so!
Liebe Grüße
Julius
Zu allererst vielen Dank für die super Anleitung 🙂
Leider bekomme ich stets diese Fehlermeldung: UnicodeEncodeError: ‚ascii‘ codec can’t encode characters in position 671-673: ordinal not in range(128)
mit einer 4 zeiligen csv datei klappt es manchmal. Mit einer txt Datei leider überhaupt nicht. Bitte um Hilfe !!
Hi,
das klingt nach Zeichen welche nicht decodiert werden können.
Hast einmal ein Beispiel welches du mir per Email senden kannst?
Gruß
Stefan Draeger
Recht herzlichen Dank.
Gut aufbereitet und auch für mich verständlich. 🙂
Gruß, Klaus S.