2009-04-30 8 views
3

Ich bin neu mit Python .. Eigentlich versuche ich vorgestellten E-Mail mit Python senden: HTML-Text, Text alternative Körper und Anhang.Wo ist der phpMailer php Klasse für Python?

Also, ich diese tutorial und angepasst es mit dem gmail-Authentifizierung gefunden habe (Tutorial here gefunden)

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 = "[email protected]" 
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, "[email protected]", message) 
server.close() 

und das funktioniert .. jetzt nur vermisse den Anhang. Und ich bin nicht in der Lage, den Anhang hinzuzufügen (this Beitrag)

Also, warum gibt es keine Python-Klasse wie PHPMailer für PHP? Liegt es daran, dass für einen mittelfähigen Python-Programmierer eine HTML-E-Mail mit Anhang und altem Text so einfach zu versenden ist, dass eine Klasse nicht benötigt wird? Oder ist, weil ich es gerade nicht gefunden habe?

Wenn ich in der Lage wäre, eine Klasse wie diese zu schreiben, wenn ich genug mit Python gut genug sein würde, wäre das für jemanden nützlich?

Antwort

5

Wenn Sie einige eklatante Eigenwerbung entschuldigen, ich mailer module schrieb das Senden macht E-Mail mit Python ziemlich einfach. Keine anderen Abhängigkeiten als die Python-Bibliotheken smtplib und email.

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="[email protected]", 
        To=["[email protected]", "[email protected]e.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="[email protected]", 
        To="[email protected]", 
        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, habe ich eine neue Version des Mailer hinzugefügt, mit dem Sie den Port in der Mailer-Klasse angeben, PyPI.

+0

in einem Beispiel hinzufügen alternativer Text und du hast einen Gewinner! – YHVH

+0

Wow, das ist großartig! Ermöglicht Ihr Modul das Senden von E-Mails über den Google Mail-SMTP-Server? Wo sollte ich den SMTP-Port angeben (z. B. server = smtplib.SMTP ("smtp.gmail.com", 587) mit smtplib) – Strae

+0

@DaNiel: Sehr guter Punkt, danke. Ich habe eine aktualisierte Version hinzugefügt, mit der Sie den Port in der Mailer-Klasse angeben können ('sender = Mailer ('localhost', port = 587) ') http://pypi.python.org/pypi/mailer/0.4 –

0

Ich empfehle das Lesen der SMTP rfc. Eine Google-Suche zeigt, dass dies problemlos mit der MimeMultipart-Klasse erfolgen kann, die Sie importieren, aber nie verwenden. Hier sind some examples auf Pythons Dokumentationsseite.

+0

Ja, ich schwöre, ich werde lesen. Was ist mit der Frage, dass eine E-Mail-Klasse noch nicht existiert? Ich werde eine schreiben, spuckt Liter Blut, wäre nützlich für jemanden, oder niemand wird es verwenden Becose Python Programmierer "nur den prozeduralen Ansatz verwenden"? (Ich rate nur ah) – Strae

+0

Sie möchten etwas wie Django verwenden, die dies für Sie bereitstellt. –

2

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

from django.core.mail import EmailMultiAlternatives 

subject, from_email, to = 'hello', '[email protected]', '[email protected]' 
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 meiner Einstellungen habe ich:

#GMAIL STUFF 
EMAIL_USE_TLS = True 
EMAIL_HOST = 'smtp.gmail.com' 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'password' 
EMAIL_PORT = 587 
+0

Das ist, was ich gesucht habe! Danke Kumpel. Letzte Sache: Um diese Klasse zu verwenden müssen wir herunterladen und installieren django, obvisiuly .. Cold in Ordnung eine Klasse, die ohne das Django-Framework, sondern nur die Klassen-Datei (und die natürlichen Python-Module)) – Strae

1

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

Es ist einfacher und nützlich :)

import turbomail 

# ... 

message = turbomail.Message("[email protected]", "[email protected]", subject) 
message.plain = "Hello world!" 

turbomail.enqueue(message) 
2

Nur um Lamson Project zeigen soll, das war das, was ich gesucht hatte, als ich habe diesen Thread gefunden. Ich habe ein wenig mehr gesucht und es gefunden. Es ist:

Lamson's goal is to put an end to the hell that is "e-mail application development". Rather than stay stuck in the 1970s, Lamson adopts modern web application framework design and uses a proven scripting language (Python).

Es integriert sich gut mit Django. Aber es ist mehr für E-Mail-basierte Anwendungen gemacht. Es sieht jedoch nach reiner Liebe aus.

+0

ich werde es versuchen;) – Strae