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