Python中与phpMailer php类相当的是什么?

3
我是一个可帮助翻译文本的助手。 实际上,我正在尝试使用Python发送带特色的电子邮件:HTML正文、文本备用正文和附件。 因此,我找到了这个tutorial并根据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()

这样就可以了...现在只缺附件了... 我无法添加附件(来自this帖子)

那么,为什么没有像phpMailer一样的Python类呢? 是因为对于一个中等水平的Python程序员来说,发送带有附件和alt文本正文的HTML电子邮件非常容易,所以不需要一个类吗? 还是因为我没有找到它?

如果我能够编写一个像那样的类,当我足够熟练掌握Python时,那会对某些人有用吗?

5个回答

6
如果您可以容忍一些公然的自我推销,我写了一个邮件模块(mailer module),使使用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添加了一个新版本的邮件程序,允许您在Mailer类中指定端口。


加入一个替代文本的例子,你就赢了! - YHVH
哇,太棒了! 你的模块允许通过Gmail SMTP发送邮件吗? 我应该在哪里指定SMTP端口(例如使用smtplib.SMTP("smtp.gmail.com", 587)与smtplib)? - Strae
@DaNiel:非常好的观点,谢谢。我已经添加了一个更新版本,让您可以在Mailer类中指定端口(`sender = Mailer('localhost', port=587)')。 http://pypi.python.org/pypi/mailer/0.4 - Ryan Ginstrom
嗨,Ryan,我尝试了使用Gmail的0.4版本,但是它引发了一个错误: File "C:\Python26\lib\smtplib.py", line 522, in login raise SMTPException("SMTP AUTH extension not supported by the server") 也许是因为Gmail需要TLS? - Strae

3

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

这就是我一直在寻找的!谢谢伙计。 最后一件事:为了使用那个类,我们必须下载并安装 Django,显然... 有一个可以在没有 Django 框架的情况下运行的类会很好,只需运行类文件(和自然的 Python 模块)。 - Strae

2

我想指出Lamson项目,这正是我在找到这个帖子时想要的。我进行了更多搜索并找到了它。它的目标是结束“电子邮件应用程序开发”的困境。Lamson采用现代Web应用程序框架设计和使用经过验证的脚本语言(Python),而不是停留在20世纪70年代。

Lamson的目标是结束“电子邮件应用程序开发”的困境。Lamson采用现代Web应用程序框架设计和使用经过验证的脚本语言(Python),而不是停留在20世纪70年代。

它与Django集成良好。但它更适合基于电子邮件的应用程序。看起来是纯粹的爱。


1
也许你可以尝试使用 turbomail,它是一个Python库,网址是 python-turbomail.org。
这样会更简单和有用 :)
import turbomail

# ...

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

turbomail.enqueue(message)

0

我建议阅读SMTP rfc。谷歌搜索显示,这可以通过使用您正在导入但从未使用的MimeMultipart类轻松完成。以下是Python文档网站上的一些示例


是的,我发誓我会读一下。 那么,如果一个电子邮件类还不存在怎么办? 如果我写了一个,付出了大量的努力,对某些人有用吗?或者没有人使用它,因为Python程序员“只使用过程化方法”?(我只是猜测啊) - Strae
你可能想要使用像Django这样为你提供此功能的工具。 - Bjorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接