Domanda

Se voglio inviare mail tramite SMTP, ma tramite sendmail, c'è una libreria per python, che racchiude in sé questo processo?

Meglio ancora, c'è una buona biblioteca abstract tutta 'sendmail -versus - smtp' scelta?

Sarò l'esecuzione di questo script su un gruppo di host unix, di cui solo alcuni sono in ascolto su localhost:25;alcuni di questi sono parte di sistemi embedded e non può essere impostato per accettare SMTP.

Come parte di una Buona Pratica, mi piacerebbe molto avere la libreria di prendersi cura di intestazione iniezione di vulnerabilità, di per sé, ma basta uscire una stringa popen('/usr/bin/sendmail', 'w') è un po ' più vicino al metallo che vorrei.

Se la risposta è "go scrivere una libreria," così sia ;-)

È stato utile?

Soluzione

Intestazione di iniezione non è un fattore nel modo in cui si invia la mail, è un fattore di come si costruisce la posta.Controllare il email il pacchetto, di costruire la mail che, serialise e inviare a /usr/sbin/sendmail utilizzando il sottoprocesso modulo:

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

Altri suggerimenti

Questa è una semplice funzione python che utilizza unix sendmail per consegnare un messaggio di posta.

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

Jim risposta non ha funzionato per me in Python 3.4.Ho dovuto aggiungere un ulteriore universal_newlines=True argomento 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())

Senza universal_newlines=True Ho

TypeError: 'str' does not support the buffer interface

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

Personalmente, per gli script non ho scritto io, penso che solo utilizzando il protocollo SMTP è migliore, poiché non richiedono l'installazione di dire un sendmail clone per funzionare su windows.

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

Questa domanda è molto vecchio, ma vale la pena notare che c'è un messaggio di costruzione e la consegna di e-mail di sistema chiamato Midollo Mailer (in precedenza TurboMail) che è stato disponibile fin da prima questo messaggio è stato chiesto.

Ora è in fase di porting per il supporto Python 3 e aggiornato come parte del Midollo suite.

Stavo solo cercando in giro per la stessa cosa e trovare un buon esempio in Python sito web: http://docs.python.org/2/library/email-examples.html

Dal sito citato:

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

Si noti che questo richiede che si dispone di sendmail/mailx correttamente impostato per accettare connessioni su "localhost".Questo funziona sul mio Mac, Ubuntu e Redhat server per impostazione predefinita, ma è possibile controllare se si esegue in eventuali problemi.

La risposta più facile è il smtplib, è possibile trovare la documentazione su di esso qui.

Tutto quello che dovete fare è configurare il sendmail locale per accettare la connessione da localhost, che probabilmente fa già di default.Certo, si sta ancora utilizzando il protocollo SMTP per il trasferimento, ma è il sendmail locale, che è fondamentalmente la stessa utilizzando la riga di comando strumento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top