SMTP

Değerli arkadaşlar, merhaba! Bu yazımızda sizlere, SMTP protokolünden bahsedeceğiz.

SMTP'nin açılımı 'Simple Mail Transfer Protocol'; Türkçesi ise 'Basit Mail Aktarım Protokolü' şeklindedir. Hepimizin en az bir adet mail adresi var ve Dünya'da her gün ortalama 306 milyar adet e-mail gönderilip alınıyor. Mail yollarken 'Gönder' tuşuna bastığınızda ne olduğunu hiç düşündünüz mü? İşte SMTP; adından da anlayabileceğiniz üzere arka tarafta bu işlemleri düzenleyen şeyin ta kendisidir. Farklı e-posta istemcilerinin ve hesaplarının kolayca bilgi alışverişinde bulunmasına izin verir. Bunu, elbette belli bir kural dizisi ile yapar. 

SMTP, POP ve IMAP dediğimiz iki posta protokolünün yanı sıra en yaygın olanlardan biridir. Ayrıca e-posta göndermek için tek özel protokol de kendisidir. Outlook, Gmail, Yahoo ve Apple Mail dahil olmak üzere çoğu e-posta istemcisi bir göndericiden bir alıcıya ileti göndermek için SMTP'ye sığınır.

Elbette, SMTP'nin de bir sunucusu vardır ve doğal olarak bu sunucuya SMTP Server adını veriyoruz. Bir SMTP sunucusu e-postanın gönderilmesinden, alınmasından ve aktarılmasından sorumludur; bu işlemleri yönetmekle görevlidir. İsterseniz SMTP sunucusunun ne iş yaptığını bir örnekle kısaca açıklamaya çalışalım. Parantez içerisinde yazacaklarımı bağdaştırmaya çalışın.

Gerçek hayattaki mektuplaşmayı düşünelim. Örneğin Kahramanmaraş'tan Çanakkale'ye bir mektup yollamak istiyorsunuz. Bunu bir postaneye iletirsiniz ('gönder' butonu). Daha sonra postane bunu işler, gereken prosedürü (kurallar dizisi) uygular ve mektubu Çanakkale'ye yollar (gelen kutusu bir yeni ileti). İşte, SMTP Sunucusunun yaptığı işi basit olarak bu şekilde anlatabiliriz fakat elbette bu işlemler dakikalar içerisinde gerçekleşir; gerçek bir mektuplaşma gibi değildir :).

Şimdi, biraz daha derine inelim.

Bir SMTP Sunucusu kurulduğunda, e-posta istemcileri ona bağlanabilir ve onunla iletişim kurabilir. Kullanıcı (biz), bir e-posta iletisinde 'gönder' butonuna bastığı zaman e-posta istemcisi (gmail vb.), bunu gönderebilmesi için sunucuya bir SMTP bağlantısı (SMTP Connection) açar. SMTP bunu, TCP'den yardım alarak yapar. Yani SMTP, TCP üzerine kurulu bir protokoldür. TCP hakkında hatırlatıcı görsel:

SMTP Connection sağlandıktan sonra SMTP istemcisi, sunucuya ne yapacağını söylemek ve gönderenin e-posta adresi, alıcının e-posta adresi, e-postanın içeriği gibi verileri aktarmak için çeşitli komutlar kullanır. Burada devreye, 'Posta/Mesaj Aktarım Aracısı (MTA - Mail/Message Transfer Agent)' girer. MTA, her iki e-posta adresinin aynı etki alanından (domain) olup olmadıklarını kontrol eder (xxx@gmail.com gibi). Eğer öyleyse, e-postayı hemen gönderir ama eğer farklı domain'lere sahiplerse sunucu, alıcının etki alanını tanımlamak için Domain Name System (DNS) dediğimiz teknolojiyi kullanır ve ardından bunu, doğru sunucuya gönderir.

Şimdi, dilerseniz hemen yukarıda bahsettiğimiz 'komutlar' hakkında bir şeyler paylaşalım. Aşağıdaki komutları bir bütün ve İngilizce olarak düşünürseniz zaten her birinin ne işe yaradığını ve tümünün nasıl çalıştığını kolayca anlayabilirsiniz.

HELO/EHLO: Bu, tüm e-posta gönderme sürecini başlatmak için gereken komuttur. E-posta istemcisi bu komutla, kendini SMTP sunucusuna tanıtır. HELO komutu, konuşmanın başlangıcı olarak kabul edilir ve genelde sunucunun Domain ve IP adresiyle birlikte HELO komutu gönderilir. HELO komutunu İngilizce'deki 'Hello' yani 'Merhaba' olarak algılayabilirsiniz.

MAIL FROM: Gönderen, postanın kimden geldiğini belirten kodu paylaşır. MAIL FROM komutu, e-posta adresini ana hatlarıyla belirtir ve SMTP sunucusuna yeni bir işlemin başlamak üzere olduğunu bildirir. Buradan, sunucu her şeyi sıfırlar ve e-posta adresini kabul etmeye hazırdır. Kabul edildiğinde '250 OK' cevap kodu ile cevap verilecektir. İngilizce'de 'Mail from Cyberworm' şeklindeki bir cümlenin karşılığı 'Cyberworm'dan mail' olacaktır. Buradaki MAIL FROM komutu, göndereni temsil eder.

RCPT TO: Bu komut, e-postanın kime gönderildiğini yani alıcıyı tanımlar ve '250 OK' yanıt kodunu takip eder. Yine SMTP sunucusu aynı kod ile yanıt verir. Bu noktada farklı bir alıcının e-posta adresiyle başka bir RCPT TO komutu gönderilebilir. Bu, e-postayı kaç kişinin alacağına bağlı olarak gerektiği kadar ileri gidebilir. İngilizce'de İngilizce'deki 'Recipient to' kalıbının karşılığıdır.

DATA: Bu, istemci ile sunucu arasında veri aktarımını tetikler. Tüm mesaj içerikleri 345 yanıt koduyla yanıt verecek olan SMTP sunucusuna taşınacaktır. Mesajların içeriği sunucuya aktarılır, buradan mesajın sonunu belirtmek için tek bir satırda tek bir nokta gönderilir. Kabul edilirse ve teslimata hazırsa sunucu, bir '250 OK' kodu daha gönderir. Bu noktada mesaj, alıcılara doğru yola çıkar. Türkçe karşılığı 'Veri'dir.

QUIT: E-posta gönderildiğinde istemci, sunucuya QUIT komutunu göndererek bağlantıyı keser. Başarıyla kapatılırsa sunucu, 221 koduyla yanıt verecektir. Türkçe karşılığı 'ÇIK' şeklindedir.

RSET: Bu komut, posta işleminin iptal edilmesi gerektiğinde sunucuya gönderilir. Bağlantıyı kapatmaz ama her şeyi sıfırlar; e-posta ve ilgili taraflarla alakalı önceki tüm verileri kaldırır. RSET komutu, genellikle yanlış alıcı bilgilerini girmek gibi bir hata oluştuğunda ve işlemin yeniden başlatılması gerektiğinde kullanılır.

Aşağı, bu iletişimin kendi hazırladığımız görselini bırakıyorum. Lütfen soldan sağa olacak şekilde önce kutuların içerisini, daha sonra okların üzerinde bulunanları okuyun. Bunları yaparken her adımda, az önce bahsettiğimiz komutları tekrar okumaya çalışın; kafanıza net bir şekilde oturacaktır.

Bu komutların yanında elbette AUTH, STARTTLS gibi komutlar da vardır fakat bu blogda yer almayacaklar; dilerseniz kendi araştırmanızı yapabilirsiniz.

SMTP'deki 250, 221 ve 354 kodlarını gördük. Bununla beraber 4 ve 5 ile başlayan hata kodları da vardır. Kısaca onlardan da bahsedelim.

4.X.X (Persistent Transient Failure - Kalıcı Geçici Hata)

Bu hata kodu çeşidi, 4 rakamı ile başlar ve üç basamaklı bir sayıdır. Genelde posta sunucusunda geçici bir hata oluştuğunda gösterilir. Girilen kodu tekrarlamak, bu hatanın tekrar gösterilmesini engelleyebilir fakat bu kodlar, sunucular tarafından genellikle güvenilmeyen göndericileri uzak tutmak için kullanılır. 

5.X.X (Permanent Error - Kalıcı Hata)

Bunlar da 5 ile başlar ve üç basamaklıdır. Bu hata kodu genelde, SMTP bağlantısının kesildiğini belirtir. Bu durumda e-postayı tekrar göndermeniz durumunda sorun ortadan kalkmayacaktır.

Bu hata kodlarının detayları hakkında sizin için güzel bir site buldum, dilerseniz bakabilirsiniz: SMTP Error Codes

SMTP, 587 numaralı portu kullanır. Çok önceden Python ile yazdığım otomatik e-mail gönderici projesinde kullandığım kodlara bir bakalım. Python bilmenize gerek yok; sadece mantığı anlamanız gerekiyor. Bunun için anlayacağınız şekilde anlatacağımdan şüpheniz olmasın.

En yukarıdaki kırmızı kutu, SMTP protokolü için oluşturulmuş bir kütüphanedir (library). Bunu kullanarak çeşitli fonksiyonları kullanabiliyor, işlemlerimizi gerçekleştirebiliyoruz.

İkinci kırmızı kutuya baktığınızda bir adet gönderici, bir adet de alıcı olduğunu görüyorsunuz; az önce anlattığımız gibi.

En aşağıdaki kırmızı kutuda ise 587 sayısını görüyorsunuz. Bu, SMTP'nin kullandığı portu ifade eder. Az önce sözünü geçirdiğim STARTTLS komutunu, server.starttls() şeklinde kullandığımı; HELO/EHLO komutu için ise yine aynı şekilde bir komut kullandığımı görüyorsunuz. İhtiyacım olan şeyler bunlar; az önce anlattığım birçok şeyi şu an ekranda görüyorsunuz. Yazılım ile göstermemin sebebi, bunların gerçek hayatta da kullanılıyor olduğunu bilmenizi istememdendir. Yani anlatıp geçmek yerine aslında bunları gerçekten kullandığımızı bilin istedim.


Yayınlanma Tarihi: 2022-08-13 19:32:30

Son Düzenleme Tarihi: 2022-08-17 16:16:45