2009-02-18 33 views
14

Tôi có một số lượng lớn địa chỉ email để xác thực. Ban đầu tôi phân tích chúng với một regexp để ném ra những cái hoàn toàn điên rồ. Tôi còn lại với những cái nhìn hợp lý nhưng vẫn có thể có lỗi.Làm cách nào để xác thực bản ghi MX cho tên miền trong python?

Tôi muốn tìm địa chỉ nào có tên miền hợp lệ, vì vậy hãy cho [email protected] Tôi muốn biết liệu thậm chí có thể gửi email đến abcxyz.com hay không.

Tôi muốn kiểm tra xem nó có tương ứng với bản ghi A hoặc MX hợp lệ không - có cách nào dễ dàng để làm điều đó bằng cách sử dụng thư viện chuẩn của Python không? Tôi không muốn thêm phụ thuộc bổ sung vào dự án của tôi chỉ để hỗ trợ tính năng này.

+0

nói đúng, một miền có thể nhận mail ngay cả khi không một rfc2811 bản ghi MX, phần 5 mô tả một fallback đến A hồ sơ tôi muốn xem xét chơi qua các phần của phiên smtp (lên cho đến RCPT TO :) – hop

+0

@hop: tôi không biết về dự phòng, cảm ơn bạn đã tham khảo. Tôi nghĩ bạn có nghĩa là RFC 2821? –

+0

2821, tất nhiên! – hop

Trả lời

16

Không có giao diện DNS trong thư viện chuẩn, do đó bạn sẽ phải cuộn thư viện của riêng mình hoặc sử dụng thư viện của bên thứ ba.

Mặc dù đây không phải là một khái niệm thay đổi nhanh, vì vậy các thư viện bên ngoài ổn định và được kiểm tra tốt.

Tôi đã sử dụng thành công cho cùng một nhiệm vụ như câu hỏi của bạn là PyDNS.

Một phác thảo rất sơ bộ mã của tôi là một cái gì đó như thế này:

import DNS, smtplib 

DNS.DiscoverNameServers() 
mx_hosts = DNS.mxlookup(hostname) 

# Just doing the mxlookup might be enough for you, 
# but do something like this to test for SMTP server 
for mx in mx_hosts: 
    smtp = smtplib.SMTP() 
    #.. if this doesn't raise an exception it is a valid MX host... 
    try: 
     smtp.connect(mx[1]) 
    except smtplib.SMTPConnectError: 
     continue # try the next MX server in list 

thư viện khác mà có thể được tốt hơn/nhanh hơn PyDNS là dnsmodule mặc dù nó có vẻ như nó đã không có bất kỳ hoạt động từ năm 2002, so sang bản cập nhật mới nhất của PyDNS vào tháng 8 năm 2008.

Chỉnh sửa: Tôi cũng muốn chỉ ra rằng địa chỉ email không thể dễ dàng được phân tích cú pháp bằng regexp. Bạn nên sử dụng hàm parseaddr() trong mô-đun email.utils thư viện chuẩn (xem ví dụ của tôi answer to this question).

1

Cách đơn giản để làm được điều này KHÔNG trong thư viện chuẩn là sử dụng validate_email package:

from validate_email import validate_email 
is_valid = validate_email('[email protected]', check_mx=True) 

Để có kết quả nhanh hơn để xử lý một số lượng lớn các địa chỉ email (ví dụ như danh sách emails, bạn có thể giấu các lĩnh vực và chỉ làm một check_mx nếu tên miền không phải là có cái gì đó như:...

emails = ["[email protected]", "[email protected]_domain", "[email protected]", ...] 
verified_domains = set() 
for email in emails: 
    domain = email.split("@")[-1] 
    domain_verified = domain in verified_domains 
    is_valid = validate_email(email, check_mx=not domain_verified) 
    if is_valid: 
     verified_domains.add(domain) 
Các vấn đề liên quan