【问题标题】:Parse mailto urls in Python在 Python 中解析邮件地址
【发布时间】:2015-07-31 04:56:17
【问题描述】:

我正在尝试将 mailto URL 解析为一个不错的对象或字典,其中包括 subjectbody 等。我似乎找不到实现这一目标的库或类 - 你知道吗?

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

【问题讨论】:

  • 使用re 模块可能是一个快速的解决方案

标签: python mailto url-parsing


【解决方案1】:

您可以使用 urlparse 和 parse_qs 来解析带有 mailto 作为方案的 url。请注意,根据scheme definition

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

【讨论】:

    【解决方案2】:

    核心 urlparse 库在 mailtos 上的表现并不出色,但可以帮助您完成一半:

    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='')
    

    编辑

    一点研究发现this thread。底线:python url 解析很烂。

    【讨论】:

    • 为什么它没有捕捉到查询部分让我失望,虽然'
    • 试过了-似乎什么也没做,只是抓住了计划
    • 它还应该对块进行 url 解码。没什么大不了的,但仍然如此。
    • urlparse() 返回正确结果见rfc3986
    • 针对该主题转到 RFC 确实很奇怪,但碰巧 urlparse 就 RFC 或其自己的文档而言甚至都不正确,因为它旨在分离查询部分 - 但是才不是。 "URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]"
    【解决方案3】:

    似乎您可能只想编写自己的函数来执行此操作。

    编辑: 这是一个示例函数(由python noob编写)。

    编辑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)
    

    【讨论】:

    • 您可能应该使用.split(sep, 1) 限制一次拆分,并保存结果而不是多次拆分。另外,您将需要urllib.unquote() 来解码查询字符串键和变量中的%xx 占位符。
    【解决方案4】:

    这是一个使用 re 模块的解决方案...

    import re
    
    d={}
    def parse_mailto(a):
      m=re.search('mailto:.+?@.+\\..+?', a)
      email=m.group()[7:-1]
      m=re.search('@.+?\\..+?\\?subject=.+?&', a)
      subject=m.group()[19:-1]
      m=re.search('&.+?=.+', a)
      body=m.group()[6:]
    
      d['email']=email
      d['subject']=subject
      d['body']=body
    

    假设它与您发布的格式相同。您可能需要进行修改以更好地满足您的需求。

    【讨论】:

      【解决方案5】:

      包括的电池:urlparse

      【讨论】:

      • 不起作用 - urlparse 结果 = ParseResult(scheme='mailto', netloc='', path='me@mail.com?subject=mysubject&body=mybody', params='', query='', fragment='') - 不读取主题/正文/等
      【解决方案6】:
      import urllib
      
      query = 'mailto:me@mail.com?subject=mysubject&body=mybody'.partition('?')[2]
      print dict((urllib.unquote(s).decode('utf-8') for s in pair.partition('=')[::2])
                 for pair in query.split('&'))
      # -> {u'body': u'mybody', u'subject': u'mysubject'}
      

      【讨论】:

      • 感谢bladerunner,这也行得通——把它给了罗伯特,因为他是第一个
      【解决方案7】:

      你应该使用这样的特殊库

      https://pypi.python.org/pypi/urlinfo

      并贡献和创建问题以使 Python 变得更好;)

      附:不使用 Robbert Peters 解决方案 bcz 它破解并且无法正常工作。同样使用正则表达式是使用super BFG Gun来获取小鸟。

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 2019-04-03
        • 2013-09-01
        • 2011-11-27
        • 2014-08-04
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        • 2014-04-09
        相关资源
        最近更新 更多