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

时间:2010-11-26 19:07:48

标签: 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

这适用于开发服务器,因为我将电子邮件发送为"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

2 个答案:

答案 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'