MIMEMultipart, MIMEText, MIMEBase und Nutzlasten für das senden von E-Mail mit Datei-Anhang in Python
Ohne viel Vorkenntnisse der MIME, versuchte ich lernte, wie zu schreiben Sie ein Python-Skript zum senden einer E-Mail mit einem Dateianhang. Nach der cross-referencing Python-Dokumentation, Stack Overflow Fragen, und die Allgemeine web-Suche, ließ ich mich mit dem folgenden code [1] und getestet, es funktioniert.
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import encoders
fromaddr = "YOUR EMAIL"
toaddr = "EMAIL ADDRESS YOU SEND TO"
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "SUBJECT OF THE EMAIL"
body = "TEXT YOU WANT TO SEND"
msg.attach(MIMEText(body, 'plain'))
filename = "NAME OF THE FILE WITH ITS EXTENSION"
attachment = open("PATH OF THE FILE", "rb")
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)
msg.attach(part)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(fromaddr, "YOUR PASSWORD")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
-
Ich habe eine grobe Vorstellung davon, wie das Skript funktioniert jetzt, und arbeitete die folgenden workflow. Bitte lassen Sie mich wissen, wie genau meine Flussdiagramm(?) ist.
as.string() | +------------MIMEMultipart | |---content-type | +---header---+---content disposition +----.attach()-----+----MIMEBase----| | +---payload (to be encoded in Base64) +----MIMEText
-
Woher weiß ich, Wann MIMEMultipart, MIMEText und MIMEBase? Dies scheint eine komplizierte Frage, also vielleicht nur einige Allgemeine Regeln-of-Daumen für mich?
- Ich gelesen, dass die Pantomime eine Baum-Struktur wie[2] , bedeutet das, dass MIMEMultipart ist immer an der Spitze?
- In der ersten code-block, MIMEMultipart kodiert ['Von'], ['In'] und ['Betreff'], aber in der Python-Dokumentation, MIMEText kann auch verwendet werden, um zu Kodieren ['Von'], ['In'] und ['Betreff']. Wie kann ich entscheiden, einen zu verwenden?
- Was genau ist ein "payload"? Ist es, einige Inhalte werden transportiert? Wenn ja, welche Art von Inhalt funktioniert diese umfassen (I bemerkt, dass der Textkörper und der Anhang behandelt werden als payloads)? Ich dachte, das wäre eine einfache Frage, aber ich konnte einfach nicht finden, eine befriedigende, zuverlässige und einfache Antwort.
- Ist wahr, dass, obwohl MIME-Anhängen können Datei-Formate viel einfacher, als nur einige Texte, die am Ende alle das encoding, header-Informationen und Nutzlasten sind alles drehte sich in Zeichenfolgen, so dass Sie übergeben werden .sendmail()?
[1]http://naelshiab.com/tutorial-send-email-python/
[2]http://blog.magiksys.net/generate-and-send-mail-with-python-tutorial
Du musst angemeldet sein, um einen Kommentar abzugeben.
E-mail-Nachrichten
Einen e-mail-Nachricht besteht aus Header (z.B. "Von", "An", "Betreff" usw.) und Körper (siehe RFC 822, Abschnitt 3.1).
Den Körper der Nachricht ist standardmäßig behandelt, als reinen ASCII-text. MIME (RFC-2045, RFC-2046, RFC 2047, RFC-2048, RFC-2049) definiert Erweiterungen, die es erlauben die Angabe von verschiedenen Arten von E-Mail-Inhalte.
Eine sehr nützliche Sache, die Sie sind in der Lage, mit MIME geben Sie ein Content-Typ (z.B.
text/html
oderapplication/octet-stream
).Andere nützliche Sache ist, dass man eine Nachricht mit mehreren teilen (zum Beispiel, wenn Sie wollen, sowohl HTML-als auch und der ein Bild im HTML-Code). Dies erfolgt durch Angabe einer
multipart
Content-Type (RFC 2046, Abschnitt 5.1).Multipart-Nachrichten
Wenn eine Nachricht eine
multipart
Content-Type, das heißt, es besteht aus mehreren Nachrichten und jeder von Ihnen legt seine eigenen Content-Type (das kann wieder werden, multipart oder etwas anderes). Multipart-Nachrichten sind in Python vertreten durchMIMEMultipart
Klasse.So, zu beantworten Frage 3: Wenn
MIMEMultipart
verwendet wird, dann ja, es ist ein Baum-wie Struktur, aber wenn nurMIMEText
verwendet wird, dann ist es nicht ein Baum.Frage 4 fragt, auf die Klasse, um die Header ("An", "Aus", etc.) - das geschehen ist, das die
Message
Klasse, aber alleMIME
Klassen Erben vonMessage
, so dass es getan werden kann, auf einen von Ihnen, aber diese Header machen nur Sinn auf der root-Teil einer multipart-Nachricht.In anderen Worten, wenn eine Nachricht nur aus einem MIME-Teil geben-Header auf das Teil. Wenn es besteht aus mehrere Teile, dann die Wurzel ist ein
MIMEMultipart
- geben Sie die Kopfzeilen an, die Teil.Frage 2 fragt "Wann MIMEMultipart, MIMEText und MIMEBase".
-
MIMEBase
ist nur eine Basis-Klasse. Als die Spezifikation sagt: "Normalerweise werden Sie nicht erstellen Sie Instanzen, insbesondere vonMIMEBase
"-
MIMEText
ist für text (z.B.text/plain
odertext/html
), wenn die gesamte Nachricht im text-format, oder wenn ein Teil von Ihr ist.-
MIMEMultipart
ist zu sagen "ich habe mehr als einen Teil", und dann die Auflistung der Teile, die Sie tun, wenn Sie Anhänge haben, Sie tun es auch, um alternative Versionen der gleichen Inhalte (z.B. eine nur-text-version plus eine HTML-version)Frage 5 "Was genau ist ein "payload"?" - das ist nur ein schickes Wort für den Inhalt der Nachricht (oder Meldung Teil)
Frage 6 gibt Es eine Begrenzung auf nur 7 bits in SMTP. Sehen diese Antwort für mehr details.
Habe ich absolut nicht verstehen Frage 1, aber es scheint, dass das Diagramm mehr oder weniger korrekt. BTW, würde ich nicht verwenden
MIMEBase
hier, weil esMIMEApplication
, die scheint besser geeignet für den beabsichtigten Zweck.