2009-04-30 6 views
3

Я новичок в python .. На самом деле, я пытаюсь отправить признак электронной почты с помощью python: html body, текст альтернативного тела и вложения.Где эквивалент php-класса phpMailer для Python?

Итак, я нашел это tutorial и адаптировать его с аутентификацией GMAIL (учебник найден here)

код у меня есть атм, что:

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

и работает .. Теперь только пропустить приложение .. И я не могу добавить вложение (от this сообщение)

Итак, почему нет класса python, такого как phpMailer для php? Это потому, что для программиста с программированием на языке python, отправляющего html-адрес электронной почты с вложением и текстом body body, так легко, что класс не нужен? Или потому, что я просто не нашел его?

Если я смогу написать такой класс, когда я буду достаточно хорош с python, это было бы полезно для кого-то?

ответ

5

Если вы простите некоторые вопиющее продвижение собственного, я написал mailer module, что делает отправку электронная почта с Python довольно проста. Никаких зависимостей, кроме библиотек smtplib и электронной почты Python.

Вот простой пример для отправки по электронной почте с приложением:

from mailer import Mailer 
from mailer import Message 

message = Message(From="[email protected]", 
        To=["[email protected]", "[email protected]"]) 
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) 

Редактировать: Вот пример отправки HTML электронной почты с альтернативным текстом. :)

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: Благодаря одному из комментариев, я добавил новую версию почтовой программы для PyPi, что позволяет указать порт в классе Mailer.

+0

добавьте пример альтернативного текста, и у вас есть победитель! – YHVH

+0

Ничего себе, это здорово! Позволяет ли ваш модуль отправлять почту через Gmail smtp? Где я должен указать порт smtp (например, server = smtplib.SMTP («smtp.gmail.com», 587) с smtplib) – Strae

+0

@DaNiel: Очень хороший момент, спасибо. Я добавил обновленную версию, которая позволяет указать порт в классе Mailer ('sender = Mailer ('localhost', port = 587) ') http://pypi.python.org/pypi/mailer/0.4 –

0

Рекомендую прочитать SMTP rfc. Поиск в Google показывает, что это можно легко сделать, используя класс MimeMultipart, который вы импортируете, но не используете. Вот some examples на сайте документации Python.

+0

Да, клянусь, я дам прочитать. Как насчет вопроса о том, что класс электронной почты еще не существует? Я бы написал один, плюя литров крови, был бы полезен для кого-то, или никто не будет использовать его, потому что программист-питон просто использует процедурный подход? (im just guessing ah) – Strae

+0

Возможно, вы захотите использовать что-то вроде Django, которое предоставит вам это. –

2

Джанго включает в себя класс, который нужно в ядре, 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() 

В моих настройках у меня есть:

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

Вот что я искал! Спасибо, помощник. Последняя вещь: для использования этого класса мы должны скачать и установить django, obvisiuly .. Холодный класс, который работает без рамки django, но просто запускает файл класса (и естественные модули python)) – Strae

1

Может быть, вы можете попробовать с turbomail python-turbomail.org

Это более легко и полезно :)

import turbomail 

# ... 

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

turbomail.enqueue(message) 
2

Просто хочу, чтобы указать на Lamson Project которая была то, что я искал, когда я нашел эту тему. Я сделал еще несколько поисков и нашел его. Это:

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

Он прекрасно сочетается с Django. Но он больше подходит для приложений на основе электронной почты. Это похоже на чистую любовь.

+0

я попробую;) – Strae