为啥 Python 的标准库对发送电子邮件的支持较弱 [关闭]

Posted

技术标签:

【中文标题】为啥 Python 的标准库对发送电子邮件的支持较弱 [关闭]【英文标题】:Why Python's standard library has a weak support for sending email [closed]为什么 Python 的标准库对发送电子邮件的支持较弱 [关闭] 【发布时间】:2013-01-14 00:29:27 【问题描述】:

Python 被宣传为“包含电池”的语言。 所以,我想知道为什么它的标准库不包含对电子邮件的高级支持:

我发现您需要对 MIME 有很多了解才能创建与您在典型电子邮件客户端中可以实现的功能等效的电子邮件,例如处理 html 内容、嵌入的图像和文件附件。

要实现这一点,您需要做一个low level assembly of the message,例如:

处理MIMEMultipart部分,了解relatedalternate等。 了解文件编码,例如base64

如果您对 MIME 的了解还不足以组装这样一封电子邮件,那么很容易陷入陷阱,例如错误的部分嵌套,并创建一些电子邮件客户端可能无法正确查看的邮件。

我不需要了解 MIME 就能正确发送电子邮件。 一个高级库支持应该encapsulate all this MIME logic,允许你写这样的东西:

m = Email("mailserver.mydomain.com")
m.setFrom("Test User <test@mydomain.com>")
m.addRecipient("you@yourdomain.com")
m.setSubject("Hello there!")
m.setHtmlBody("The following should be <b>bold</b>")
m.addAttachment("/home/user/image.png")
m.send()

非标准库解决方案是pyzmail:

import pyzmail
sender=(u'Me', 'me@foo.com')
recipients=[(u'Him', 'him@bar.com'), 'just@me.com']
subject=u'the subject'
text_content=u'Bonjour aux Fran\xe7ais'
prefered_encoding='iso-8859-1'
text_encoding='iso-8859-1'
pyzmail.compose_mail(
        sender,  recipients, 
        subject, prefered_encoding,  (text_content, text_encoding), 
        html=None, 
        attachments=[('attached content', 'text', 'plain', 'text.txt',
                      'us-ascii')])

是否有任何理由不包含在“包含电池”的标准库中?

【问题讨论】:

因此,要发送“相当复杂的消息”,您必须做一些相当复杂的事情。这并不令人惊讶。 是的,使用的措辞不是最好的。我改进了解释,试图更好地说明这一点。 堆栈溢出不是这个问题的好地方。如果您实际上想知道为什么标准库中没有高级电子邮件支持(而不仅仅是抱怨它),那么您最好在python-dev 上向开发人员询问。或者,如果您希望将 pyzmail 添加到标准库中,raise an issue。在这里抱怨不太可能让您有所收获。 @gareth-rees 实际上,这是一个很好的答案,有可操作的建议。 【参考方案1】:

我认为问题更多在于电子邮件结构的复杂性,而不是 Python 中 smpt 库的弱点。

This example in php 似乎并不比您的 Python 示例简单。

【讨论】:

【参考方案2】:
import smtplib
smtp = smtplib.SMTP()
smtp.connect()
smtp.sendmail("me@somewhere.com", ["you@elsewhere.com"],
    """Subject: This is a message sent with very little configuration.

    It will assume that the mailserver is on localhost on the default port
    (25) and also assume a message type of text/plain.

    Of course, if you want more complex message types and/or server
    configuration, it kind of stands to reason that you'd need to do
    more complex message assembly. Email (especially with embedded content)
    is actually a rather complex area with many possible options.
    """
smtp.quit()

【讨论】:

如果没有简单的文件附件,您的演示将是不完整的。 一个示例还需要为消息添加 HTML 版本,并包含几个附件或图像。 @DReispt 也许你应该改变你的问题,然后更具体。 @DReispt 我认为您错过了这个答案的重点,即“高级支持”的定义绝不是客观的。 已发表评论。我改进了这个问题,以更好地解释我真正想问的问题。

以上是关于为啥 Python 的标准库对发送电子邮件的支持较弱 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

用python自动发送邮件详细教程

为啥对方收不到我的邮件而显示邮件发送成功?

qq邮箱为啥邮件发送失败重新发送验证码

Python邮件发送。为啥我用smtp发送邮件,发送成功没有报错,却没有收到邮件?求解

各算子库对CNN的支持

发送文本和 HTML 电子邮件 - 为啥 Gmail 总是选择文本版本?