it-swarm.it

Invio di posta via sendmail da python

Se voglio inviare posta non tramite SMTP, ma piuttosto tramite sendmail, esiste una libreria per python che incapsula questo processo?

Meglio ancora, esiste una buona biblioteca che riassume l'intera scelta di "sendmail -versus- smtp"?

Eseguirò questo script su un gruppo di host unix, solo alcuni dei quali sono in ascolto su localhost: 25; alcuni di questi fanno parte di sistemi integrati e non possono essere configurati per accettare SMTP.

Come parte di Good Practice, mi piacerebbe davvero che la libreria si occupasse delle vulnerabilità dell'iniezione di intestazione stessa, quindi semplicemente scaricare una stringa su popen('/usr/bin/sendmail', 'w') è un po 'più vicino al metal di quanto mi piacerebbe.

Se la risposta è "vai a scrivere una biblioteca", così sia ;-)

70
Nate

L'iniezione di intestazione non è un fattore nel modo in cui invii la posta, è un fattore nel modo in cui costruisci la posta. Controlla il pacchetto email , costruisci la posta con quella, serializzala e inviala a /usr/sbin/sendmail utilizzando il modulo sottoprocesso :

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

Questa è una semplice python che utilizza unix sendmail per recapitare una mail.

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

La risposta di Jim non ha funzionato per me in Python 3.4. Ho dovuto aggiungere un ulteriore argomento universal_newlines=True A subrocess.Popen()

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())

Senza il universal_newlines=True Ottengo

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

È abbastanza comune usare il comando sendmail da Python usando os.popen

Personalmente, per gli script che non ho scritto da solo, penso che usare il protocollo SMTP sia migliore, dal momento che non richiederebbe l'installazione di un clone sendmail per l'esecuzione su Windows.

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

3
tovare

Questa domanda è molto antica, ma vale la pena notare che esiste un sistema di costruzione dei messaggi e di consegna delle e-mail chiamato Marrow Mailer (precedentemente TurboMail) che è disponibile da prima che questo messaggio fosse richiesto.

È ora in corso il porting per supportare Python 3 e aggiornato come parte della suite Marrow .

3
amcgregor