Python ile Mail Gönderimi

  • Cagri 

Bu yazıda Python ortamını kullanarak nasıl otomatik mailler atabileceğimizi göreceğiz. Python’un smtplib modülü SMTP protokolünü kullanarak e-posta göndermemize imkan sağlıyor.

Aşağıdan Python’un standart dokümantasyonunu inceleyelim.

smtplib — SMTP Protocol Client

Örneklerde genelde Gmail kullanıldığını gördüm. Fakat bu örnekte ben karşı tarafta Exchange Server kullandım. Biraz uğraştıktan sonra aşağıdaki script’i çalıştırarak mail atmam mümkün oldu.

import smtplib
from email.mime.text import MIMEText

to = '[email protected]'
sender = '[email protected]'
smtpserver = smtplib.SMTP("webmail.exampleserver.com",465)
smtpserver.set_debuglevel(1)
user = '[email protected]'
password = 'mypass323123'
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(user, password)
message = MIMEText('This is an another test message')
message['Subject'] = 'Test message'
message['From'] = sender
message['To'] = to
smtpserver.sendmail(sender, to, message.as_string())
smtpserver.close()

smtpserver.set_debuglevel(1) komutu ile logların görünmesini sağlıyoruz. Böylece loglara bakarak iletişimin nasıl sağlandığını görebileceğiz.

MIME (Multipurpose Internet Mail Extensions) daha karmaşık mailler oluşturmamıza olanak sağlayan bir internet standardı. ASCII’den başka karakter setleri eklememize, ses, video, resim gibi text olmayan eklentiler yapmamıza olanak sağlıyor. *

smtplib.SMTP() SMTP bağlantısını kapsülleyen bir bir smtp instance’ı oluşturuyor. Burada verdiğimiz host ve port parametreleri daha sonra EHLO esnasında bağlantının başlatılmasında kullanılıyor. HELO SMTP için kullanılırken, EHLO ESMTP (Enhanced SMTP) için kullanılıyor.

Port olarak 465 kullandık. 465 ve 587 portlarının ikisi de mail gönderimi için kullanılır. 465 güvenli mesaj gönderimidir. SSL encryption SMTP iletişiminden önce başlatılır. 587’yi ise standart SMTP portu olarak düşünülebilir.

EHLO komutu ile kendimizi ESMTP sunucusuna tanıtıyoruz. Daha önceden verdiğimiz hostname değişkeni burada FQDN (Fully Qualified Domain Name) olarak kullanılıyor.

Loglara bakacak olursak karşımızdaki sunucunun hello şeklinde cevap verdiğini görüyoruz.

starttls() ile SMTP bağlantısını TLS(Transport Layer Security) moduna alınıyor. Ardından gelen bütün SMTP komutları şifreleniyor.

Login ile kullanıcı adı ve parolamızla SMTP sunucusunda oturum açıyoruz. Oturumumuz açıldıktan sonra e-posta’yı yolluyoruz ve iletilmek üzere sıraya alındığını görüyoruz.

Kullanım Alanları

Peki bir script üzerinden mail atabilmek bize ne fayda sağlayacak? Benzer mailleri çokça göndermek zorunda kaldığınız durumlarla karşılaşabiliriz. Aşağıda örneğini vermiş olduğum böyle bir durumda maili otomatik hale getirmek hem bizi gereksiz zahmetten kurtarır, hem dalgınlıktan hata yapmamızı engeller. Hem de kodumuzu başka araçlarla entegre etmemize imkan sağlar.

Diyelim ki sürekli birtakım kartlar geliyor ve siz bu kartları kişilere tanımlıyorsunuz. Bunun için de bir X kişisine mail atmanız gerekiyor. Aşağıdaki gibi bir email taslağımız olsun:

Konu: Kişiye Kart Numarası Tanımlanması Talebimiz – <KartNo>

Merhabalar X Kişisi,

Ekte gönderilen <KartNo> numaralı kartın <Kişino> nolu kişiye tanımlanması konusunda yardımını bekliyoruz.

Saygılarımla,

Bir başka kullanım alanı da toplu mail gönderimi olabilir. Fakat toplu mail gönderirken biraz temkinli olmak gerekebilir. Çünkü binlerce maili tek bir adresten yollamak o mail adresinin kara listeye alınmasına neden olabilir. Gmail sunucularını kullanıyorsanız bu noktada sizi sınırlandıracaktır. Tabi ki işlerimizi kolaylaştıracağı noktada 100 kişi uygun ama 1000 kişi problem yaratabilir.

Emaili bir Python Script kullanarak gönderdiğimizde alışılmış client yapısını kullanmıyoruz. Bu nedenle engellerle veya gönderiminin güvensiz olarak etiketlenmesi gibi durumlarla karşılaşmamız mümkün.

Yazıyı oluştururken aşağıdaki dökümanı kullandım oldukça faydalı buldum:

Real Python – Sending Emails With Python

Ek olarak Microsoft Exchange’de kullanılan Autodiscover servisi hakkında:

Microsoft Exchange Autodiscover Servisi ve Multi-tenancy

Umarım faydalı olmuştur. Bir sonraki yazıda görüşmek dileğiyle.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir