【问题标题】:Python - Open default mail client using mailto, with multiple recipientsPython - 使用 mailto 打开默认邮件客户端,具有多个收件人
【发布时间】:2010-06-17 06:37:37
【问题描述】:

我正在尝试编写一个 Python 函数来使用默认安装的邮件客户端向用户列表发送电子邮件。我想打开电子邮件客户端,让用户有机会编辑用户列表或电子邮件正文。

我做了一些搜索,根据这里:

http://www.sightspecific.com/~mosh/WWW_FAQ/multrec.html

将多个以逗号分隔的收件人放在 mailto 链接中显然违反了 RFC 规范。然而,其他人似乎都是这样做的。对此的现代立场究竟是什么?

总之,我找到了以下两个网站:

这似乎建议使用 urllib.parse(对我来说是 url.parse.quote)和 webbrowser.open 的解决方案。

我尝试了第一个链接 (2ality.blogspot.com) 中的示例代码,效果很好,并打开了我的默认邮件客户端。但是,当我尝试在自己的模块中使用代码时,由于某种奇怪的原因,它似乎打开了我的默认浏览器。地址栏中没有有趣的文字,它只是打开了浏览器。

email_incorrect_phone_numbers() 函数位于Employees 类中,该类包含Employee 对象的字典(employee_dict),这些对象本身具有许多员工属性(sn、givenName、mail 等)。完整代码其实在这里(Python - Converting CSV to Objects - Code Design

from urllib.parse import quote
import webbrowser

....

    def email_incorrect_phone_numbers(self):
        email_list = []
        for employee in self.employee_dict.values():
            if not PhoneNumberFormats.standard_format.search(employee.telephoneNumber):
                print(employee.telephoneNumber, employee.sn, employee.givenName, employee.mail)
                email_list.append(employee.mail)
        recipients = ', '.join(email_list)
        webbrowser.open("mailto:%s?subject=%s&body=%s" %
                    (recipients, quote("testing"), quote('testing'))
                    )

有什么建议吗?

干杯, 维克多

【问题讨论】:

    标签: python email


    【解决方案1】:

    好吧,既然你征求建议:忘记mailto: 方案和webbrowser,并使用Python 的smtplib 模块编写一个小型SMTP 客户端。它是标准的,在所有系统上都完全受支持,并且文档中包含一个示例,您实际上可以从中复制和粘贴部分内容。

    当然,如果您使用smtplib,则必须向用户询问要使用的 SMTP 服务器的详细信息(主机名和端口,可能还有登录名/密码)。诚然,这很不方便,所以我明白您为什么要委托系统上的现有程序来处理电子邮件。问题是,没有独立于系统的方法可以做到这一点。即使是webbrowser 模块也不能在任何地方工作。有些人使用的系统模块无法检测到默认(或任何)浏览器,即使可以检测到,当您提供mailto: 链接时会发生什么完全取决于浏览器。

    如果您不想或不能使用 SMTP,最好的办法可能是编写一个自定义模块,该模块能够在尽可能多的不同系统上检测和打开默认电子邮件客户端 - 基本上是 @ 987654327@ 模块可以,除了电子邮件客户端而不是浏览器。在这种情况下,您需要确定您的用户安装了哪些类型的邮件客户端并确保您支持它们。如果你足够彻底,你可能会在 PyPI(Python 包索引)上发布你的模块,甚至可能将它包含在 Python 标准库的未来版本中——我相信有很多人会喜欢类似的东西那个。

    【讨论】:

    • 嗯,是的,看起来 mailto 很糟糕。唯一的问题是,我们希望用户能够根据需要编辑邮件列表、主题和正文。使用预先填充的内容打开他们的电子邮件客户端是一种很好的方法。此外,这是一个相当同质的公司环境,所以我们知道用户将拥有什么电子邮件客户端,以及他们的环境是如何设置的。那个,而且它是一个实际上只由一个用户运行的实用程序(至少现在是这样)。
    • 其次,smtplib 并不是一个真正的选择,因为这是一个企业环境。这是一个在用户桌面上运行的小型实用程序,没有我们可以访问的内部 SMTP 服务器,而且由于公司代理/防火墙,我们也无法访问外部服务器(我们不应该这样做任何一个)。除了使用 SMTP 服务器之外,没有干净的方法吗?您的最后一个选项看起来很有趣,只是不知道如何实现它。
    • @victorhooi:如果不是 SMTP,您的用户使用什么来发送电子邮件? (电子邮件客户端是如何配置的?)至于最后一个选项,编写一个自定义模块:因为实际上只有一个电子邮件客户端需要支持,所以这应该不会太难。我建议您以查看webbrowser 模块的源代码为起点,看看如何构建自定义电子邮件模块。棘手的部分可能是弄清楚如何使用一些非图形命令在电子邮件客户端中打开新消息。这可能是另一个 SO 问题的好话题。
    • @David Zaslavsky:用户使用 Lotus Notes - 我认为 SMTP 服务器不会暴露给我进行直接连接,它是一家相当大的全球公司,所有这些都通过 Notes (而且我对那里的底层架构了解不多)。
    • @victorhooi:我对 Lotus Notes 一无所知,但您可以尝试在网络上搜索,看看是否可以找到有关非图形调用的一些信息。
    【解决方案2】:

    与 Python 中的常见情况一样,已经有人完成了大部分艰苦的工作。查看this recipe

    【讨论】:

      【解决方案3】:

      在下一行中,逗号后面不能有空格。

      recipients = ', '.join(email_list)
      

      此外,Outlook 需要分号,而不是逗号。除此之外,mailto 从来没有让我伤心过。

      一般提示是先在浏览器中手动测试 mailto URL,然后通过打印出来并手动输入来调试 URL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 2017-01-02
        • 1970-01-01
        相关资源
        最近更新 更多