Django或Python处理电子邮件地址并推理域名

1 投票
2 回答
628 浏览
提问于 2025-04-17 04:01

我想要解析电子邮件地址,以便提取出域名部分,并测试一个电子邮件地址是否属于某个特定的域名。

根据我的了解,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):一种是构建一个有限自动机,了解所有通用的二级域名及其与顶级域名的关系(包括一些流行的“假”二级域名,比如 uk.com);另一种是根据必须存在一个顶级域名的知识来猜测,如果有三个(或更多)部分,且第二级域名的字符少于三或四个,就认为它是通用的。这两种方法各有缺点,应该很明显。

另一种选择是查看DNS条目,以确定什么是注册的域名,但这也有自己的缺点。

总之,我更愿意利用他人的工作成果。

2 个回答

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']
1

根据@dm03514的评论,有一个Python库可以完全做到这一点:tldextract

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

撰写回答