it-swarm-es.tech

Enviando correo vía sendmail desde python

Si deseo enviar correo no a través de SMTP, sino a través de sendmail, ¿hay una biblioteca para python que encapsule este proceso?

Mejor aún, ¿hay una buena biblioteca que resuma la elección completa de 'sendmail -versus- smtp'?

Ejecutaré este script en un montón de hosts de Unix, solo algunos de los cuales están escuchando en localhost: 25; algunos de estos son parte de los sistemas integrados y no pueden configurarse para aceptar SMTP.

Como parte de Good Practice, realmente me gustaría que la biblioteca se encargara de las vulnerabilidades de inyección de cabecera en sí misma, por lo que solo poner una cadena en popen('/usr/bin/sendmail', 'w') está un poco más cerca del metal de lo que quisiera.

Si la respuesta es 'escribe una biblioteca', que así sea ;-)

70
Nate

La inyección de encabezado no es un factor en la forma en que envía el correo, es un factor en la forma en que construye el correo. Verifique el paquete email , cree el correo con eso, serialícelo y envíelo a /usr/sbin/sendmail usando el subprocess module

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

Esta es una función Python simple que utiliza el sendmail de unix para entregar un correo.

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
32
Pieter

La respuesta de Jim no me funcionó en Python 3.4. Tuve que agregar un argumento universal_newlines=True adicional 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())

Sin el universal_newlines=True consigo

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

Es bastante común usar el comando sendmail desde Python usando os.popen

Personalmente, para los scripts que no escribí yo mismo, creo que usar el protocolo SMTP es mejor, ya que no requeriría la instalación de un clon de sendmail para ejecutar Windows.

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

3
tovare

Esta pregunta es muy antigua, pero vale la pena señalar que existe un sistema de construcción de mensajes y de entrega de correo electrónico llamado Marrow Mailer (anteriormente TurboMail) que ha estado disponible desde antes de que se hiciera este mensaje.

Ahora se está adaptando para que sea compatible con Python 3 y se actualice como parte de Marrow suite.

3
amcgregor