Где php-класс phpMailer эквивалентен Python? - PullRequest
3 голосов
/ 30 апреля 2009

Я новенький с питоном .. На самом деле, я пытаюсь отправить электронное письмо с использованием Python: HTML-текст, альтернативное текстовое тело и вложение.

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

код, который у меня есть, это то, что:

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

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

Итак, почему нет такого класса Python, как phpMailer для php? Это потому, что для программиста среднего уровня Python отправка html-письма с вложением и альтернативным текстом так проста, что класс не нужен? Или потому что я просто не нашел его?

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

Ответы [ 5 ]

5 голосов
/ 30 апреля 2009

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

Вот простой пример отправки электронного письма с вложением:

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)

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

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)

Редактировать 2 : Благодаря одному из комментариев я добавил в pypi новую версию почтовой программы, которая позволяет указывать порт в классе почтовой программы.

3 голосов
/ 30 апреля 2009

Django включает класс, который вам нужен в ядре, документы здесь

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

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

#GMAIL STUFF
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'name@gmail.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587
2 голосов
/ 17 февраля 2010

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

Цель Лэмсона - покончить с адом, "разработкой приложений для электронной почты". Вместо того, чтобы застрять в 1970-х годах, Lamson принимает современный дизайн веб-приложений и использует проверенный язык сценариев (Python).

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

1 голос
/ 22 мая 2009

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

Это проще и полезнее :)

import turbomail

# ...

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

turbomail.enqueue(message)
0 голосов
/ 30 апреля 2009

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

...