Python - 使用mailto打开默认邮件客户端,具有多个收件人

时间:2010-06-17 06:37:37

标签: python email

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

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

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

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

无论如何,我发现了以下两个网站:

似乎建议使用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'))
                    )

有什么建议吗?

干杯, 维克多

3 个答案:

答案 0 :(得分:3)

好吧,既然你提出了建议:忘记mailto:方案和webbrowser,并使用Python的smtplib模块编写一个小型SMTP客户端。它是标准的,完全支持所有系统,并且文档中包含一个示例,您几乎可以将这些部分复制粘贴。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在以下行中,逗号后面不应有空格。

recipients = ', '.join(email_list)

此外,Outlook需要分号,而不是逗号。除此之外,mailto从未让我感到悲伤。

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