Pergunta

Eu sou novo com python .. Na verdade, eu estou tentando enviar e-mail caracterizado com python:. Corpo html, o corpo do texto alternativo, e apego

Então, eu encontrei este tutorial e adaptado -lo com a autenticação do gmail (tutorial encontrado aqui )

O código que eu tenho atm, é 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()

e que as obras .. agora só falta o anexo .. E eu não sou capaz de adicionar o anexo (de este post )

Então, por que não há uma classe python como phpmailer para php? É porque, para um programador python médio capaz de enviar um e-mail html com o corpo apego e alt texto é tão fácil que uma classe não é necessário? Ou é porque eu simplesmente não encontrá-lo?

Se eu vou ser capaz de escrevi uma classe assim, quando eu vou ser bom o suficiente com python, isso seria útil para alguém?

Foi útil?

Solução

Se você pode desculpar alguns auto-promoção descarada, eu escrevi um mailer módulo que torna o envio de e-mail com Python bastante simples. Nenhum outro do que os smtplib e-mail bibliotecas Python dependências.

Aqui está um exemplo simples para o envio de um e-mail com um anexo:

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 : Aqui está um exemplo de enviar um e-mail HTML com 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 :. Graças a um dos comentários, eu adicionei uma nova versão do mailer para pypi que permite que você especifique a porta na classe Mailer

Outras dicas

Django inclui a classe que você precisa em núcleo, docs aqui

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

Em minhas configurações eu tenho:

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

Apenas quero apontar para Lamson Projeto que foi o que eu estava procurando quando eu encontrei esta discussão. Eu fiz mais algumas pesquisas e encontrou. É:

O objetivo da Lamson é colocar um fim ao inferno que é "o desenvolvimento de aplicativos de e-mail". Ao invés de ficar preso na década de 1970, Lamson adota o projeto quadro moderno aplicação web e usa uma linguagem de script comprovada (Python).

Ele se integra muito bem com Django. Mas é mais feito para aplicações baseadas em e-mail. Parece que o amor puro embora.

Talvez você pode tentar com turbomail python-turbomail.org

É mais fácil e útil :)

import turbomail

# ...

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

turbomail.enqueue(message)

Eu recomendo a leitura do SMTP RFC . Uma pesquisa no Google mostra que isso pode ser feito facilmente usando a classe MimeMultipart qual você está importando, mas nunca usando. Aqui estão alguns exemplos no local documentação do Python.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top