it-swarm-eu.dev

Senden von E-Mails per sendmail von python

Wenn ich E-Mails nicht über SMTP, sondern über sendmail senden möchte, gibt es eine Bibliothek für python), die diesen Prozess kapselt?

Besser noch, gibt es eine gute Bibliothek, die die gesamte Auswahl von "sendmail -versus-smtp" zusammenfasst?

Ich werde dieses Skript auf einer Reihe von Unix-Hosts ausführen, von denen nur einige localhost abhören: 25; Einige davon sind Teil eingebetteter Systeme und können nicht für die Annahme von SMTP eingerichtet werden.

Als Teil der guten Praxis möchte ich, dass die Bibliothek die Sicherheitsanfälligkeiten beim Einfügen von Headern selbst behebt. Wenn Sie also einfach einen String an popen('/usr/bin/sendmail', 'w') ausgeben, ist dies etwas näher am Metall als gewünscht.

Wenn die Antwort "Geh und schreibe eine Bibliothek" lautet, dann sei es so ;-)

70
Nate

Header-Injection ist kein Faktor für den Versand der Mail, sondern für den Aufbau der Mail. Überprüfe das email Paket, konstruiere die Mail damit, serialisiere sie und sende sie an /usr/sbin/sendmail mit dem nterprozess Modul:

from email.mime.text import MIMEText
from subprocess import Popen, PIPE

msg = MIMEText("Here is the body of my message")
msg["From"] = "[email protected]"
msg["To"] = "[email protected]"
msg["Subject"] = "This is the subject."
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE)
p.communicate(msg.as_string())
116
Jim

Dies ist eine einfache python Funktion, die das Unix-sendmail verwendet, um eine Mail zuzustellen.

def sendMail():
    sendmail_location = "/usr/sbin/sendmail" # sendmail location
    p = os.popen("%s -t" % sendmail_location, "w")
    p.write("From: %s\n" % "[email protected]")
    p.write("To: %s\n" % "[email protected]")
    p.write("Subject: thesubject\n")
    p.write("\n") # blank line separating headers from body
    p.write("body of the mail")
    status = p.close()
    if status != 0:
           print "Sendmail exit status", status
34
Pieter

Jims Antwort funktionierte bei mir nicht in Python 3.4. Ich musste subrocess.Popen() ein zusätzliches Argument universal_newlines=True Hinzufügen.

from email.mime.text import MIMEText
from subprocess import Popen, PIPE

msg = MIMEText("Here is the body of my message")
msg["From"] = "[email protected]"
msg["To"] = "[email protected]"
msg["Subject"] = "This is the subject."
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE, universal_newlines=True)
p.communicate(msg.as_string())

Ohne den universal_newlines=True Bekomme ich

TypeError: 'str' does not support the buffer interface
10
MEI

Es ist durchaus üblich, einfach den Befehl sendmail von Python mit os.popen zu verwenden

Für Skripte, die ich nicht selbst geschrieben habe, ist es meiner Meinung nach besser, nur das SMTP-Protokoll zu verwenden, da für die Ausführung unter Windows nicht die Installation eines sendmail-Klons erforderlich wäre.

https://docs.python.org/library/smtplib.html

3
tovare

Diese Frage ist sehr alt, aber es lohnt sich zu beachten, dass es ein Nachrichtenkonstruktions- und E-Mail-Übermittlungssystem namens Marrow Mailer (früher TurboMail) gibt, das seitdem verfügbar ist, bevor diese Nachricht gestellt wurde.

Es wird jetzt portiert, um Python 3 zu unterstützen und als Teil der Marrow Suite aktualisiert.

3
amcgregor