Question

je suis nouveau avec python .. En fait, j'essaie d'envoyer un courrier électronique avec python: corps html, corps alternatif et pièce jointe.

J'ai donc trouvé ce tutoriel et adapté avec l’authentification Gmail (le didacticiel a trouvé ici )

Le code que j'ai sous atm, est-ce 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()

et cela fonctionne .. maintenant ne manque que la pièce jointe .. Et je ne peux pas ajouter la pièce jointe (à partir de cette publication )

Alors, pourquoi n’existe-t-il pas une classe python comme phpMailer pour php? Est-ce parce que, pour un programmeur python de taille moyenne, envoyer un email en HTML avec pièce jointe et texte alt est si simple qu’une classe n’est pas nécessaire? Ou est-ce parce que je ne l'ai tout simplement pas trouvé?

Si je peux écrire un cours comme celui-là, quand je serai assez bon en python, cela serait-il utile pour quelqu'un?

Était-ce utile?

La solution

Si vous pouvez vous excuser, j'ai écrit un module de diffusion qui l'envoi de courrier électronique avec Python est assez simple. Aucune dépendance autre que les bibliothèques smtplib et email de Python.

Voici un exemple simple d'envoi d'un courrier électronique avec une pièce jointe:

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)

Modifier : voici un exemple d'envoi d'un courrier électronique HTML avec un texte alternatif. :)

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)

Éditer 2 : grâce à l'un des commentaires, j'ai ajouté une nouvelle version de mailer à pypi qui vous permet de spécifier le port dans la classe Mailer.

Autres conseils

Django inclut la classe dont vous avez besoin, docs here

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

Dans mes paramètres, j'ai:

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

Je veux simplement pointer sur Projet Lamson , ce que je recherchais lorsque j'ai trouvé ce fil. J'ai fait quelques recherches supplémentaires et l'ai trouvé. C'est:

  

L'objectif de Lamson est de mettre fin à l'enfer qu'est le "développement d'applications de messagerie". Plutôt que de rester bloqué dans les années 1970, Lamson adopte la conception moderne du framework d’applications Web et utilise un langage de script éprouvé (Python).

Il s’intègre parfaitement à Django. Mais c'est plus fait pour les applications de messagerie. Cela ressemble cependant à un pur amour.

Peut-être pourrez-vous essayer avec turbomail python-turbomail.org

C'est plus facile et utile :)

import turbomail

# ...

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

turbomail.enqueue(message)

Je vous recommande de lire le rfc SMTP . Une recherche sur Google montre que cela peut facilement être fait en utilisant la classe MimeMultipart que vous importez mais que vous n'utilisez jamais. Voici quelques exemples sur le site de documentation de Python.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top