web-dev-qa-db-fra.com

Envoi de courrier via sendmail depuis python

Si je veux envoyer du courrier non pas via SMTP, mais plutôt via sendmail, existe-t-il une bibliothèque pour python qui encapsule ce processus?

Mieux encore, existe-t-il une bonne bibliothèque qui résume l'ensemble du choix "sendmail -versus- smtp"?

Je vais exécuter ce script sur un tas d'hôtes Unix, dont certains seulement écoutent sur localhost: 25; certains d'entre eux font partie de systèmes embarqués et ne peuvent pas être configurés pour accepter SMTP.

Dans le cadre des bonnes pratiques, j'aimerais vraiment que la bibliothèque s'occupe elle-même des vulnérabilités d'injection d'en-tête - il suffit donc de vider une chaîne dans popen('/usr/bin/sendmail', 'w') est un peu plus proche du métal que je ne le souhaiterais.

Si la réponse est 'allez écrire une bibliothèque', tant pis ;-)

70
Nate

L'injection d'en-tête n'est pas un facteur dans la façon dont vous envoyez le courrier, c'est un facteur dans la façon dont vous créez le courrier. Vérifiez le paquet email , créez le courrier avec cela, sérialisez-le et envoyez-le à /usr/sbin/sendmail en utilisant le module sous-processus :

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

Il s'agit d'une simple fonction python qui utilise le sendmail unix pour remettre un courrier.

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 réponse de Jim n'a pas fonctionné pour moi dans Python 3.4. J'ai dû ajouter un argument universal_newlines=True Supplémentaire à 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())

Sans le universal_newlines=True J'obtiens

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

Il est assez courant d'utiliser simplement la commande sendmail de Python en utilisant os.popen

Personnellement, pour les scripts que je n'ai pas écrits moi-même, je pense qu'il est préférable d'utiliser le protocole SMTP, car cela ne nécessiterait pas l'installation d'un clone sendmail pour fonctionner sur Windows.

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

3
tovare

Cette question est très ancienne, mais il convient de noter qu'il existe un système de construction de messages et de distribution d'e-mails appelé Marrow Mailer (anciennement TurboMail), qui était disponible depuis avant que ce message ne soit demandé.

Il est maintenant porté pour prendre en charge Python 3 et mis à jour dans le cadre de la suite Marrow .

3
amcgregor