Python中高级的mailto使用方法

8
我正在尝试使用Python发送带有自定义收件人、主题和正文的电子邮件。 这意味着我不想使用Python的smtp包,而是像webbrowser一样使用某些东西,因为我需要打开默认的电子邮件客户端(在我的情况下是Thunderbird)并带有上述参数。
import webbrowser
webbrowser.open("mailto:?to=aaa@email.com&subject=mysubject", new=1)

代码可以工作,但我需要从之前找到的字符串中获取收件人,从之前创建的文本文件中获取正文。

是否有任何“简单”的方法可以做到这一点,而我却找不到呢? 提前感谢您的帮助。


使用字符串连接来创建webbrowser.open()的参数。有什么问题吗? - Barmar
为什么自定义收件人、主题和浏览器意味着你必须在Web浏览器中进行操作?SMTP包可以填写这些字段。 - Barmar
我没有表达清楚,现在正在编辑帖子。 - Fabio Mancin
你是否还需要一个函数来从某个地方获取收件人并将其保存到字符串中,或者你对此没有问题,只需要一种从文本文件中获取正文的方法?如果您需要收件人的帮助,请提供更多信息。 - Fabio
好的,如果您只是使用收件人和主题的变量,我会为您编写程序的其余部分。 - Fabio
显示剩余3条评论
2个回答

11
我使用变量recipientsubject来存储相关值。只需用实际值替换单引号之间的示例文本即可。请注意保留HTML标签。
recipient = 'emailaddress'
subject = 'mysubject'

主题字段不能包含空格,因此必须使用%20 ASCII代码进行url编码

subject = subject.replace(' ', '%20')

上述函数将空格替换为“%20”,并将修改后的主题分配给同一变量,因为您可以重复使用它,在这种情况下,您确实不需要另一个变量。可以使用urllib模块进行url编码(请参见urllib.urlencode()方法),但是可以使用replace()方法来简单地完成此操作,因此您可以避免为此导入另一个模块。
现在,您需要从文本文件中加载文本并将其存储在变量中。 假设您有一个名为body.txt的文本文件:
with open('body.txt', 'r') as b:
    body = b.read()

请注意,我假定 body.txt 与你的Python脚本在同一个目录中,否则在文件名参数中你必须包含完整的绝对或相对路径,后跟文件名。
我使用了 open() 函数,并提供了2个参数:第一个是文件名,第二个是你想要打开文件的模式。你想读取文件,所以你必须以读取模式'r')打开它。一旦你打开了文件,你需要能够用一个变量来识别文件,以便对其执行一些操作。这种变量在技术上被称为句柄,在这种情况下我将其称为b
现在,要读取所有文本,你可以使用 b.read() 然后将其赋值给变量 body。(如果你想逐行读取,你会这样做:b.readline(),但在这种情况下不需要。)
请注意,我使用了 with 语句,这是打开和处理文件的首选方式,因为它会在结束时自动关闭文件,否则你就必须手动关闭它。在有了with之前,你需要像这样做:
b = open('body.txt', 'r'):
body = b.read()
b.close()

现在最好也对变量body中包含的字符串进行url编码,所以我们做与subject相同的事情:

body = body.replace(' ', '%20')

现在,是时候使用 webbrowser 模块,并将您得到的数据作为参数传递,将字符串连接起来。
webbrowser.open('mailto:?to=' + recipient + '&subject=' + subject + '&body=' + body, new=1)

显然,在使用之前,您还需要导入webbrowser模块。 为了清晰起见,我将重写整个程序,不包含注释:

import webbrowser

recipient = 'emailaddress'
subject = 'mysubject'

with open('body.txt', 'r') as b:
    body = b.read()

body = body.replace(' ', '%20')

webbrowser.open('mailto:?to=' + recipient + '&subject=' + subject + '&body=' + body, new=1)

1
非常棒的答案,解释得非常好,非常感谢您抽出时间为我写下这些! - Fabio Mancin
请问 @FabioMancin :) - Fabio
2
有没有关于如何将一个 .jpg 文件作为附件或嵌入正文的想法? - ahmedhosny
@Fabio,有没有关于如何插入附件的想法? - him229
我强烈建议使用提到的urllib.parse.urlencode()。例如,如果正文包含“&”符号,则建议的字符串替换不足以解决问题。 我甚至会进一步建议,如果有好的库可用,通常不要实现自己的编码/解码/引用/取消引用。很容易忽略一些边缘情况。由于在这种情况下它是标准Python库的一部分,因此我毫不犹豫地使用它。 - Toni Dietze

0
使用字符串拼接。
recipient = 'aaa@email.com'
subject = 'mysubject'
body = 'This is a message'
webbrowser.open("mailto:?to='+ recipient + '&subject=' + subject + "&body=" + body, new=1)

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