Python 3 - Senden von E-Mails über SMTP

Das Simple Mail Transfer Protocol (SMTP) ist ein Protokoll, das das Senden einer E-Mail und das Weiterleiten von E-Mails zwischen Mailservern übernimmt.

Python bietet smtplib Modul, das ein SMTP-Client-Sitzungsobjekt definiert, mit dem E-Mails an jeden Internetcomputer mit einem SMTP- oder ESMTP-Listener-Daemon gesendet werden können.

Hier ist eine einfache Syntax zum Erstellen eines SMTP-Objekts, mit dem später eine E-Mail gesendet werden kann:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

Hier ist das Detail der Parameter -

  • host- Dies ist der Host, auf dem Ihr SMTP-Server ausgeführt wird. Sie können die IP-Adresse des Hosts oder einen Domainnamen wie tutorialspoint.com angeben. Dies ist ein optionales Argument.

  • port- Wenn Sie ein Host- Argument angeben, müssen Sie einen Port angeben, an dem der SMTP-Server empfangsbereit ist. Normalerweise ist dieser Port 25.

  • local_hostname- Wenn Ihr SMTP-Server auf Ihrem lokalen Computer ausgeführt wird, können Sie nur localhost als Option angeben .

Ein SMTP-Objekt hat eine Instanzmethode namens sendmail, die normalerweise zum Versenden einer Nachricht verwendet wird. Es werden drei Parameter benötigt -

  • Der Absender - Eine Zeichenfolge mit der Adresse des Absenders.

  • Die Empfänger - Eine Liste von Zeichenfolgen, eine für jeden Empfänger.

  • Die Nachricht - Eine Nachricht als Zeichenfolge, die wie in den verschiedenen RFCs angegeben formatiert ist.

Beispiel

Hier ist eine einfache Möglichkeit, eine E-Mail mit dem Python-Skript zu senden. Probieren Sie es einmal aus -

#!/usr/bin/python3

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Hier haben Sie eine einfache E-Mail mit einem dreifachen Anführungszeichen in die Nachricht eingefügt und dabei darauf geachtet, die Überschriften korrekt zu formatieren. Eine E-Mail erfordert aFrom, To, und ein Subject Kopfzeile, durch eine Leerzeile vom Text der E-Mail getrennt.

Zum Senden der E-Mail verwenden Sie smtpObj , um eine Verbindung zum SMTP-Server auf dem lokalen Computer herzustellen . Verwenden Sie dann die sendmail- Methode zusammen mit der Nachricht, der Absenderadresse und der Zieladresse als Parameter (obwohl sich die Absender- und Absenderadressen in der E-Mail selbst befinden, werden diese nicht immer zum Weiterleiten der E-Mail verwendet).

Wenn Sie auf Ihrem lokalen Computer keinen SMTP-Server ausführen , können Sie den smtplib- Client verwenden, um mit einem Remote-SMTP-Server zu kommunizieren. Sofern Sie keinen Webmail-Dienst (wie Google Mail oder Yahoo! Mail) verwenden, muss Ihr E-Mail-Anbieter Ihnen die Details des Postausgangsservers zur Verfügung gestellt haben, die Sie wie folgt bereitstellen können:

mail = smtplib.SMTP('smtp.gmail.com', 587)

Senden einer HTML-E-Mail mit Python

Wenn Sie eine Textnachricht mit Python senden, wird der gesamte Inhalt als einfacher Text behandelt. Selbst wenn Sie HTML-Tags in eine Textnachricht aufnehmen, wird diese als einfacher Text angezeigt, und HTML-Tags werden nicht gemäß der HTML-Syntax formatiert. Python bietet jedoch die Option, eine HTML-Nachricht als tatsächliche HTML-Nachricht zu senden.

Beim Senden einer E-Mail-Nachricht können Sie eine Mime-Version, einen Inhaltstyp und den Zeichensatz zum Senden einer HTML-E-Mail angeben.

Beispiel

Im Folgenden finden Sie ein Beispiel zum Senden des HTML-Inhalts als E-Mail. Probieren Sie es einmal aus -

#!/usr/bin/python3

import smtplib

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Anhänge als E-Mail senden

Um eine E-Mail mit gemischtem Inhalt zu senden, müssen Sie die Einstellungen vornehmen Content-type Header zu multipart/mixed. Anschließend können der Text und die Anhangsabschnitte innerhalb von angegeben werdenboundaries.

Eine Grenze wird mit zwei Bindestrichen gefolgt von einer eindeutigen Nummer gestartet, die nicht im Nachrichtenteil der E-Mail erscheinen kann. Eine letzte Grenze, die den letzten Abschnitt der E-Mail angibt, muss ebenfalls mit zwei Bindestrichen enden.

Die angehängten Dateien sollten mit dem verschlüsselt werden pack("m") Funktion, um vor der Übertragung eine Base 64-Codierung zu haben.

Beispiel

Es folgt ein Beispiel, das eine Datei sendet /tmp/test.txtals Anhang. Probieren Sie es einmal aus -

#!/usr/bin/python3

import smtplib
import base64

filename = "/tmp/test.txt"

# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64

sender = '[email protected]'
reciever = '[email protected]'

marker = "AUNIQUEMARKER"

body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)

# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit

%s
--%s
""" % (body,marker)

# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s

%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, reciever, message)
   print "Successfully sent email"
except Exception:
   print ("Error: unable to send email")