Kendi Send-Only SMTP Sunucumuzu Nasıl Kurarız? (Postfix, Docker, Gmail)

Ahmet Emre DEMİRŞEN
7 min readJun 25, 2023

--

Anahtar Kelimeler ve Teknolojiler: smtp, send-only, gmail, postfix, ubuntu, docker

Merhaba bu yazıda kendi yerel ortamımıza ve uzak sunucumuza bir SMTP (Simple Mail Transfer Protocol) sunucusu nasıl kurabiliriz sorusunu cevaplamaya çalışacağım. Bu örnekte kendi oluşturacağımız postfix sunucusunu kullanarak gmail hesabımızdan mail atacağız. Aşağıdaki maddeler üzerinden anlatmaya devam edeceğim:

1- SMTP ve SMTP Sunucusu Nedir?

2- Postfix Nedir?

3- Gmail Uygulama Parolası Nedir ve Nasıl Alınır?

4- Docker ortamında sunucumuzu oluşturalım.

1. SMTP ve SMTP Sunucu Nedir?

SMTP (Simple Mail Transfer Protocol): E-posta gönderme işlemi için kullanılan bir iletişim protokolüdür.

SMTP sunucusu: Bu protokolü kullanarak gelen ve giden e-postaları yönlendiren sunucudur.

SMTP sunucusu, gönderici tarafından oluşturulan e-posta iletilerini alır ve hedef sunucuya iletmek için gerekli işlemleri gerçekleştirir. İleti gönderme süreci genellikle aşağıdaki adımlardan oluşur:

  1. Gönderici, e-posta istemcisi (Outlook, Thunderbird, Gmail vs.) üzerinden bir e-posta oluşturur ve göndermek istediği alıcıya, konuya ve içeriğe sahip bir ileti yazar.
  2. E-posta istemcisi, SMTP sunucusuna bağlantı kurar ve göndermek istediği e-posta iletilerini sunucuya iletmek için SMTP protokolünü kullanır. Bağlantı genellikle TCP/IP üzerinden yapılır ve varsayılan olarak 25 numaralı port kullanılır.
  3. SMTP sunucusu, gönderenin kimliğini doğrular ve iletiyi hedef sunucuya iletmek için gerekli işlemleri gerçekleştirir. Bu işlemler arasında, alıcı adreslerini kontrol etmek, e-posta başlıklarını düzenlemek, iletiyi uygun formatta kodlamak ve hedef sunucuya iletme denemeleri yer alabilir.
  4. SMTP sunucusu, iletiyi hedef sunucuya başarılı bir şekilde ilettiğinde, ileti hedef sunucudaki alıcının posta kutusuna düşer.

SMTP sunucusu ayrıca e-posta alımı için de kullanılabilir. Bu durumda, e-posta istemcisi, POP3 (Post Office Protocol) veya IMAP (Internet Message Access Protocol) gibi protokolleri kullanarak SMTP sunucusuna bağlanarak iletileri alır.

Bu yazıda sunucumuzu e-posta alımları için konfigüre etmeyeceğiz, sadece tek yönlü gönderim(send-only) amacı ile kurulum gerçekleştireceğiz.

2. Postfix Nedir?

Detaylara inmeden kısaca “Postfix Nedir?” sorusunu cevaplayalım:

Postfix, Unix tabanlı işletim sistemlerinde kullanılan bir e-posta sunucusu yazılımıdır. Diğer bir deyişle, Postfix bir MTA (Mail Transfer Agent) olarak görev yapar ve e-postaların iletimini ve dağıtımını sağlar.

Postfix, yüksek performanslı, güvenilir, esnek ve genişletilebilir bir e-posta sunucusu olarak bilinir. Açık kaynaklı bir yazılım olup, SMTP protokolünü kullanarak e-postaları gönderme, alım ve iletim işlemlerini gerçekleştirir.

3. Gmail Uygulama Parolası Nedir ve Nasıl Alınır?

Gmail Uygulama Parolası, Gmail hesabınızı kullanarak üçüncü taraf uygulamalara veya cihazlara erişmek için kullanılan bir güvenlik özelliğidir. Gmail hesabımızda parola kullanmadan oturum açabilmemizi sağlar. Gmail Uygulama Parolası, iki faktörlü kimlik doğrulama (2FA) etkinleştirilmiş hesaplar için tasarlanmıştır. 2FA açık olmayan hesaplarda bu işlem geçerli değildir ve Uygulama Parolası alamayız.

Bu yazıda anlattığım kendi sunucumuzdan mail gönderme işlemini gmail kullanarak yapabilmemiz için gmail hesabımıza giriş yapmamız gerekecektir. Fakat 2FA açık olan bir gmail hesabına postfix sunucusu üzerinden giriş yapmamız mümkün değildir. Bu sebeple 3. taraf bir uygulama olan postfix’te gmail hesabımıza erişmek için uygulama parolasını kullanacağız.

Uygulama parolası nasıl alınır? sorusu için ise aşağıdaki bağlantıyı kullanabilirsiniz:

Uygulama parolamızı oluşturduktan sonra 4.adım ile devam edelim.

4. Docker Ortamında SMTP Sunucumuzu Oluşturalım

Hızlıca smtp sunucusunu oluşturmaya başlayalım. Bu işlem için Docker kullanacağım, gerekli konfigürasyonları yaptığımız bu docker imajı aslında bizim için hazır bir smtp sunucu görevini gerçekleştirecek. Platformdan bağımsız olarak kullanabileceğimiz bir sunucu oluşturmuş olacağız.

Postfix’i bir ubuntu imajı üzerine kuracağız ve ihtiyacımız olan tüm ayarları bu imaj üzerinde gerçekleştireceğiz.

Aşağıdaki komut ile ubuntu imajının son versiyonunu indirebilirsiniz:

docker pull ubuntu

Fakat bu yazıda zaten bir Dockerfile kullanacağım için yukarıdaki komutu çalıştırmaya ihtiyaç duymuyorum. Hazırladığımız Dockerfile bu işlemi bizim için gerçekleştirecek. İnceleyelim:

FROM ubuntu:latest

ARG EMAIL
ARG EMAIL_PASSWORD
ARG MAIL_NAME
ARG SMTP_DOMAIN
ARG SMTP_PORT

RUN apt-get update && \
apt-get install -y mailutils && \
apt install -y postfix

COPY main.cf /etc/postfix/main.cf

RUN sh -c 'echo "root: ${EMAIL}" >> /etc/aliases' && \
sh -c 'echo "${MAIL_NAME}" >> /etc/mailname' && \
sh -c 'echo "[${SMTP_DOMAIN}]:${SMTP_PORT} ${EMAIL}:${EMAIL_PASSWORD}" >> /etc/postfix/sasl_passwd' && \
postmap /etc/postfix/sasl_passwd && \
chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

CMD service postfix restart && tail -f /dev/null

1- FROM ubuntu:latest

Bu satırda temel olarak kullanacağımız imajı belirledik. Bizim senaryomuz için ubuntu nun son versiyonunu kullanıyoruz.

2- ARG EMAIL

Burada ise konfigürasyonumuzda kullanacağımız değişkenlerin tanımını gerçekleştiriyoruz. Daha sonra oluşturacağımız docker-compose dosyasından bu değişkenlerin değerleri, imajın inşa edilmesi aşamasında gelecek.

3- RUN apt-get update

Ubuntu imajımız kurulduktan sonra içerisinde çalıştırmak istediğimiz komutları RUN ile belirteceğiz. Bu satırda update işlemi ile paketlerin güncellenme işlemini gerçekleştiriyoruz.

4- apt-get install -y mailutils && apt install -y postfix

Bu satırda smtp işlemlerimiz için gerekli paketleri sistemimize kuruyoruz. -y konfigürasyonu ile kurulum aşamasında gelecek sorulara yes cevabı vereceğimizi belirttik.

5- COPY main.cf /etc/postfix/main.cf

Bir önceki adımda postfix sistemimize yüklenmişti. Postfix kurulumundan sonra etc altında postfix ayarlarını içeren postfix isimli bir klasör oluşacak. Bu klasör içerisinde main.cf isimli, gerekli konfigürasyonları içeren bir dosya mevcut. Biz bu ayarları kendimiz oluşturacağız ve oluşturduğumuz main.cf dosyasını bu dizinde otomatik oluşturulan dosya ile değiştireceğiz. Bu satırda bu işlem gerçekleştiriliyor. (Bu adımdan sonra main.cf dosyasının içeriği gösterilecek)

6- RUN sh -c ‘echo “root: ${EMAIL}” >> /etc/aliases’

etc altındaki aliases dosyasında kullanacağımız takma isimler mevcut. Burada root değerini servis alacağımız sunucuda hizmet veren mail adresimizi yazıyoruz. Bizim durumumuz için gmail.

7- RUN sh -c ‘echo “${MAIL_NAME}” >> /etc/mailname

Bu satırda, yine etc altında bulunan ve mailname adında bir dosya oluşturuyoruz. İçerisine ise argüman olarak alacağımız MAIL_NAME değerini yazacağız.

8-sh -c ‘echo “[${SMTP_DOMAIN}]:${SMTP_PORT} ${EMAIL}:${EMAIL_PASSWORD}” >> /etc/postfix/sasl_passwd’

Kırmızı ile kapatılan kısım daha önce oluşturduğumuz uygulama parolası. Bu işlemi Dockerfile otomatik olarak gerçekleştirecektir. Bu dosyaya girip parolamızı bu şekilde yazmamıza gerek yoktur.

9- postmap /etc/postfix/sasl_passwd

Kısaca bu komutu kullanarak /etc/postfix/sasl_passwd dosyasındaki SMTP kimlik doğrulama bilgileri veritabanına dönüştürüyoruz ve Postfix, bu veritabanını kullanarak kimlik doğrulama yapabilir hale geliyor.

10- chown 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

Bu komut, /etc/postfix/sasl_passwd ve /etc/postfix/sasl_passwd.db dosyalarını “root” kullanıcısı ve “root” grubuna ait yaparak, dosyaların sadece gerekli izinlere sahip olan yetkililer tarafından erişilebilir olmasını sağlar ve sistem güvenliğini artırır.

11- CMD service postfix restart && tail -f /dev/null

Son olarak bu satırda, CMD komutu ile postfix için yaptığımız değişiklikleri aktifleştirmek için service postfix restart komutunu çalıştırıyoruz. Daha sonra tail -f /dev/null komutu ile servisimizin(container) sürekli çalışır olmasını sağlıyoruz.

main.cf dosyasının oluşturulması:

Yukarıda 5. maddede belirttiğimiz main.cf dosyası ayarları doğru bir şekilde gerçekleştirmemiz için gerekli. Bu dosyayı Dockerfile ile aynı dizinde bulunacak şekilde konumlandıracağız. main.cf isim bir dosya oluşturalım ve içerisine aşağıdaki ayarları yapıştıralım:

# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# See http://www.postfix.org/COMPATIBILITY_README.html - default to 3.6 on
# fresh installs.
compatibility_level = 3.6
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=may
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, /etc/mailname, localhost, localhost.localdomain, localhost
relayhost = [smtp.gmail.com]:587
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
inet_protocols = all
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_use_tls = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

Evet, kullanacağımız imajımızın ayarları ve main.cf dosyamız hazır. Şimdi bunu kullanabilmek için bir docker-compose dosyası oluşturalım:

version: '3.8'
services:
smtp-server:
#container_name: smtp-server
build:
context: .
args:
EMAIL: ${EMAIL}
EMAIL_PASSWORD: ${EMAIL_PASSWORD}
MAIL_NAME: ${MAIL_NAME}
SMTP_DOMAIN: ${SMTP_DOMAIN}
SMTP_PORT: ${SMTP_PORT}
ports:
- ${PORT}:25

Burada smtp-server isimli servisimizi oluşturuyoruz. Container name ve bu container’ın hangi imajı kullanarak çalışacağı bilgisini belirtiyoruz. Son olarak da args ile Dockerfile içerisinde parametrik olarak belirttiğimiz değişkenlerin tanımlamasını yaptık. Şimdi bu değişkenlerin değerlerini bir .env dosyası oluşturarak tanımlayalım:

.env:

EMAIL=gmail adresiniz
EMAIL_PASSWORD=Uygulama Parolanız
PORT=25
MAIL_NAME=aedemirsen.com (kendi mailname isminiz.)
SMTP_DOMAIN=smtp.gmail.com
SMTP_PORT=587

Son durumda çalışma klasörümüz aşağıdaki yapıda olmalı:

Gerekli tüm ayarları bu şekilde tamamlamış olduk ve artık sunucumuz çalışmaya hazır. Aşağıdaki komutu kullanarak imajımızı oluşturalım ve container ımız çalışsın:

docker-compose up -d

İmaj oluşturulup container ayağa kalktığında test için ilk e-postamızı atalım. Bunun için aşağıdaki komut ile container a giriş yapalım:

docker exec -it [container_id yada container_name] sh

Şimdi aşağıdaki komut ile dilediğiniz mail adresine e-posta gönderebilirsiniz:

echo "Bu bir test epostasıdır." | mail -s "Test" alici_mail_adresi@gmail.com

Yukarıdaki örnekte, alici_mail_adresi@gmail.com adresine konusu Test olan bir mail göndermiş olduk. Burada dilediğiniz mail adresine mail gönderebilirsiniz. Smtp sunucumuz Gmail istemcisini ve protokollerini kullanarak kendi gmail adresimiz üzerinden e-posta gönderim işlemini yapacaktır. 25 portunda çalışan bu sunucuyu farklı uygulamalar üzerinden de erişerek mail gönderme işlemlerimizi halledebiliriz.

Tüm config dosyalarına aşağıdaki github reposundan ulaşabilirsiniz:

İyi Çalışmalar.

--

--