SMTP ile gönderim
Bağlantı öncesi hazırlık
Uygulamanızdan posta kutusunun kullanıcı adı ve parolasıyla SMTP üzerinden e-posta gönderin. API anahtarları ve hesap belirteçleri SMTP için kullanılamaz.
Bağlı bir alan adında etkin bir posta kutusu oluşturun ve DNS kayıtlarının doğrulamasını tamamlayın. Kullanıcı adı, [email protected] gibi tam e-posta adresidir. E-posta hesabının değil, posta kutusunun parolasını kullanın. Örnek adresleri kendi adreslerinizle değiştirin; parola program çalışırken ekranda gösterilmeden girilir.
Sunucu, portlar ve şifreleme
Bağlı tüm alan adları için mail.adapt-mail.com kullanın. 465 portunda TLS hemen başlar; 587 portunda kimlik doğrulamadan önce STARTTLS uygulanır. Birini seçin. Sertifika doğrulamasını etkin bırakın.
Örneklerde From adresi ve SMTP zarf göndereni, posta kutusunun kullanıcı adıyla aynıdır. Gönderenin görünen adını değiştirebilirsiniz. 25 portu posta sunucuları arasındaki iletişim içindir; uygulamanızda 465 veya 587 kullanın.
SMTP_HOST = "mail.adapt-mail.com"SMTP_PORT = 465SMTP_USER = "[email protected]"SMTP_PASSWORD = "<mailbox-password>"SMTP_FROM = "[email protected]"SMTP_FROM_NAME = "Example"
465: implicit TLS587: STARTTLSPython: 465 portundan gönderim
Örnek yalnızca Python 3 standart kütüphanesini kullanır. send_mail.py olarak kaydedip python3 send_mail.py komutuyla çalıştırın. Otomatik gönderimde parolayı uygulamanızın güvenli yapılandırmasından alın; Git'e veya günlüklere kaydetmeyin.
import smtplibimport sslfrom getpass import getpassfrom email.message import EmailMessagefrom email.utils import formataddr, make_msgid, formatdate
username = "[email protected]"password = getpass("SMTP password: ")recipient = "[email protected]"
message = EmailMessage()message["From"] = formataddr(("Example", username))message["To"] = recipientmessage["Subject"] = "SMTP test"message["Date"] = formatdate(localtime=False, usegmt=True)message["Message-ID"] = make_msgid(domain=username.split("@")[1])message.set_content("Hello! This message was sent through Adapt Mail SMTP.")
with smtplib.SMTP_SSL( "mail.adapt-mail.com", 465, timeout=30, context=ssl.create_default_context(),) as smtp: smtp.login(username, password) refused = smtp.send_message( message, from_addr=username, to_addrs=[recipient], ) print("Rejected recipients:", refused)Python: 587 portuna bağlantı
STARTTLS için önceki örnekteki mesaj hazırlığını koruyun ve with smtplib.SMTP_SSL bloğunu aşağıdakiyle değiştirin. smtplib.SMTP ile parola yalnızca STARTTLS başarılı olduktan sonra gönderilir.
with smtplib.SMTP("mail.adapt-mail.com", 587, timeout=30) as smtp: smtp.ehlo() smtp.starttls(context=ssl.create_default_context()) smtp.ehlo() smtp.login(username, password) refused = smtp.send_message( message, from_addr=username, to_addrs=[recipient], ) print("Rejected recipients:", refused)HTML ve ekler
HTML sürümünü set_content sonrasında, eki ise gönderimden önce ekleyin. HTML desteklemeyen istemciler için düz metin sürümünü koruyun. Güvenilir HTML kullanın veya eklenen verilerdeki özel karakterleri kaçış dizilerine dönüştürün.
message.add_alternative( "<p>Hello! This message was sent through <strong>Adapt Mail</strong>.</p>", subtype="html",)with open("document.pdf", "rb") as attachment: message.add_attachment( attachment.read(), maintype="application", subtype="pdf", filename="document.pdf", )Sonuç, limitler ve gönderilenler
send_message işleminin başarılı olması SMTP sunucusunun mesajı kabul ettiğini gösterir; alıcının gelen kutusuna ulaştığını garanti etmez. refused sözlüğü reddedilen alıcıları içerir; tüm alıcılar reddedilirse Python SMTPRecipientsRefused hatası verir.
SMTP ve API her posta kutusu için ortak limit kullanır: kayan 60 saniyelik pencerede en fazla 30 mesaj, mesaj başına 50 alıcı ve kayan 24 saatlik pencerede 1000 alıcı; artırılmış limit etkinse 5000 alıcı. To, Cc ve Bcc alanlarındaki tüm alıcılar sayılır.
Doğrudan SMTP gönderimi, Gönderilenler klasörüne kendiliğinden kopya kaydetmez. E-posta istemcileri bunu IMAP üzerinden yapar; Adapt Mail API üzerinden gönderimde kopya ayrıca kaydedilir.
SMTP hataları
535- Kimlik doğrulama başarısız: tam adresi, posta kutusu parolasını ve posta kutusunun kullanılabilirliğini kontrol edin.
451- Gönderim limitinin aşılması dahil geçici hata. Bir süre bekleyip yeniden deneyin.
550 / 5xx- Kalıcı ret: adresleri, gönderen izinlerini ve yanıt metnini kontrol edin. 50'den fazla alıcı DATA sonrasında reddedilir. Yeniden denemeden önce nedeni giderin.
TLS / timeout- mail.adapt-mail.com adını, portu, TLS modunu ve uygulama sunucusunun dış bağlantı erişimini kontrol edin. 465 için SMTP_SSL, 587 için STARTTLS ile SMTP kullanın.
SMTP sunucusunun yanıtını tam olarak okuyun. Geçici hatalarda bekleyerek yeniden deneyin. Mesaj iletildikten sonra bağlantı kesilir ve sonuç bilinmezse körlemesine yeniden göndermeyin: SMTP'de Idempotency-Key yoktur ve tekrar denemek mükerrer mesaj oluşturabilir.