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

Zey*_*nel 0 python regex google-app-engine

我正在练习使用Python发送带有Google App Engine的电子邮件.此代码检查是否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
Run Code Online (Sandbox Code Playgroud)

这适用于开发服务器,因为我发送电子邮件为"az@example.com"message.sender="az@example.com"

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

我搜索了如何使用regex它并且它是可能的,但我想知道我是否可以使用Python列表执行此操作?或者,您认为实现这一结果的最佳方式是什么?我只需要从中获取电子邮件地址message.sender.

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

谢谢!

EDIT2(回复:森林回答)

@Forest: parseaddr()看起来很简单:

>>> e = "az <az@example.com>"
>>> parsed = parseaddr(e)
>>> parsed
('az', 'az@example.com')
>>> parsed[1]
'az@example.com'
>>>
Run Code Online (Sandbox Code Playgroud)

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

>>> e2 = "<az@example.com> az"
>>> parsed2 = parseaddr(e2)
>>> parsed2
('', 'az@example.com')
>>>
Run Code Online (Sandbox Code Playgroud)

真的有一种格式,电子邮件后面会出现全名吗?

编辑(重新:Adam Bernier回答)

我尝试正则表达式如何工作(可能不正确):

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
Run Code Online (Sandbox Code Playgroud)

ʇsә*_*ɹoɈ 5

而不是将To:或From:标题字段的全部内容存储为不透明字符串,为什么不分析传入的电子邮件和存储电子邮件地址与全名?见email.utils.parseaddr().这样,当您想要查找地址时,您不必使用复杂的慢速模式匹配.您始终可以使用重新组合字段formataddr().