· 

E-Mails mit Python versenden

1. Einführung

Wenn du E-Mails mit Python versenden möchtest, solltest du zuvor unbedingt verstanden haben, wie das SMTP-Protokoll funktioniert. Einen entsprechenden Artikel zum SMTP-Protokoll findest du hier.

Die grundlegende Idee ist, dass du über eine Programmierschnittstelle mit dem SMTP-Server deines E-Mail-Anbieters kommunizierst. Du solltest also zuvor herausfinden, wie der SMTP-Server deines E-Mail-Anbieters lautet. Hierzu genügt eine einfache Suchmaschinen-Recherche:

Mit diesen Informationen und deinen Anmeldedaten können wir nun das Python-Skript schreiben.


2. Python-Skript

Zunächst benötigst du das Modul smtplib. Dieses kannst du dir mit dem pip-Befehl sehr leicht herunterladen:

pip install smtplib

Dieses Modul bindest du anschließend via import in dein Python-Skript ein.

import smtplib 

Nun definierst du zwei Variablen user und pwd, denen du deinen Benutzernamen und dein Passwort als String zuweist. Welcher Benutzername und welches Passwort ist hier gemeint? Nun, die deines E-Mail-Accounts.

user = 'test'
pwd = 'test123'

In einer weiteren Variable mail_text speicherst du den Text, der in der E-Mail versendet werden soll.

mail_text = 'Hallo,\n\ndas ist ein Test!\n\n:)'

Jetzt definierst du dir noch eine Variable subject, der du den Betreff deiner E-Mail übergibst.

subject = 'Python-Mail :)' 

Nun definierst du dir Variablen für die Werte, die in den SMTP-Kommandos mitgegeben werden, nämlich den Absender (MAIL FROM), den Empfänger (RCPT TO) und den DATA-Bereich, in den der gesamte Mail-Text samt Header hineinkommt.

MAIL_FROM = 'test@example.com'
RCPT_TO  = 'test@example.com'
DATA = 'From:%s\nTo:%s\nSubject:%s\n\n%s' % (MAIL_FROM, RCPT_TO, subject, mail_text)

Danach erzeugst du dir eine SMTP-Server-Instanz. Hierfür rufst du auf smtplib den Ctor SMTP auf, dem du die Adresse deines SMTP-Servers samt Port-Nummer übergibst. Wir nehmen exemplarisch den Server http://secure.emailsrvr.com mit dem Port 587. 587 ist der Port für TLS. Der Port wird mit einem Doppelpunkt hinter den Mailserver gehängt. 

server = smtplib.SMTP('secure.emailsrvr.com:587')

Danach rufst du die Funktion starttls( ) auf, um das hybride Verschlüsselungsprotokoll Transport Layer Security zu starten.

server.starttls()

Jetzt loggst du dich mit der Funktion login(...) in den Server ein. Dabei übergibst du den zuvor deifnierten Benutzernamen und das Passwort. 

server.login(user, pwd)

Jetzt versendest du via Aufruf der Funktion sendmail(...) deine E-Mail. Als Argument werden die Werte für MAIL FROM, RCPT TO und DATA erwartet.

server.sendmail(MAIL_FROM, RCPT_TO, DATA)

Nach dem erfolgreichen Versenden schließt du den Server durch Aufruf der Funktion quit( ).

server.quit()

Wenn du deinen Benutzernamen und dein Passwort nicht direkt als Klartext im Code speichern willst, kannst du sie auch in deinen Umgebungsvariablen hinterlegen und diese dann aufrufen. Hierzu öffnest du zunächst ein CMD-Fenster und tippst den Befehl SET ein. Dahinter schreibst du den gewünschten Variablennamen (z. B: SMTP_USER und SMTP_PWD) und übergibst mit einem "=" die Werte, die du diesen Umgebungsvariablen zuweisen willst.

SET SMTP_USER=test
SET SMTP_PWD=test123

Danach importierst du dir in deinem Python-Programm das Modul os. Nun kannst du statt den Klartext-Informationen die Funktion getenv( ) aufrufen und ihr den Namen der gewünschten Umgebungsvariablen geben. Jetzt stehen die Informationen zum Benutzernamen und Passwort nicht mehr im Klartext in deinem Programm.


3. Quellcode

Hier ist noch einmal der gesamte Quelltext zum Download.

import smtplib  

user = 'test'
pwd = 'test123'
mail_text = 'Hallo,\n\ndas ist ein Test!\n\n:)'
subject = 'Python-Mail :)'
 
MAIL_FROM = 'test@example.com'
RCPT_TO  = 'test@example.com'
DATA = 'From:%s\nTo:%s\nSubject:%s\n\n%s' % (MAIL_FROM, RCPT_TO, subject, mail_text)

server = smtplib.SMTP('secure.emailsrvr.com:587')
server.starttls()
server.login(user, pwd)
server.sendmail(MAIL_FROM, RCPT_TO, DATA)
server.quit()