enviar - Enviando correo a través de sendmail desde python
smtplib python 3 (7)
Es bastante común usar el comando sendmail de Python usando os.popen
Personalmente, para los scripts no escribí yo mismo, creo que usar el protocolo SMTP es mejor, ya que no requeriría instalar un clon sendmail para ejecutar en Windows.
Si deseo enviar correos electrónicos 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 abstraiga toda la opción ''sendmail-revers-smtp''?
Voy a ejecutar este script en un montón de hosts Unix, solo algunos de los cuales están escuchando en localhost: 25; algunos de estos son 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 ocupe de las vulnerabilidades de inyección de encabezado en sí, así que simplemente volcar una cadena para popen(''/usr/bin/sendmail'', ''w'')
está un poco más cerca de el metal de lo que me gustaría
Si la respuesta es ''ir a escribir una biblioteca'', que así sea ;-)
Esta es una función de python simple que usa el sendmail 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
Esta pregunta es muy antigua, pero vale la pena observar que hay un sistema de entrega de mensajes y correo electrónico llamado Marrow Mailer (anteriormente TurboMail) que ha estado disponible desde antes de que se hiciera este mensaje.
Ahora está siendo portado para soportar Python 3 y actualizado como parte de la suite Marrow .
Estaba buscando lo mismo y encontré un buen ejemplo en el sitio web de Python: http://docs.python.org/2/library/email-examples.html
Desde el 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 desee verificar si tiene algún problema.
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 de email , construya el correo con eso, serialícelo y envíelo a /usr/sbin/sendmail
usando el módulo de subprocess :
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())
La respuesta de Jim no funcionó para mí en Python 3.4. Tuve que agregar un argumento universal_newlines=True
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
obtengo
TypeError: ''str'' does not support the buffer interface
La respuesta más fácil es smtplib, puedes encontrar documentos here .
Todo lo que necesita hacer es configurar su sendmail local para aceptar la conexión de localhost, que probablemente ya lo haga de manera 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.