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:
root@my_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).