Django或python操纵电子邮件地址和域名的原因

时间:2011-10-10 12:29:24

标签: python django email email-validation

我希望能够解析电子邮件地址以隔离域部分,并测试电子邮件地址是否属于给定域。

据我所知,email模块没有这样做。除了通常的字符串处理和正则表达式例程之外,还有什么值得使用的吗?

注意:我知道如何处理python字符串。我不需要基本食谱,但欢迎使用很棒的食谱。

这里的问题主要是电子邮件地址的格式(示意图)userpart@sub\.domain\.[sld]+\.tld

在@之前剥离部件很容易;困难的部分是解析域以确定哪个部分是更大组织的域上的子域,而不是通用的二级(或者,我猜甚至更高阶)公共域。

想象一下,解析user@mail.organisation.co.uk以发现该组织的域名为organisation.co.uk,因此能够将mail.organisation.co.ukfinance.organisation.co.uk作为organisation.co.uk的子域进行匹配。

基本上有两种可能的(基于非dns的)方法:构建一个有限的自动机,它知道所有通用的sld及其与tld的关系(包括流行的'假'sld,如uk.com),或尝试猜测,基于必须有tld的知识,并假设如果有三个(或更多)元素,如果第二级域少于三个/四个字符,则它是通用的。每种方法的相对缺点应该是显而易见的。

另一种方法是查看DNS条目以确定哪些是注册域,这有其自身的缺点。

无论如何,我宁愿背驮别人的工作。

2 个答案:

答案 0 :(得分:1)

根据@ dm03514的评论,有一个python库正是这样做的:tldextract

>>> import tldextract
>>> tldextract.extract('foo@bar.baz.org.uk')
ExtractResult(subdomain='bar', domain='baz', tld='org.uk')

答案 1 :(得分:0)

使用这个简单的脚本,我们将@替换为@.,以便我们的域名终止,endswith与以相同文字结尾的域名不匹配。

def address_in_domain(address, domain):
    return address.replace('@', '@.').endswith('.' + domain)

if __name__ == '__main__':
    addresses = [
        'user1@domain.com',
        'user1@anotherdomain.com',
        'user2@org.domain.com',
    ]
    print filter(lambda address: address_in_domain(address, 'domain.com'), addresses)
    # Prints: ['user1@domain.com', 'user2@org.domain.com']