/ Nasıl Yapılır?

SMTP sunucusu kurmak

Siz de başka SMTP servislerinin gereksiz kısıtlamalarına maruz kaldıysanız ve saçma sebeplerle hesabınız askıya alınıyorsa kendi SMTP sunucunuzu kurmanızı öneriyorum. Üstelik anlattığım adımlarla max 5 dakikada hazır.

Bugün sizinle Haraka isimli yazılımı kullanacağız. Kendisi Node.js ile yazılmış. Testlere göre Postfix'ten daha performanslı olduğu söyleniyor. Ben de Postfix'ten daha avantajlı buluyorum çünkü Node.js yüklü olan tüm platformlarda çalışacaktır (Postfix gibi paket halinde kurulmuyor).

Kuruluma başlayalım. Her zamanki gibi Debian tabanlı sunucu kullanıyorum.

Debian'ın ana repo'sundaki node.js sürümü çok eski olduğundan repoyu kendimiz ekleyip kuralım.

curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
sudo apt-get install -y nodejs

Npm ile Haraka'yı ve daemon modülünü kuralım.

sudo npm install -g Haraka
sudo npm install -g daemon

* Daemon modülünü Haraka'yı arkaplanda çalıştırmak için kullanıyoruz.

Not: Örnek domain adına "bar.net" koydum. Örneklerde bu domain kullanılacak.

Şimdi ilk adım olarak Haraka servisi oluşturmak için şu komutu giriyoruz:

mkdir my_smtp
sudo haraka -i my_smtp/

"my_smtp/" isimli klasöre bakarsak şu dosyalarla karşılaşıyoruz:

[email protected]_vps:~/my_smtp# ls
config  docs package.json  plugins  queue  README

Şimdi SMTP kullanıcılarını oluşturalım. config/auth_flat_file.ini dosyasını açalım ve aşağıdaki örneğe göre düzenleyelim:

[core]
methods=PLAIN,LOGIN,CRAM-MD5
[users]
[email protected]=password123

config/host_list dosyasını şu şekilde:

bar.net

config/plugins dosyasını şu şekilde:

tls
auth/flat_file
dkim_sign

config/me dosyasını şu şekilde:

bar.net

config/smtp.ini dosyasını şu şekilde:

# listen'daki ; işaretini kaldırıyoruz ve portu 587 yapıyoruz
listen=[::0]:587
# daemon'daki ; işaretini kaldırıyoruz ve true yapıyoruz
daemonize=true

config/tls.ini dosyasını şu şekilde:

key=tls_key.pem
cert=tls_cert.pem

TLS için private ve public keyler oluşturuyoruz.

openssl req -x509 -nodes -days 2190 -newkey rsa:2048 -keyout config/tls_key.pem -out config/tls_cert.pem

E-posta sunucusu doğrulamaları için gerekli DKIM key'i oluşturmak için bu komut gerekiyor:

config/dkim/dkim_key_gen.sh bar.net

Bu komut çalıştırıldıktan sonra config/dkim klasörü içerisinde foo.net klasörü oluşacaktır.

config/dkim_sign.ini dosyasını şu şekilde ve açıklamalara göre düzeltin:

disabled=false
selector=mar2017 # <---- /config/foo.net/selector dosyasının içeriğini buraya yapıştırın.
domain=foo.net
headers_to_sign = From, Sender, Reply-To, Subject, Date, Message-ID, To, Cc, MIME-Version
dkim.private.key=dkim.private.key # <---- /config/foo.net/private dosyasının içeriğini, 
# config klasörü içerisinde oluşturduğunuz "dkim.private.key" isimli dosyaya yapıştırın.

Hepsi tamam ise Haraka'yı başlatıyoruz.

sudo haraka -c my_smtp/

Eğer hiç bir sorun ekranda görünmüyorsa SMTP sunucumuz başarıyla başlatıldı demektir.

Aşağıda SMTP sunucumuzu PHPMailer kütüphanesi ile kullanabileceğimiz örnek kodlar mevcut:

<?php
date_default_timezone_set('Etc/UTC');

require 'PHPMailer-5.2.25/PHPMailerAutoload.php';

$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPDebug = 2;
$mail->Debugoutput = 'html';
$mail->Host = 'bar.net';
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = 'password1';
$mail->setFrom('[email protected]');
$mail->addAddress('[email protected]');
$mail->Subject = 'Merhaba dunya!';
$mail->Body = 'Bu bir ornek mesajdir.';
$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);

if (!$mail->send()) {
    echo "HATA: " . $mail->ErrorInfo;
} else {
    echo "Mesaj gonderildi!";
}

Notlar:

  • SMTP kullanıcı adı ile gönderen e-posta adresi aynı olmalıdır.
  • SMTP ile e-posta gönderirken, config'de tanımladığınız domain ya da kullanıcıyı kullanınız. Aksi takdirde gönderim yapılamaz.
  • Eğer PM2 kullanarak kullanmak isterseniz, tavsiyem tüm repoyu indirin ve bir klasöre çıkartın. Ayarlamaları bu klasör içinde yaptıktan sonra haraka.js'yi PM2 ile başlatın.
  • Domaninin TXT ve SPF kaydına bu içeriği ekleyerek inbox'ı garantileyebilirsiniz: v=spf1 ip4:SUNUCU_IPSİ -all
  • PHP örneğinde, sertifikamız self-signed olduğundan TLS doğrulamasını es geçtik. (PHPMailer'da SMTPOptions ile yapabiliyoruz).
  • Daha fazla bilgi için Haraka Manual'e bakın (in English).