Python - 使用mailto打开默认邮件客户端,支持多个收件人
我正在尝试写一个Python函数,用来给一组用户发送邮件,使用的是默认的邮件客户端。我想打开邮件客户端,让用户有机会编辑用户列表或者邮件内容。
我查了一下,发现这里提到:
http://www.sightspecific.com/~mosh/WWW_FAQ/multrec.html
似乎在RFC规范中,不允许在mailto链接中放多个用逗号分隔的收件人。不过,大家似乎都是这么做的。现在对此的现代看法是什么呢?
无论如何,我找到了以下两个网站:
- http://2ality.blogspot.com/2009/02/generate-emails-with-mailto-urls-and.html
- http://www.megasolutions.net/python/invoke-users-standard-mail-client-64348.aspx
这些网站似乎建议使用urllib.parse(对我来说是url.parse.quote)和webbrowser.open来解决这个问题。
我试了第一个链接(2ality.blogspot.com)里的示例代码,结果很好,成功打开了我的默认邮件客户端。但是,当我在自己的模块中使用这段代码时,奇怪的是它却打开了我的默认浏览器。地址栏里没有奇怪的文字,它只是打开了浏览器。
email_incorrect_phone_numbers()函数在Employees类中,这个类包含一个员工对象的字典(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'))
)
有什么建议吗?
谢谢,
Victor
3 个回答
在下面这行代码中,逗号后面不应该有空格。
recipients = ', '.join(email_list)
而且,Outlook需要用分号,而不是逗号。除此之外,mailto这个功能一直都没让我遇到麻烦。
一般来说,建议先在浏览器中手动测试mailto链接,然后通过打印出来的方式来调试这些链接,再手动输入。
在Python中,很多时候别人已经帮我们做了大部分的工作。你可以看看这个链接,里面有个很不错的例子。
好吧,既然你在寻求建议:忘掉 mailto:
方案和 webbrowser
模块吧,试着用 Python 的 smtplib 模块写一个小的 SMTP 客户端。这是标准的,所有系统都支持,而且文档里有示例,你几乎可以直接复制粘贴一些代码。
当然,如果你使用 smtplib
,你需要向用户询问 SMTP 服务器的详细信息(比如主机名和端口,可能还需要登录名和密码)。这确实有点麻烦,所以我能理解你想要依赖系统上现有的程序来处理邮件的原因。问题是,没有一种方法可以在所有系统上都适用。即使是 webbrowser
模块也不是在所有地方都能用;有些人使用的系统上,这个模块无法检测到默认(或任何)浏览器,即使它能检测到,当你提供一个 mailto:
链接时,最终的处理还是取决于浏览器。
如果你不想或者不能使用 SMTP,你可以考虑写一个自定义模块,尽量检测并打开尽可能多种不同系统上的默认邮件客户端——基本上就是 webbrowser
模块做的事情,只不过是针对邮件客户端而不是浏览器。在这种情况下,你需要识别用户安装了哪些邮件客户端,并确保你的模块支持它们。如果你做得够细致,可能还可以把你的模块发布到 PyPI(Python 包索引),甚至有机会让它包含在未来的 Python 标准库版本中——我相信会有很多人会喜欢这样的东西。