Pregunta

soy nuevo con python .. En realidad, estoy intentando enviar un correo electrónico destacado con python: cuerpo HTML, cuerpo alternativo de texto y archivo adjunto.

Entonces, he encontrado este tutorial y he adaptado con la autenticación de gmail (tutorial encontrado aquí )

El código que tengo atm, es que:

def createhtmlmail (html, text, subject):
"""Create a mime-message that will render HTML in popular
  MUAs, text in better ones"""
import MimeWriter
import mimetools
import cStringIO
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import os

out = cStringIO.StringIO() # output buffer for our message 
htmlin = cStringIO.StringIO(html)
txtin = cStringIO.StringIO(text)

writer = MimeWriter.MimeWriter(out)
#
# set up some basic headers... we put subject here
# because smtplib.sendmail expects it to be in the
# message body
#
writer.addheader("Subject", subject)
writer.addheader("MIME-Version", "1.0")
#
# start the multipart section of the message
# multipart/alternative seems to work better
# on some MUAs than multipart/mixed
#
writer.startmultipartbody("alternative")
writer.flushheaders()
#
# the plain text section
#
subpart = writer.nextpart()
subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
pout = subpart.startbody("text/plain", [("charset", 'us-ascii')])
mimetools.encode(txtin, pout, 'quoted-printable')
txtin.close()
#
# start the html subpart of the message
#
subpart = writer.nextpart()
subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
#
# returns us a file-ish object we can write to
#
pout = subpart.startbody("text/html", [("charset", 'us-ascii')])
mimetools.encode(htmlin, pout, 'quoted-printable')
htmlin.close()


#
# Now that we're done, close our writer and
# return the message body
#
writer.lastpart()
msg = out.getvalue()
out.close()
return msg

import smtplib
f = open("/path/to/html/version.html", 'r')
html = f.read()
f.close()
f = open("/path/to/txt/version.txt", 'r')
text = f.read()
subject = "Prova email html da python, con allegato!"
message = createhtmlmail(html, text, subject)
gmail_user = "thegmailaccount@gmail.com"
gmail_pwd = "thegmailpassword"
server = smtplib.SMTP("smtp.gmail.com", 587)
server.ehlo()
server.starttls()
server.ehlo()
server.login(gmail_user, gmail_pwd)
server.sendmail(gmail_user, "example@example.com", message)
server.close()

y eso funciona ... ahora solo falta el archivo adjunto .. Y no puedo agregar el archivo adjunto (de esta publicación )

Entonces, ¿por qué no hay una clase de python como phpMailer para php? ¿Es porque, para un programador de Python con capacidad media, enviar un correo electrónico html con un archivo adjunto y un cuerpo de texto alternativo es tan fácil que no se necesita una clase? ¿O es porque simplemente no lo encontré?

Si podré escribir una clase como esa, cuando sea lo suficientemente bueno con python, ¿sería útil para alguien?

¿Fue útil?

Solución

Si puedes excusar una auto promoción descarada, escribí un módulo de correo electrónico que hace que el envío de correo electrónico con Python sea bastante simple. No hay más dependencias que las bibliotecas de correo electrónico y smtplib de Python.

Aquí hay un ejemplo simple para enviar un correo electrónico con un archivo adjunto:

from mailer import Mailer
from mailer import Message

message = Message(From="me@example.com",
                  To=["you@example.com", "him@example.com"])
message.Subject = "Kitty with dynamite"
message.Body = """Kitty go boom!"""
message.attach("kitty.jpg")

sender = Mailer('smtp.example.com')
sender.login("username", "password")
sender.send(message)

Editar : Este es un ejemplo de cómo enviar un correo electrónico HTML con texto alternativo. :)

from mailer import Mailer
from mailer import Message

message = Message(From="me@example.com",
                  To="you@example.com",
                  charset="utf-8")
message.Subject = "An HTML Email"
message.Html = """This email uses <strong>HTML</strong>!"""
message.Body = """This is alternate text."""

sender = Mailer('smtp.example.com')
sender.send(message)

Editar 2 : gracias a uno de los comentarios, agregué una nueva versión de mailer a pypi que te permite especificar el puerto en la clase de Mailer.

Otros consejos

Django incluye la clase que necesita en el núcleo, docs aquí

from django.core.mail import EmailMultiAlternatives

subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = 'This is an important message.'
html_content = '<p>This is an <strong>important</strong> message.</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.attach_file('/path/to/file.jpg')
msg.send()

En mi configuración tengo:

#GMAIL STUFF
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'name@gmail.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587

Solo quiero señalar Proyecto Lamson , que era lo que estaba buscando cuando encontré este hilo. Hice un poco más de búsqueda y lo encontré. Es:

  

El objetivo de Lamson es acabar con el infierno que es "desarrollo de aplicaciones de correo electrónico". En lugar de quedarse estancado en la década de 1970, Lamson adopta el diseño moderno del marco de la aplicación web y utiliza un lenguaje de scripting probado (Python).

Se integra muy bien con Django. Pero está más hecho para aplicaciones basadas en correo electrónico. Aunque parece puro amor.

Tal vez puedas probar con turbomail python-turbomail.org

Es más fácil y útil :)

import turbomail

# ...

message = turbomail.Message("from@example.com", "to@example.com", subject)
message.plain = "Hello world!"

turbomail.enqueue(message)

Recomiendo leer el SMTP rfc . Una búsqueda en Google muestra que esto se puede hacer fácilmente usando la clase MimeMultipart que está importando pero nunca usando. Aquí hay algunos ejemplos en el sitio de documentación de Python.

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