Python'da E-posta Adresleri Nasıl Doğrulanır
Python'da bir e-posta adresini doğrulamak kolay kısımlar için basittir, en önemli kısım için ise şaşırtıcı derecede zordur. Bu rehber, yerelde çalıştırabileceğiniz söz dizimi kontrollerini ve DNS sorgularını adım adım anlatıyor, ham SMTP yoklamalarının pratikte neden başarısız olduğunu tam olarak açıklıyor ve bir REST API ile posta kutusu düzeyinde sonucun nasıl alınacağını gösteriyor.
Hatalı biçimli girdileri reddetmek ve isteğe bağlı olarak DNS/MX kontrollerini önbelleğe almak için Python kullanın. Posta kutusu düzeyindeki sonuç için bir doğrulama API'si kullanın, çünkü ham smtplib yoklamaları kolayca kısıtlanır ve çoğu zaman belirsiz yanıtlar döndürür.
Bir E-postayı "Doğrulamak" Aslında Ne Demektir
E-posta doğrulama , bir adrese herhangi bir şey göndermeden önce adresin gerçek olduğunu ve e-posta alabildiğini teyit etme sürecidir. Her biri bir öncekinden daha zor olan bir dizi kontrole ayrılır: adres doğru biçimlendirilmiş mi, alan adı e-posta kabul ediyor mu ve o belirli posta kutusu mevcut mu. Python'da ilk ikisini iyi yapmak kolaydır. Üçüncüsü, kendi geliştirilen çözümlerin çoğunun sessizce başarısız olduğu yerdir ve bunun nedenini anlamak bu makaledeki en faydalı şeydir.
Aşağıdaki plan katmanlıdır. Açıkça bozuk girdileri elemek için ucuz ve hızlı kontrolleri yerelde çalıştırın, ardından adresin kullanılıp kullanılamayacağına dair posta kutusu düzeyindeki yanıt için bir doğrulama API'sini çağırın. Böylece anlamsız girdileri API çağrısı yapmadan anında reddeder, elemeyi geçen her şey için daha net bir sonuç alırsınız.
Adım 1: Söz Dizimi Doğrulaması
İlk kontrol, adresin doğru biçimlendirildiğini teyit eder. Bunun için bir düzenli ifade (regex) yazmak cazip gelebilir, ancak e-posta söz dizimi göründüğünden çok daha karmaşıktır ve elle yazılmış regex'ler neredeyse her zaman ya fazla katı ya da fazla gevşek olur. Bu iş için başvuru kütüphanesi şudur: email-validator. İlgili standartları doğru biçimde uygular ve üretim ortamlarında yaygın olarak kullanılır.
pip ile kurun:
pip install email-validator
Ardından bir adresi doğrulayın. Hatalı biçimli her girdide kütüphane EmailNotValidError hatası fırlatır, geçerli girdide ise normalize edilmiş bir nesne döndürür:
from email_validator import validate_email, EmailNotValidError
def check_syntax(address):
try:
result = validate_email(address, check_deliverability=False)
return True, result.normalized
except EmailNotValidError as error:
return False, str(error)
ok, value = check_syntax("jane.doe@example.com")
print(ok, value) # True jane.doe@example.com
ok, value = check_syntax("jane.doe@@example")
print(ok, value) # False, with a description of the problem
Ayar olarak check_deliverability=False kullanmak, bu adımı ağ çağrısı olmadan yalnızca söz dizimi kontrolüyle sınırlı tutar; böylece her tuş vuruşunda veya form gönderiminde çalıştırılacak kadar hızlı olur. Kullanıcının ham girdisi yerine her zaman kütüphanenin döndürdüğü normalized değerini saklayın, çünkü kütüphane adresi tutarlı depolama için standart biçime getirir.
Adım 2: Alan Adı ve MX Kontrolleri
Doğru biçimlendirilmiş bir adres, alan adı e-posta alamıyorsa yine de işe yaramaz. Sonraki kontrol, alan adının DNS kayıtlarını sorgular ve o alan adından sorumlu posta sunucularını belirten MX kayıtlarını arar. MX kaydı olmayan bir alan adı e-posta kabul edemez; dolayısıyla üzerindeki her adres hemen reddedilebilir.
Öte yandan email-validator kütüphanesi, şu parametreyi verdiğinizde bunu sizin yerinize yapabilir: check_deliverability=True; bu ayar, doğrulamanın bir parçası olarak MX sorgusunu da gerçekleştirir:
from email_validator import validate_email, EmailNotValidError
def check_domain(address):
try:
result = validate_email(address, check_deliverability=True)
return True, result.domain
except EmailNotValidError as error:
return False, str(error)
DNS sorgusunu kendiniz çalıştırmak isterseniz, örneğin aynı alan adındaki çok sayıda adres için sonuçları önbelleğe almak amacıyla, doğrudan dnspython kütüphanesini kullanın:
pip install dnspython
import dns.exception
import dns.resolver
def has_mx_record(domain):
try:
records = dns.resolver.resolve(domain, "MX")
return len(records) > 0
except (dns.resolver.NoAnswer, dns.resolver.NXDOMAIN):
return False
except dns.exception.DNSException:
return False # Treat resolver errors as inconclusive.
print(has_mx_record("gmail.com")) # True
print(has_mx_record("no-such-domain-xyz.invalid")) # False
Bu gerçekten faydalıdır. Süresi dolmuş, hiç var olmamış ya da e-posta işlemeyen alan adlarındaki adresleri eler. Ama size hâlâ neyi söylemediğine dikkat edin: someone@gmail.com adresinin gerçek bir posta kutusu olup olmadığını. Gmail'in MX kayıtları vardır; bu yüzden geçerli olsun ya da olmasın her Gmail adresi bu kontrolden geçer.
Adım 3: Posta Kutusu Kontrolü ve Ham SMTP'nin Neden Yetersiz Kaldığı
Posta kutusunun kendisini doğrulamak, alıcı posta sunucusuyla konuşmayı gerektirir. Prensipte SMTP üzerinden bağlanır, kendinizi tanıtır, hedef adresle bir RCPT TO komutu gönderir ve yanıt kodunu okursunuz: olumlu bir kod posta kutusunun var olduğunu, ret ise olmadığını düşündürür. Python'un yerleşik smtplib modülü bunu yapabilir ve kod aldatıcı derecede basit görünür:
import smtplib
import dns.resolver
def naive_smtp_check(address):
domain = address.split("@")[1]
mx_host = str(dns.resolver.resolve(domain, "MX")[0].exchange)
server = smtplib.SMTP(timeout=10)
server.connect(mx_host)
server.helo("example.com")
server.mail("probe@example.com")
code, message = server.rcpt(address)
server.quit()
# 250 and 251 generally mean the mailbox was accepted.
return code in (250, 251)
Bu bir eğitim örneğinde çalışır, üretimde ise başarısız olur. Nedenlerini ayrıntılı bilmek önemlidir, çünkü hiçbir ciddi doğrulayıcının neden böyle bir betiğe dayanmadığını açıklarlar.
IP itibarı ve kısıtlama
Posta kutusu sağlayıcıları doğrulama yoklamalarını aktif olarak tespit eder. Tek bir sunucudan birkaç RCPT TO kontrolü çalıştırın; Gmail ve Outlook gibi sağlayıcılar birkaç denemede o IP'yi kısıtlar veya engeller. Kısıtlandıktan sonra sunucu, posta kutusu var olsun ya da olmasın belirsiz yanıtlar döndürür ve sonuçlarınız anlamsız hâle gelir. Gerçek doğrulamanın düzgün ısıtılmış, iyi yönetilen geniş IP adresi havuzlarından yapılmasının nedeni tam olarak budur.
Greylisting
Birçok sunucu greylisting kullanır ve tanımadığı bir gönderici ilk kez bağlandığında bilerek geçici bir 4xx hatası döndürür. Meşru posta sunucuları daha sonra yeniden dener; spam gönderenler genellikle denemez. Yeniden denemeyen basit bir betik bu geçici hatayı ret olarak okur ve tamamen sağlam bir posta kutusunu geçersiz olarak işaretler. Bu, tamamen sabırsızlıktan kaynaklanan bir yanlış negatiftir.
Catch-all alan adları
Catch-all alan adı olası her adrese gelen e-postayı kabul eder; bu yüzden RCPT TO komutu, realperson@domain.com ve random-string-9f3a@domain.com için aynı şekilde olumlu kod döndürür. Ham bir SMTP kontrolü bu alan adlarında gerçek bir posta kutusunu var olmayandan ayıramaz. Catch-all tespiti için kesinlikle var olmayan bir adrese ikinci bir yoklama gönderip onun da kabul edilip edilmediğine bakmak gerekir; bu basit bir evet ya da hayır değil, catch-all tespitidir.
Büyük sağlayıcılardan gelen belirsiz yanıtlar
Bazı büyük sağlayıcılar RCPT TO davranışlarını bilerek belirsiz hâle getirmiştir. Bazıları el sıkışma aşamasında her adresi kabul eder ve ancak sonradan geri döndürür; dolayısıyla SMTP yanıtı sorduğunuz bilgiyi hiç taşımaz.
Bu yüzden email-validator geliştiricileri SMTP kontrollerini bilerek kütüphanenin dışında bırakır. Dokümantasyonları, bir SMTP sunucusuyla kendiniz iletişim kurmanın hiçbir kazanç sağlamadığını açıkça belirtir; çünkü sunucular bir adresin teslim edilebilir olup olmadığını açığa vurmamakta ustadır ve e-posta kabul ediyor gibi görünen bir adres daha sonra yine geri dönebilir. Dürüst çıkarım şu: Söz dizimi ve MX kontrollerini kendi kodunuzda iyi yapabilirsiniz, ancak güvenilir bir posta kutusu kontrolünü yapamazsınız.
Adım 4: VeriMails API ile Doğrulama
Pratik çözüm, posta kutusu kontrolünü bu iş için kurulmuş altyapıdan yapan bir doğrulama hizmetine bırakmak ve bu hizmeti Python'dan tek bir HTTP isteğiyle çağırmaktır. VeriMails bir REST API sunar; bu API tüm süreci çalıştırır: söz dizimi, MX, DNS, canlı SMTP el sıkışması, catch-all tespiti, tek kullanımlık adres tespiti ve rol tabanlı adres tespiti; ardından tek bir yapılandırılmış sonuç döndürür.
Standart requests kütüphanesiyle bir doğrulama çağrısı şöyle görünür. Uç nokta ayrıntıları için şuraya bakın: VeriMails API dokümantasyonu:
import requests
def verify_email(address, api_key):
response = requests.get(
"https://api.verimails.com/v1/verify",
params={"email": address},
headers={"Authorization": f"Bearer {api_key}"},
timeout=10,
)
response.raise_for_status()
return response.json()
result = verify_email("jane.doe@example.com", api_key="YOUR_API_KEY")
print(result["status"]) # e.g. "deliverable", "undeliverable", "catch_all"
print(result["disposable"]) # True if a throwaway address
print(result["role_based"]) # True for addresses such as info@ or support@
Ardından sonuca göre hareket edebilirsiniz. Bir kayıt formu deliverable adresleri kabul edebilir, undeliverable ve disposable olanları reddedebilir ve şunlar için kendi politikasını belirleyebilir: catch_all:
def is_acceptable_for_signup(address, api_key):
result = verify_email(address, api_key)
if result["disposable"]:
return False, "Disposable addresses are not allowed."
if result["status"] == "undeliverable":
return False, "That address does not appear to exist."
return True, "Address verified."
Her çağrı net bir sonuç döndürdüğü için, kullanıcıyı bekletmeden bir form gönderiminin içinde çalıştırılacak kadar hızlıdır. Veritabanınızda zaten bulunan bir adres listesi için toplu CSV doğrulamasıyla daha uygundur, çünkü tek bir dosya yüklemek, tek adreslik uç noktayı binlerce kez döngüyle çağırmaktan çok daha verimlidir.
Bir Python uygulaması için önerilen yaklaşım iki katmanı birleştirmektir: yerel email-validator söz dizimi kontrolünü koruyarak bir kredi harcamadan önce anlamsız girdiyi anında reddedin, ardından geçen her şey için kesin teslim edilebilirlik sonucunu almak üzere API'yi çağırın. Bariz hatalar için hızlı geri bildirim, gerçek adresler için güvenilir bir karar elde edersiniz.
Uygulama politikası tablosu
| Sonuç | Kayıt politikası | İçe aktarma veya CRM politikası |
|---|---|---|
deliverable | Kabul edin ve normalize edilmiş adresi saklayın | Aktif segmentte tutun |
undeliverable | Net bir düzeltme mesajıyla reddedin | Her kampanyadan önce engelleyin |
catch_all | Hesap riskine göre kabul edin veya inceleyin | Ayrı bir segmente alın ve temkinli gönderin |
disposable | Çoğu ürün için reddedin | Erişim listelerinden çıkarın |
role_based | Yalnızca paylaşılan gelen kutuları kabul edilebilirse izin verin | Soğuk erişimden önce inceleyin |
API çağrıları ve liste işleri
Anlık kararın önemli olduğu yerlerde API'yi kullanın: kayıt, ödeme, potansiyel müşteri formları, davetler ve hesap değişiklikleri. Binlerce adresin aynı incelemeden geçmesi gereken bir CSV dışa aktarımı, CRM temizliği veya kampanya kitlesi için toplu doğrulamayı kullanın. Her iki iş akışı da aynı engelleme kurallarını beslemelidir; böylece bir yolda reddedilen adrese daha sonra başka bir araçtan e-posta gönderilmez.
Hepsini Bir Araya Getirmek
Temiz bir uygulamanın üç katmanı vardır. Birincisi, email-validator ile söz dizimi kontrolü; ayar olarak check_deliverability=Falsekullanılır ve hatalı biçimli girdiyi reddetmek için yerelde, anında çalışır. İkincisi, API'yi çağırmadan önce ölü alan adlarını elemek isterseniz dnspython ile isteğe bağlı bir MX kontrolü; gerçi API bunu da kapsar. Üçüncüsü, kendi başınıza güvenilir şekilde yeniden üretemeyeceğiniz catch-all, tek kullanımlık ve rol tabanlı adres tespiti dahil, posta kutusu düzeyindeki sonuç için VeriMails API'sine bir çağrı.
Unutulmaması gereken şey iş bölümüdür. Söz dizimi ve DNS gerçekten Python'da sizin halledebileceğiniz işlerdir. Canlı posta kutusu kontrolü ise tek bir betiğin yönetemeyeceği IP itibarına, greylisting davranışına ve catch-all tespitine bağlıdır; standart doğrulama kütüphanesinin SMTP yoklamasını bilerek dışarıda bırakmasının nedeni de budur. Hız için yerel kontrolleri, posta kutusu düzeyinde doğrulama için bir API'yi, beklediğiniz hacme uygun planı seçmek için ise fiyatlandırma sayfası sayfasını kullanın.
Sıkça Sorulan Sorular
İlgili Makaleler
Temiz Verilerle Başlayın
Kayıtta 100 ücretsiz kredi. Kredi kartı gerekmez. Önerileri bugün uygulamaya geçirin.
Ücretsiz Başlayın