Pregunta

Si quiero enviar correo no a través de SMTP, sino a través de sendmail, ¿existe una biblioteca para Python que encapsule este proceso?

Mejor aún, ¿existe una buena biblioteca que resuma toda la elección 'sendmail versus smtp'?

Ejecutaré este script en varios hosts Unix, de los cuales solo algunos escuchan en localhost:25;algunos de ellos forman parte de sistemas integrados y no se pueden configurar para aceptar SMTP.

Como parte de las buenas prácticas, realmente me gustaría que la biblioteca se encargara de las vulnerabilidades de inyección de encabezados por sí misma, así que simplemente descargue una cadena en popen('/usr/bin/sendmail', 'w') Está un poco más cerca del metal de lo que me gustaría.

Si la respuesta es "ve a escribir una biblioteca", que así sea ;-)

¿Fue útil?

Solución

La inyección de encabezado no es un factor en cómo envía el correo, es un factor en cómo construye el correo.Comprobar el correo electrónico paquete, construir el correo con eso, serializarlo y enviarlo a /usr/sbin/sendmail utilizando el subproceso módulo:

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

Otros consejos

Esta es una función simple de Python que utiliza 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" % "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 respuesta de Jim no funcionó para mí en Python 3.4.Tuve que agregar un adicional universal_newlines=True argumento para 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())

Sin el universal_newlines=True yo obtengo

TypeError: 'str' does not support the buffer interface

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

Personalmente, para los scripts que no escribí yo mismo, creo que es mejor usar el protocolo SMTP, ya que no requeriría instalar, digamos, un clon de sendmail para ejecutarlo en Windows.

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

Esta pregunta es muy antigua, pero vale la pena señalar que existe un sistema de creación de mensajes y entrega de correo electrónico llamado Envío publicitario de médula (anteriormente TurboMail) que ha estado disponible desde antes de que se solicitara este mensaje.

Ahora se está adaptando para que sea compatible con Python 3 y se está actualizando como parte del Médula suite.

Estaba buscando lo mismo y encontré un buen ejemplo en el sitio web de Python: http://docs.python.org/2/library/email-examples.html

Del sitio mencionado:

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

Tenga en cuenta que esto requiere que tenga sendmail/mailx configurado correctamente para aceptar conexiones en "localhost".Esto funciona en mis servidores Mac, Ubuntu y Redhat de forma predeterminada, pero es posible que desees volver a verificar si tienes algún problema.

La respuesta más sencilla es smtplib, puedes encontrar documentos en él. aquí.

Todo lo que necesita hacer es configurar su sendmail local para aceptar la conexión desde localhost, lo que probablemente ya hace de forma predeterminada.Claro, todavía estás usando SMTP para la transferencia, pero es el sendmail local, que es básicamente lo mismo que usar la herramienta de línea de comandos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top