代码之家  ›  专栏  ›  技术社区  ›  Zeynel

如何在收到的电子邮件中消除电子邮件格式?

  •  0
  • Zeynel  · 技术社区  · 14 年前

    我正在练习用python用谷歌应用引擎发送电子邮件。此代码检查是否 message.sender 在数据库中:

    class ReceiveEmail(InboundMailHandler):
        def receive(self, message):
            querySender = User.all()
            querySender.filter("userEmail =", message.sender)
            senderInDatabase = None
            for match in querySender:
                senderInDatabase = match.userEmail
    

    这在开发服务器中有效,因为我将电子邮件作为 "az@example.com" message.sender="az@example.com"

    但我意识到在生产服务器中,电子邮件的格式是 "az <az@example.com> 我的代码失败了,因为现在 message.sender="az <az@example.com>" 但是数据库中的电子邮件很简单 "az@example.com".

    我在找怎么做 regex 这是可能的,但我想知道我是否可以用Python列表来实现这一点?或者,你认为实现这个结果的最好方法是什么?我只需要从 邮件.sender .

    App Engine documentation 确认格式,但我找不到仅选择电子邮件地址的特定方法。

    谢谢!

    编辑2 (回复:森林回答)

    @森林: parseaddr() 看起来很简单:

    >>> e = "az <az@example.com>"
    >>> parsed = parseaddr(e)
    >>> parsed
    ('az', 'az@example.com')
    >>> parsed[1]
    'az@example.com'
    >>>
    

    但这仍然不包括您提到的其他类型的格式: user@example.com (Full Name)

    >>> e2 = "<az@example.com> az"
    >>> parsed2 = parseaddr(e2)
    >>> parsed2
    ('', 'az@example.com')
    >>>
    

    电子邮件后面是否有全名的格式?

    编辑 (回复:亚当·伯尼尔回答)

    我试一下regex的工作原理(可能不正确):

    r    # raw string
    <     # first limit character
    (     # what is inside () is matched     
    [       # indicates a set of characters
    ^         # start of string
    >         # start with this and go backward?
    ]       # end set of characters
    +       # repeat the match
    )     # end group
    >    # end limit character
    
    2 回复  |  直到 14 年前
        1
  •  0
  •   mechanical_meat nazca    14 年前

    如果你想用 正则表达式 尝试如下操作:

    >>> import re
    >>> email_string = "az <az@example.com>"
    >>> re.findall(r'<([^>]+)>', email_string)
    ['az@example.com']
    

    请注意,上面的regex处理多个地址…

    >>> email_string2 = "az <az@example.com>, bz <bz@example.com>"
    >>> re.findall(r'<([^>]+)>', email_string2)
    ['az@example.com', 'bz@example.com']
    

    但这个更简单的regex不会:

    >>> re.findall(r'<(.*)>', email_string2)
    ['az@example.com>, bz <bz@example.com'] # matches too much
    

    使用 我想你是想说“而不是” 列表 “似乎更加复杂,例如:

    >>> email_string[email_string.find('<')+1:-1]
    'az@example.com'
    

    如果是多个:

    >>> email_strings = email_string2.split(',')
    >>> for s in email_strings:
    ...   s[s.find('<')+1:-1]
    ...
    'az@example.com'
    'bz@example.com'
    
        2
  •  5
  •   ʇsәɹoɈ    14 年前

    与其将“收件人”或“发件人”字段的全部内容存储为不透明字符串,不如分析传入电子邮件,并将电子邮件地址与全名分开存储?见 email.utils.parseaddr() . 这样,当您想查找地址时,就不必使用复杂、缓慢的模式匹配。您可以使用 formataddr() .