Frage

Wenn ich E-Mails über SMTP nicht senden, sondern über Sendmail, gibt es eine Bibliothek für Python, die diesen Prozess kapselt?

Noch besser wäre es, gibt es eine gute Bibliothek, die die ganze ‚send -versus- smtp‘ Wahl abstrahiert?

werde ich auf einer Reihe von Unix-Hosts dieses Skript ausgeführt werden, von denen nur einige auf localhost hören: 25; einige von ihnen sind Teil Systeme eingebettet und nicht eingerichtet werden können, SMTP zu übernehmen.

Im Rahmen von Good Practice, ich möchte wirklich die Bibliothek haben, kümmern sich um Header-Injection-Schwachstellen selbst. - so nur einen String Dumping popen('/usr/bin/sendmail', 'w') auf das Metall ein wenig näher ist als Ich mag würde

Wenn die Antwort 'eine Bibliothek gehen schreiben,' es so sein; -)

War es hilfreich?

Lösung

Rubrik Injektion ist kein Faktor dafür, wie Sie die E-Mail senden, es ist ein Faktor dafür, wie Sie die E-Mail erstellen. Schauen Sie sich die E-Mail Paket, konstruieren die E-Mail mit, dass serialise es, und senden Sie es /usr/sbin/sendmail mit dem subprocess Modul:

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

msg = MIMEText("Here is the body of my message")
msg["From"] = "me@example.com"
msg["To"] = "you@example.com"
msg["Subject"] = "This is the subject."
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE)
p.communicate(msg.as_string())

Andere Tipps

Dies ist eine einfache Python-Funktion, die das Unix Sendmail verwendet eine E-Mail zu liefern.

def sendMail():
    sendmail_location = "/usr/sbin/sendmail" # sendmail location
    p = os.popen("%s -t" % sendmail_location, "w")
    p.write("From: %s\n" % "from@somewhere.com")
    p.write("To: %s\n" % "to@somewhereelse.com")
    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

Jims Antwort nicht für mich arbeiten in Python 3.4. Ich hatte ein zusätzliches universal_newlines=True Argument hinzuzufügen subrocess.Popen()

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

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

Ohne die universal_newlines=True ich

TypeError: 'str' does not support the buffer interface

Es ist durchaus üblich, nur den Sendmail-Befehl von Python mit os.popen

persönlich für Skripte ich mich nicht schreiben, ich glaube, mit nur das SMTP-Protokoll ist besser, da es nicht ein Sendmail-Klon Installation erfordern würde sagen, auf Windows laufen zu lassen.

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

Diese Frage ist sehr alt, aber es ist erwähnenswert, dass es eine Nachricht Konstruktion und E-Mail genannt Zuführsystem Marrow Mailer (vorher TurboMail), die seit verfügbar ist, bevor diese Meldung gefragt wurde.

Es ist jetzt portiert Python 3 und aktualisierte als Teil der Marrow Suite zu unterstützen.

Ich hatte nur die Suche um für die gleiche Sache und fand ein gutes Beispiel auf der Python-Website: http://docs.python.org/2/library/email-examples.html

Von der Website erwähnt:

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.mime.text import MIMEText

# Open a plain text file for reading.  For this example, assume that
# the text file contains only ASCII characters.
fp = open(textfile, 'rb')
# Create a text/plain message
msg = MIMEText(fp.read())
fp.close()

# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you

# Send the message via our own SMTP server, but don't include the
# envelope header.
s = smtplib.SMTP('localhost')
s.sendmail(me, [you], msg.as_string())
s.quit()

Beachten Sie, dass dies erfordert, dass Sie richtig akzeptieren Verbindungen auf „localhost“ sendmail / mailx eingerichtet haben. Dies funktioniert auf meinem Mac, Ubuntu und Red Hat-Server standardmäßig, aber Sie können nochmals zu überprüfen wollen, wenn Sie in Probleme laufen.

Die einfachste Antwort ist die smtplib, Sie docs auf sie hier .

Alles, was Sie tun müssen, ist Ihre lokale Sendmail konfigurieren Verbindung von localhost zu akzeptieren, die es wahrscheinlich bereits standardmäßig der Fall ist. Sicher, Sie verwenden nach wie vor SMTP für die Übertragung, aber es ist die lokale Sendmail, die als mit dem Kommandozeilen-Tool im Grunde das gleiche ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top