Question

Si je ne souhaite pas envoyer de courrier 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 tout le choix "sendmail -versus-smtp"?

Je vais exécuter ce script sur un groupe d’hôtes Unix, dont seuls quelques-uns écoutent sur localhost: 25; quelques-uns d'entre eux font partie de systèmes intégrés et ne peuvent pas être configurés pour accepter le protocole 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 passer 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 'écris une bibliothèque', ainsi soit-il; -)

Était-ce utile?

La solution

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 construisez le courrier. Vérifiez le package email , construisez le courrier avec celui-ci, sérialisez-le et envoyez-le. vers / usr / sbin / sendmail à l'aide du 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", "-oi"], stdin=PIPE)
p.communicate(msg.as_string())

Autres conseils

Il s’agit d’une fonction python simple qui utilise le sendmail unix pour distribuer un 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

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

Sans le universal_newlines = True je reçois

TypeError: 'str' does not support the buffer interface

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 que l’utilisation du protocole SMTP est préférable, car elle ne nécessite pas d’installation, par exemple un clone de sendmail pour fonctionner sous Windows.

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

Cette question est très ancienne, mais il convient de noter qu’il existe un système de construction de messages et de distribution du courrier électronique appelé Marrow Mailer (anciennement TurboMail), 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 .

Je cherchais simplement la même chose et j'ai trouvé un bon exemple sur le site Web de Python: http://docs.python.org/2/library/email-examples.html

Sur le 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 cela nécessite que vous ayez configuré correctement sendmail / mailx pour accepter les connexions sur "localhost". Cela fonctionne par défaut sur les serveurs Mac, Ubuntu et Redhat, mais vous pouvez également vérifier si vous rencontrez des problèmes.

La réponse la plus simple est smtplib, vous pouvez y trouver des documents ici .

Tout ce que vous avez à faire est de configurer votre sendmail local pour qu’il accepte la connexion de localhost, ce qu’il fait probablement déjà par défaut. Bien sûr, vous utilisez toujours le protocole SMTP pour le transfert, mais il s’agit du sendmail local, ce qui revient fondamentalement à utiliser l’outil de ligne de commande.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top