Frage

i mit Python neu bin .. Eigentlich versuche ich, funktionsfähige E-Mail mit Python zu senden. Html Körpern, Text alternativem Text und den Anhang

So habe ich festgestellt dieses Tutorial und angepasst es mit der gmail-Authentifizierung (tutorial hier )

Der Code i atm haben, ist, dass:

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

und das funktioniert .. jetzt nur die Anlage verpassen .. Und ich bin nicht in der Lage, die Anlage zu addieren (von dieser Post )

Also, warum ist es nicht eine Python-Klasse wie PHPMailer für php? Ist es, weil, für einen mittel können Python-Programmierer eine HTML-E-Mail mit Anhang und Alt-Text Körper zu senden ist so einfach, dass eine Klasse benötigt wird, nicht wahr? Oder ist, weil ich es einfach nicht das finden?

Wenn ich in der Lage sein werden, eine Klasse wie das geschrieben habe, wenn ich mit Python gut genug sein werden, wäre das für jemanden nützlich sein?

War es hilfreich?

Lösung

Wenn Sie einige eklatante Eigenwerbung entschuldigen kann, schrieb ich ein Mailer Modul dass E-Mail mit Python ziemlich einfach macht das Versenden. Keine Abhängigkeiten anders als die Python smtplib und E-Mail-Bibliotheken.

Hier ist ein einfaches Beispiel für eine E-Mail mit einem Anhang zu senden:

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)

Bearbeiten : Hier ist ein Beispiel eine HTML-E-Mail mit alternativem Text zu senden. :)

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)

Edit 2 . Dank einer der Kommentare, ich habe eine neue Version des Mailer hinzugefügt PyPI, mit dem Sie den Port in der Mailer-Klasse angeben

Andere Tipps

Django umfasst die Klasse, die Sie in Kern benötigen, docs hier

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

In meinen Einstellungen habe ich:

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

Vielleicht können Sie versuchen, mit turbomail python-turbomail.org

Es ist einfacher und nützlich :)

import turbomail

# ...

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

turbomail.enqueue(message)

Ich empfehle das Lesen der SMTP rfc . Eine Google-Suche zeigt, dass dies kann leicht mit Hilfe der MimeMultipart Klasse erfolgen, die Sie importieren, aber nie verwenden. Hier sind einige Beispiele auf Python Dokumentation Website .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top