Django или python манипулируют адресами электронной почты и причинами о доменах - PullRequest
1 голос
/ 10 октября 2011

Я хочу иметь возможность анализировать адреса электронной почты, чтобы изолировать часть домена, и проверить, является ли адрес электронной почты частью данного домена.

Модуль email, насколько я могу судить, этого не делает. Есть ли что-то, что стоит использовать для этого, кроме обычных процедур обработки строк и регулярных выражений?

Примечание: Я знаю, как обращаться со строками Python. Мне не нужны базовые рецепты, хотя приветствуются удивительные рецепты.

Проблема здесь заключается в том, что адреса электронной почты имеют формат (схематически) userpart@sub\.domain\.[sld]+\.tld.

Снятие детали до @ легко; сложная часть - это анализ домена, чтобы определить, какие части являются поддоменами в домене более крупной организации, а не общие публичные домены второго уровня (или, я полагаю, даже более высокого порядка).

Представьте себе, что синтаксический анализ user@mail.organisation.co.uk обнаружил, что доменное имя организации - organisation.co.uk, и поэтому можно сопоставить mail.organisation.co.uk и finance.organisation.co.uk как субдомены organisation.co.uk.

Существует два возможных подхода (не основанных на dns): создать конечный автомат, который знает обо всех общих slds и их отношении к tld (включая популярные 'поддельные' slds, такие как uk.com), или попытаться угадать основываясь на знании о том, что должно быть tld, и при условии, что если имеется три (или более) элемента, домен второго уровня является общим, если в нем меньше трех / четырех символов. Относительные недостатки каждого подхода должны быть очевидны.

Альтернатива состоит в том, чтобы просматривать записи DNS, чтобы выяснить, что является зарегистрированным доменом, который имеет свои недостатки.

В любом случае, я бы предпочел совмещать работу с другими.

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Согласно комментарию @ dm03514, есть библиотека python, которая делает именно это: tldextract :

>>> import tldextract
>>> tldextract.extract('foo@bar.baz.org.uk')
ExtractResult(subdomain='bar', domain='baz', tld='org.uk')
0 голосов
/ 10 октября 2011

С помощью этого простого сценария мы заменим @ на @., чтобы наш домен завершился, и 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...