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

2024-05-12 19:42:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够解析电子邮件地址来隔离域部分,并测试电子邮件地址是否是给定域的一部分。在

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

注意:我知道如何处理python字符串。我不需要基本的食谱,尽管很棒的食谱是受欢迎的。在

这里的问题本质上是电子邮件地址的格式(示意性地)userpart@sub\.domain\.[sld]+\.tld。在

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

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

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

另一种选择是通过DNS条目来确定什么是注册域,这有其自身的缺点。在

不管怎样,我宁愿背负别人的工作。在


Tags: 模块方法子域字符串电子邮件email地址mail
2条回答

{51python的注释是^ 514的,就像^ 514的注释一样:

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

通过这个简单的脚本,我们将@替换为@.,这样我们的域就终止了,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']

相关问题 更多 >