2009-02-18 12 views
14

मेरे पास मान्य करने के लिए बड़ी संख्या में ईमेल पते हैं। शुरुआत में मैं पूरी तरह से पागल लोगों को फेंकने के लिए उन्हें रेगेक्सप के साथ पार्स करता हूं। मुझे उन लोगों के साथ छोड़ दिया गया है जो समझदार दिखते हैं लेकिन फिर भी त्रुटियां हो सकती हैं।मैं पायथन में किसी डोमेन के लिए एमएक्स रिकॉर्ड कैसे मान्य करूं?

मैं यह जानना चाहता हूं कि कौन से पते वैध डोमेन हैं, इसलिए [email protected] मुझे यह जानना है कि abcxyz.com पर ईमेल भेजना संभव है या नहीं।

मैं यह जांचना चाहता हूं कि यह वैध ए या एमएक्स रिकॉर्ड के अनुरूप है या नहीं - क्या केवल पायथन मानक लाइब्रेरी का उपयोग करके इसे करने का कोई आसान तरीका है? मैं इस सुविधा का समर्थन करने के लिए अपने प्रोजेक्ट में अतिरिक्त निर्भरता नहीं जोड़ूंगा।

+0

कडाई के साथ एक डोमेन भी एक MX रिकॉर्ड rfc2811 बिना मेल प्राप्त कर सकते हैं, खंड 5 एक रिकॉर्ड करने के लिए एक वापस आने का वर्णन मैं विचार करूँगा एक एसएमटीपी सत्र के हिस्सों के माध्यम से खेलना (ऊपर आरसीपीटी तक :) – hop

+0

@hop: मुझे फॉलबैक के बारे में पता नहीं था, संदर्भ के लिए धन्यवाद। मुझे लगता है कि आपका मतलब आरएफसी 2821 था? –

+0

2821, ज़ाहिर है! – hop

उत्तर

16

मानक लाइब्रेरी में कोई DNS इंटरफ़ेस नहीं है, इसलिए आपको या तो अपना खुद का रोल करना होगा या किसी तृतीय पक्ष लाइब्रेरी का उपयोग करना होगा।

हालांकि यह तेजी से बदलती अवधारणा नहीं है, इसलिए बाहरी पुस्तकालय स्थिर और अच्छी तरह से परीक्षण किए जाते हैं।

जिस प्रश्न का मैंने आपके प्रश्न PyDNS के समान कार्य के लिए सफल उपयोग किया है।

एक मेरी कोड के बहुत स्केच कुछ इस तरह है:

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 

एक और पुस्तकालय है कि बेहतर हो सकता है/PyDNS की तुलना में तेजी dnsmodule है, हालांकि यह तुलना में ऐसा लगता है कि 2002 के बाद से किसी भी गतिविधि नहीं पड़ा है, अगस्त 2008 में पीईडीएनएस के आखिरी अपडेट के लिए।

संपादित करें: मैं यह भी इंगित करना चाहूंगा कि ईमेल पते को रेगेक्स के साथ आसानी से पार्स नहीं किया जा सकता है। आप मानक पुस्तकालय email.utils मॉड्यूल में parseaddr() फ़ंक्शन का उपयोग करना बेहतर कर रहे हैं (उदाहरण के लिए मेरा answer to this question देखें)।

1

मानक पुस्तकालय में नहीं यह करने के लिए आसान तरीका validate_email package उपयोग करने के लिए है: आप डोमेन छिपाया जा सकता था, तीव्र परिणामों के लिए

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

ईमेल पतों की एक बड़ी संख्या (उदाहरण के लिए सूची emails कार्रवाई करने के लिए और । केवल तरह यदि डोमेन वहाँ नहीं है एक check_mx कार्य करें:।।

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) 
संबंधित मुद्दे

 संबंधित मुद्दे