- Python ile otomatik e-posta gönderme nasıl çalışır?
- Gerekli parçalar: sunucu, kimlik doğrulama ve güvenlik
- İlk e-postayı göndermek: örnek betik
- Örnek senaryo: zamanlanmış satış özeti ve hata bildirimi
- E-posta betiklerinde güvenlik ve teslim hataları
- E-posta otomasyonunda öğrenme sırası
- Rapor ve bildirim dağıtan ekipler için Mindset bağlamı
- Sık sorulan sorular
Python Betikleriyle Otomatik E-posta ve Bildirim Göndermek
Python ile SMTP üzerinden e-posta, ek ve rapor gönderme: gerekli parçalar, güvenlik, adım adım yöntem, örnek senaryo ve sık yapılan hatalar.
Python ile otomatik e-posta gönderme nasıl çalışır?
E-posta, istemci ile posta sunucusu arasında SMTP adı verilen protokolle iletilir. Python'un standart kütüphanesindeki smtplib modülü bu protokolü konuşan bir istemcidir; email paketi ise iletinin kendisini (konu, gönderen, alıcı, metin, ek) hazırlamak için kullanılır. Yani ek paket kurmadan, yalnızca standart kütüphaneyle e-posta gönderebilirsiniz.
Akış kısaca şöyledir: Önce ileti nesnesi oluşturulur ve konu, gönderen, alıcı alanları doldurulur. Ardından gövde metni eklenir; isterseniz HTML sürümü de verilebilir. Sonra posta sunucusuna bağlanılır, bağlantı şifrelenir, kimlik doğrulaması yapılır ve ileti gönderilir. Bağlantı kapatıldığında iş tamamdır.
Otomatik e-posta gönderiminin tipik kullanım alanları şunlardır: • Zamanlanmış raporların (günlük satış özeti, haftalık stok durumu) ilgili kişilere iletilmesi • Bir betik hata verdiğinde ya da bitirdiğinde bildirim gönderilmesi • Müşteri listesindeki her kişiye kendi adıyla kişiselleştirilmiş bilgilendirme gönderilmesi • Üretilen belgelerin (PDF fatura, Word teklif) ek olarak dağıtılması
Toplu pazarlama gönderimleri bu teknikle yapılabilecek işlerden değildir; onlar için izin yönetimi ve çıkış bağlantısı sunan özel e-posta platformları kullanılmalıdır. Python ile gönderim, operasyonel ve bildirim amaçlı iletiler için uygundur.
Gerekli parçalar: sunucu, kimlik doğrulama ve güvenlik
Betik yazmadan önce hangi posta sunucusunu kullanacağınızı belirlemeniz gerekir. Kurumsal e-posta hizmetinizin SMTP sunucu adresini, şifreleme yöntemini ve hesabınıza izin verilip verilmediğini BT biriminizden ya da hizmet sağlayıcının dokümantasyonundan öğrenin. Birçok sağlayıcı normal hesap şifresi yerine uygulama şifresi ya da özel bir kimlik doğrulama yöntemi ister; kurumsal hesaplarda ise ek güvenlik katmanları nedeniyle SMTP erişimi kapalı olabilir.
Bağlantının mutlaka şifreli kurulması gerekir. smtplib hem baştan şifreli bağlantıyı hem de bağlantı kurulduktan sonra şifrelemeye geçişi destekler; sağlayıcınızın hangisini beklediği dokümantasyonda yazar.
En önemli kural, şifreyi koda yazmamaktır. Kimlik bilgileri ortam değişkenlerinde ya da bir gizli bilgi yöneticisinde tutulmalı, kod depoya gönderildiğinde bu bilgilerin sızmaması sağlanmalıdır. Betik başka bir bilgisayara taşındığında bilgiler yeniden tanımlanır, kod değişmez.
Üçüncü bir seçenek, doğrudan SMTP yerine bir e-posta gönderim servisinin programatik arayüzünü kullanmaktır. Bu yaklaşım teslim edilebilirlik, gönderim kaydı ve hata yönetimi konularında SMTP'den daha fazla görünürlük sağlar; yüksek hacimli ya da kritik iletilerde tercih edilir.
İlk e-postayı göndermek: örnek betik
Önce kendi adresinize bir deneme iletisi gönderin; kimseye yanlışlıkla ileti gitmesin. Şu betik konu ve gövde ekler, dosyayı ek olarak iliştirir, sunucu bilgilerini ortam değişkenlerinden okur:
import os import smtplib from email.message import EmailMessage from pathlib import Path
ileti = EmailMessage() ileti["Subject"] = "Günlük satış özeti" ileti["From"] = os.environ["POSTA_GONDEREN"] ileti["To"] = "[email protected]" ileti.set_content("Merhaba, günlük özet ekte.") rapor = Path("rapor.docx") ileti.add_attachment(rapor.read_bytes(), maintype="application", subtype="vnd.openxmlformats-officedocument.wordprocessingml.document", filename=rapor.name)
with smtplib.SMTP_SSL(os.environ["SMTP_SUNUCU"]) as sunucu: sunucu.login(os.environ["SMTP_KULLANICI"], os.environ["SMTP_SIFRE"]) sunucu.send_message(ileti)
HTML gövde istiyorsanız düz metnin ardından add_alternative ile HTML sürümü eklenir. Birden çok alıcıda kişisel adresleri gizli kopya olarak vermek, alıcıların birbirinin adresini görmesini önler; kişiselleştirilmiş gönderimde ise her alıcı için ayrı ileti hazırlanır ve ad gibi alanlar şablondan doldurulur. Sunucu adı ve şifreleme biçimi sağlayıcıya göre değişir, bu değerleri sağlayıcının dokümantasyonundan alın. Gelen kutusunda iletinin görünümünü, eki ve Türkçe karakterleri kontrol edin, gereksiz klasörüne düşüp düşmediğine bakın.
Örnek senaryo: zamanlanmış satış özeti ve hata bildirimi
Örneğin bir e-ticaret operasyon ekibi her sabah bir önceki günün sipariş özetini yöneticilere iletmek istiyor. Betik gece çalışır, siparişleri veritabanından çeker, pandas ile özet tablo hazırlar, Excel dosyası olarak kaydeder ve bunu sabah e-postayla gönderir. İleti gövdesinde kısa bir özet (toplam sipariş, öne çıkan ürün, dikkat edilmesi gereken iade) bulunur, ayrıntılar ekteki dosyadadır.
Aynı betiğe ikinci bir e-posta daha eklenir: veritabanına ulaşılamazsa ya da veri beklenenden eksik gelirse betik, rapor yerine teknik ekibe hata bildirimi gönderir. Bu bildirimde hatanın ne olduğu, hangi adımda oluştuğu ve ilgili log dosyasının yeri yazar. Böylece rapor gelmediğinde kimse sessizlikten şüphelenmek zorunda kalmaz; ya rapor gelir ya da neden gelmediğini anlatan bir uyarı.
Betik zamanlanmış görev olarak çalıştığı için gönderim anında kimse bilgisayarın başında değildir. Bu nedenle bağlantı hatalarını yakalayıp birkaç kez yeniden denemek ve nihai başarısızlığı log dosyasına yazmak zorunludur.
E-posta betiklerinde güvenlik ve teslim hataları
E-posta otomasyonunda hataların çoğu güvenlik ve teslim edilebilirlik konularında yaşanır:
- Şifreyi kod içine yazmak. Kod paylaşıldığında hesabın ele geçirilmesi riski doğar. Ortam değişkeni kullanın.
- Şifrelenmemiş bağlantıyla göndermek. Kimlik bilgileri ve içerik ağda açık dolaşır.
- Test sırasında gerçek müşteri listesini kullanmak. Önce yalnızca kendi adreslerinizle deneyin; yanlış gönderilen bir ileti geri alınamaz.
- Çok sayıda iletiyi ard arda göndermek. Sağlayıcılar kısa sürede çok ileti göndereni sınırlayabilir ya da spam sayabilir. Gönderimler arasında bekleme koyun ve sağlayıcının sınırlarına bakın.
- Gönderen adresini alan adınızla uyumlu tutmamak. Alan adı doğrulama kayıtları (SPF, DKIM) eksikse iletiler gereksiz klasörüne düşebilir.
- Hata yakalamamak. Sunucu yanıt vermediğinde betik çöker ve kimse haberdar olmaz.
- Ekleri boyut sınırına bakmadan göndermek. Büyük dosyalar reddedilir; bunun yerine paylaşım bağlantısı iletin.
Bir de içerik tarafı vardır: otomatik iletiler de bir insanın okuyacağı iletilerdir. Net bir konu satırı, kimden geldiğini belli eden bir imza ve gerektiğinde kime ulaşılacağını gösteren bir cümle, güvenilirliği artırır.
E-posta otomasyonunda öğrenme sırası
Başlangıçta amaç, kendi adresinize konu ve metin içeren basit bir ileti göndermektir. Bu aşamada smtplib ve email paketinin temel kullanımı, ortam değişkenlerinden bilgi okuma ve bağlam yöneticisi yeterlidir.
Orta düzeyde HTML gövde, ek dosya, birden çok alıcı ve şablon tabanlı kişiselleştirme eklenir. Bağlantı hatalarını yakalama ve yeniden deneme de bu aşamada öğrenilir. Ayrıca gelen kutusunu okuyan betikler (IMAP ile) yazmak, gelen faturaları otomatik klasörlemek gibi işlere kapı açar.
İleri düzeyde e-posta, tam bir iş akışının parçası olur: veri çekme, rapor üretme, gönderme, hata durumunda bildirim, yeniden deneme ve log kaydı tek bir zamanlanmış görevde birleşir. Gönderim servisi arayüzleri, kuyruk yapıları ve teslim edilebilirlik izleme bu seviyenin konularıdır.
Rapor ve bildirim dağıtan ekipler için Mindset bağlamı
Mindset kataloğundaki Python Otomasyon ile Verimlilik programının E-posta Otomasyonu ve Bildirim Sistemleri modülü bu konuya doğrudan karşılık gelir. Rapor dağıtımı ve uyarı yükü olan operasyon, finans, satış destek ve BT ekiplerinde yedekleme, rapor ve hata uyarısı gibi farklı süreçlerin aynı gönderim altyapısını kullanması, program içeriğiyle ilişkilendirilebilecek bir uygulamadır.
İlgili Mindset programı
Python Otomasyon ile Verimlilik
Sık sorulan sorular
Gmail veya Outlook hesabımla Python'dan e-posta gönderebilir miyim?
Genellikle evet, ancak sağlayıcılar güvenlik gerekçesiyle normal hesap şifresiyle SMTP girişine izin vermeyebilir. Uygulama şifresi ya da yetkilendirme tabanlı bir yöntem gerekebilir; kurumsal hesaplarda erişimi yöneticiler kısıtlamış olabilir. Güncel gereksinimleri sağlayıcının resmî dokümantasyonundan kontrol etmek en doğrusudur.
E-posta gövdesine HTML nasıl eklenir?
İleti nesnesine önce düz metin sürümünü, ardından alternatif olarak HTML sürümünü eklersiniz. E-posta istemcisi HTML'yi destekliyorsa onu gösterir, desteklemiyorsa düz metni gösterir. HTML içindeki stil ayarlarını satır içi vermek ve görselleri ek ya da barındırılan bağlantı olarak eklemek istemciler arası uyumu artırır.
Python ile gönderilen e-postalar neden spam klasörüne düşüyor?
Nedenler genellikle gönderen alan adının doğrulama kayıtlarının eksik olması, ileti içeriğinin spam desenlerine benzemesi, kısa sürede çok sayıda ileti gönderilmesi ya da gönderen adresinin kullanılan sunucuyla uyumsuz olmasıdır. Alan adı doğrulamasını kurmak ve gönderimleri yavaşlatmak sorunu çoğunlukla azaltır.
Toplu pazarlama e-postasını Python ile göndermek doğru mu?
Önerilmez. Pazarlama iletileri için alıcıdan izin alınması, abonelikten çıkma bağlantısı sunulması ve gönderim kayıtlarının tutulması gerekir; bu özellikler özel e-posta platformlarında hazırdır. Python ile gönderim, rapor, bildirim ve işlem iletisi gibi operasyonel kullanımlar için daha uygundur.
Betik çalışırken e-posta gönderilemezse ne olur?
Önlem almazsanız betik hata verip durur ve kimse haberdar olmaz. Bağlantı hatalarını yakalayıp birkaç kez yeniden denemek, nihai başarısızlığı log dosyasına yazmak ve mümkünse alternatif bir kanaldan uyarı göndermek gerekir. Kritik raporlarda gönderimin başarılı olduğunu da kayıt altına almak izlenebilirlik sağlar.