81 votes

L'envoi de mail via sendmail de python

Si je veux envoyer un mail pas via SMTP, mais plutôt via sendmail, est-il une bibliothèque python qui encapsule ce processus?

Mieux encore, est-il une bonne bibliothèque qui fait abstraction de toute la "sendmail -versus - smtp' choix?

Je vais être en cours d'exécution de ce script sur un tas de machines unix, dont une partie seulement sont à l'écoute sur localhost:25; quelques-uns de ces derniers font partie des systèmes embarqués et ne peut pas être configuré pour accepter le protocole SMTP.

Dans le cadre de Bonnes Pratiques, je voudrais vraiment avoir de la bibliothèque prendre soin de l'en-tête de vulnérabilités d'injection elle-même-donc tout simplement le dumping un string popen('/usr/bin/sendmail', 'w') est un peu plus proche du métal que je le voudrais.

Si la réponse est " aller écrire une bibliothèque,' ainsi soit-il ;-)

129voto

Jim Points 39574

L'en-tête d'injection n'est pas un facteur dans la façon dont vous envoyer le mail, c'est un facteur dans la façon de construire l'e-mail. Vérifiez l' e-mail paquet, construire l'e-mail que, serialise, et de l'envoyer à l' /usr/sbin/sendmail à l'aide de la sous-processus module:

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"], stdin=PIPE)
p.communicate(msg.as_string())

37voto

Pieter Points 9200

C'est une simple fonction python qui utilise la unix sendmail pour en livrer le courrier.

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

5voto

amcgregor Points 501

Cette question est très vieux, mais il est intéressant de noter qu'il y a un message de la construction et de l'e-mail système de livraison appelé TurboMail qui est disponible depuis avant ce message a été demandé.

Il est aujourd'hui porté à l'appui de Python 3 et mis à jour dans le cadre de la Moelle suite.

3voto

tovare Points 1896

Il est très courant d'utiliser simplement la commande sendmail de Python en utilisant le système d'exploitation.popen

Personnellement, pour les scripts, je n'ai pas écrit moi-même, je mince juste en utilisant le protocole smtp est mieux, car elle ne nécessite pas l'installation de dire un sendmail clone pour fonctionner sous windows.

http://docs.python.org/lib/module-smtplib.html

-3voto

elec3647 Points 139

Je viens de chercher autour de la même chose et trouvé un bon exemple sur le site web Python: http://docs.python.org/2/library/email-examples.html

À partir du site mentionné:

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

Notez que cette fonction nécessite que vous avez sendmail/mailx correctement configuré pour accepter les connexions sur "localhost". Cela fonctionne sur mon Mac, Ubuntu et Redhat serveurs par défaut, mais vous pouvez double-vérifier si vous rencontrez des problèmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X