我正在练习使用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
这适用于开发服务器,因为我将电子邮件发送为"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 documentation确认格式,但我找不到仅选择电子邮件地址的具体方法。
谢谢!
EDIT2 (回复:森林回答)
@Forest:
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')
>>>
电子邮件后是否真的存在全名来格式化?
编辑(重新: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
答案 0 :(得分:5)
为什么不将收到的电子邮件和商店电子邮件地址与全名分开存储,而不是将To:或From:标题字段的全部内容存储为不透明字符串?见email.utils.parseaddr()
。这样,当您想要查找地址时,您不必使用复杂的慢速模式匹配。您始终可以使用formataddr()
重新组合字段。
答案 1 :(得分:0)
如果你想使用正则表达式尝试这样的事情:
>>> import re
>>> email_string = "az <az@example.com>"
>>> re.findall(r'<([^>]+)>', email_string)
['az@example.com']
请注意,上述正则表达式处理多个地址......
>>> email_string2 = "az <az@example.com>, bz <bz@example.com>"
>>> re.findall(r'<([^>]+)>', email_string2)
['az@example.com', 'bz@example.com']
但这个简单的正则表达式不会:
>>> 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'