在Python中解析mailto URL

3 投票
8 回答
2955 浏览
提问于 2025-04-17 11:58

我正在尝试把mailto链接解析成一个好用的对象或者字典,这个对象里包括subject(主题)、body(正文)等等。我找不到能做到这一点的库或者类,你知道有什么吗?

mailto:me@mail.com?subject=mysubject&body=mybody

8 个回答

2

核心的 urlparse 库在处理 mailto 链接时表现得不太好,但至少能帮你完成一部分工作:

In [3]: from urlparse import urlparse

In [4]: urlparse("mailto:me@mail.com?subject=mysubject&body=mybody")
Out[4]: ParseResult(scheme='mailto', netloc='', path='me@mail.com?subject=mysubject&body=mybody', params='', query='', fragment='')

编辑

稍微查了一下,发现了 这个讨论。总结一下:Python 的 URL 解析功能不太给力。

4

你可以使用urlparse和parse_qs来解析以mailto开头的链接。不过要注意,根据方案定义

mailto:me@mail.com,you@mail.com?subject=mysubject

是和下面这个完全一样的

mailto:?to=me@mail.com&to=you@mail.com&subject=mysubject

这里有一个例子:

from urlparse import urlparse, parse_qs
from email.message import Message

url = 'mailto:me@mail.com?subject=mysubject&body=mybody&to=you@mail.com'
msg = Message()
parsed_url = urlparse(url)

header = parse_qs(parsed_url.query)
header['to'] = header.get('to', []) + parsed_url.path.split(',')

for k,v in header.iteritems():
    msg[k] = ', '.join(v)

print msg.as_string()

# Will print:
# body: mybody
# to: me@mail.com, you@mail.com
# subject: mysubject
1

看起来你可能只想自己写一个函数来实现这个功能。

补充:这里有一个示例函数(由一个Python新手写的)。

补充2,根据反馈进行了整理:

from urllib import unquote
test_mailto = 'mailto:me@mail.com?subject=mysubject&body=mybody'

def parse_mailto(mailto):
   result = dict()
   colon_split = mailto.split(':',1)
   quest_split = colon_split[1].split('?',1)
   result['email'] = quest_split[0]

   for pair in quest_split[1].split('&'):
      name = unquote(pair.split('=')[0])
      value = unquote(pair.split('=')[1])
      result[name] = value

   return result

print parse_mailto(test_mailto)

撰写回答