SPF DKIM DMARC PTR Ayarları: Mail Spam'e Düşmesin
Kendi sunucunuzdan gönderdiğiniz e-postaların spam'e düşmemesi için dört şey birlikte doğru olmalıdır: IP adresinin PTR (reverse DNS) kaydı, alan adının SPF kaydı, giden iletilerin DKIM imzası ve bunları birbirine bağlayan DMARC politikası. Bu yazı sıfırdan kurulum anlatmak yerine, "mail gönderiyorum ama spam'e düşüyor" sorununu teşhis etmeye ve her kaydı komutla doğrulamaya odaklanır.
Örneklerde example.com alan adı, mail.example.com sunucu adı, 192.0.2.25 IPv4 ve 2001:db8::25 IPv6 adresi kullanılmıştır. Kendi değerlerinizle değiştirin.
Önce teşhis: Spam'e düşmenin nedeni nerede?
Alıcı tarafın karar verirken baktığı başlıca sinyaller şunlardır:
- Bağlantı kimliği: IP'nin PTR kaydı var mı, ileri ve geri çözümleme tutarlı mı, HELO adı mantıklı mı?
- Kimlik doğrulama: SPF, DKIM ve DMARC geçiyor mu, alan adları hizalı mı (alignment)?
- IP ve alan adı itibarı: IP bir kara listede mi, IP yeni mi, geçmişte kötüye kullanılmış mı?
- İçerik ve davranış: Şikâyet oranı, ani hacim artışı, bozuk HTML, kısaltılmış bağlantılar.
Gmail ve Yahoo, 2024'ten itibaren toplu gönderen için SPF, DKIM ve DMARC'ı zorunlu tutuyor; tek tıkla abonelikten çıkma ve düşük spam şikâyet oranı da bekleniyor. Küçük hacimli gönderiyor olsanız bile aynı kurallara uymak teslimatı belirgin biçimde iyileştirir.
En hızlı teşhis, spam'e düşen bir iletinin ham başlığına bakmaktır. Gmail'de "Orijinali göster" deyin ve şu satırı arayın:
Authentication-Results: mx.google.com;
dkim=pass header.i=@example.com header.s=s2025;
spf=pass smtp.mailfrom=example.com;
dmarc=pass (p=NONE) header.from=example.com
Üçünden biri fail, softfail ya da none ise sorun büyük olasılıkla kimlik doğrulamadadır.
1. PTR (reverse DNS) ve FCrDNS
PTR kaydı, IP adresinden alan adına giden çözümlemedir. Doğru kurgu FCrDNS (forward-confirmed reverse DNS) olarak adlandırılır:
192.0.2.25→ PTR →mail.example.commail.example.com→ A →192.0.2.25- SMTP
HELO/EHLOadı damail.example.comolmalıdır.
PTR kaydını IP bloğunun sahibi yönetir. Hizmet sağlayıcınızın IP'sini kullanıyorsanız PTR'yi onlardan tanımlatırsınız. Kendi IP bloğunuz varsa reverse DNS bölgesinin (2.0.192.in-addr.arpa gibi) size delege edilmesi gerekir. Kontrol:
dig +short -x 192.0.2.25
dig +short A mail.example.com
dig +short -x 2001:db8::25
dig +short AAAA mail.example.com
IPv6 kullanıyorsanız mutlaka IPv6 için de PTR tanımlayın. Aksi hâlde Postfix IPv6 üzerinden bağlandığında PTR eksikliği yüzünden reddedilirsiniz. IPv6 için PTR hazır değilse geçici olarak inet_protocols = ipv4 kullanabilirsiniz.
Postfix tarafında HELO adını sabitleyin:
postconf -e 'myhostname = mail.example.com'
postconf -e 'smtp_helo_name = $myhostname'
systemctl reload postfix
2. SPF kaydı
SPF, hangi IP'lerin alan adınız adına mail göndermeye yetkili olduğunu söyler. Basit bir kayıt:
example.com. IN TXT "v=spf1 ip4:192.0.2.25 ip6:2001:db8::25 mx -all"
Dikkat edilecek noktalar:
- Bir alan adında yalnızca bir SPF TXT kaydı olmalıdır. İki kayıt
permerrorüretir. - SPF değerlendirmesi en fazla 10 DNS sorgusuna izin verir (
include,a,mx,redirectsayılır). Çok sayıdainclude:zinciri bu limiti aşar. - Önce
~all(softfail) ile test edip sonra-all(hardfail) kullanabilirsiniz.+allise asla kullanılmamalıdır. - Mail gönderen üçüncü taraf servisler (bülten aracı, CRM) varsa onların
include:değerlerini ekleyin.
Kontrol:
dig +short TXT example.com | grep spf1
3. DKIM imzası (OpenDKIM ile)
DKIM, giden iletiyi özel anahtarla imzalar; alıcı da DNS'teki açık anahtarla doğrular. Debian/Ubuntu'da:
apt update
apt install opendkim opendkim-tools
mkdir -p /etc/opendkim/keys/example.com
opendkim-genkey -b 2048 -d example.com -D /etc/opendkim/keys/example.com -s s2025
chown -R opendkim:opendkim /etc/opendkim/keys
chmod 600 /etc/opendkim/keys/example.com/s2025.private
/etc/opendkim.conf içine şunları ekleyin:
Syslog yes
Canonicalization relaxed/simple
Mode sv
Domain example.com
Selector s2025
KeyFile /etc/opendkim/keys/example.com/s2025.private
Socket inet:8891@localhost
Postfix'e milter olarak bağlayın:
postconf -e 'milter_default_action = accept'
postconf -e 'milter_protocol = 6'
postconf -e 'smtpd_milters = inet:localhost:8891'
postconf -e 'non_smtpd_milters = $smtpd_milters'
systemctl restart opendkim postfix
s2025.txt dosyasındaki açık anahtarı DNS'e s2025._domainkey.example.com adıyla TXT olarak ekleyin. 2048 bit anahtar 255 karakteri aştığı için DNS panelinin değeri birden fazla tırnaklı parçaya bölmesi normaldir. Kaydı doğrulayın:
dig +short TXT s2025._domainkey.example.com
opendkim-testkey -d example.com -s s2025 -vvv
key OK çıktısı, DNS ile özel anahtarın eşleştiğini gösterir. Anahtar yenilerken yeni bir selector (ör. s2026) üretip geçişi buna göre yapmak güvenlidir.
4. DMARC politikası
DMARC, SPF veya DKIM'den en az birinin geçmesini ve From başlığındaki alan adıyla hizalı olmasını ister. Kademeli ilerleyin:
_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com; adkim=r; aspf=r"
- p=none: Hiçbir şey engellenmez, raporlar toplanır. 2-4 hafta izleyin.
- p=quarantine; pct=25: Başarısızlar spam'e yönlendirilir, oran kademeli artırılır.
- p=reject: Tüm meşru kaynaklar doğrulandıktan sonra hedef.
rua ile gelen XML raporlarını elle okumak zordur. Bir DMARC rapor çözümleyici kullanmak hangi IP'lerin adınıza mail gönderdiğini görmenizi sağlar. Raporu başka bir alan adına gönderiyorsanız, o alan adında yetkilendirme kaydı (example.com._report._dmarc...) gerekebilir.
5. Uçtan uca test
Kayıtları kurduktan sonra gerçek bir SMTP oturumuyla test edin:
# Kurulu değilse: apt install swaks
swaks --to test@gmail.com --from info@example.com \
--server mail.example.com --port 587 --tls \
--auth LOGIN --auth-user info@example.com
STARTTLS sertifikasını kontrol etmek için:
openssl s_client -starttls smtp -connect mail.example.com:587 -servername mail.example.com
Yararlı test araçları:
| Araç | Ne için? |
|---|---|
| mail-tester.com | Tek iletilik genel puan: SPF, DKIM, DMARC, içerik, kara liste |
| MXToolbox | MX, SPF, DKIM, DMARC, PTR ve kara liste sorguları |
| Google Postmaster Tools | Gmail için alan adı/IP itibarı, spam oranı, kimlik doğrulama grafikleri |
| Gmail "Orijinali göster" | Gerçek Authentication-Results çıktısı |
dig, host |
DNS kayıtlarını doğrudan doğrulama |
Kara liste kontrolünü komut satırından da yapabilirsiniz. IP'nin oktetlerini ters çevirip DNSBL'e sorarsınız:
dig +short 25.2.0.192.zen.spamhaus.org
Yanıt yoksa listede değilsiniz. Genel (public) DNS çözücüler üzerinden yapılan sorgularda bazı listeler 127.255.255.x gibi özel bir hata kodu döndürür; bu "listelendiniz" anlamına gelmez, sorguyu kendi çözücünüzden yapmanız gerekir.
Sık yapılan hatalar ve çözümleri
| Belirti | Olası neden | Çözüm |
|---|---|---|
spf=permerror |
İki SPF kaydı veya 10 sorgu limiti aşımı | Kayıtları birleştirin, include sayısını azaltın |
dkim=fail (body hash did not verify) |
İleti imzadan sonra değiştirilmiş (footer ekleyen filtre) | İmzalamayı en son adımda yapın |
dkim=neutral (no key) |
Selector adı veya DNS kaydı yanlış | dig TXT selector._domainkey.alan ile kontrol edin |
dmarc=fail ama SPF pass |
Return-Path alan adı From ile hizalı değil | Gönderen servisin özel domain/DKIM ayarını yapın |
550 5.7.25 PTR record |
IPv6 veya IPv4 için PTR yok/uyumsuz | FCrDNS'i iki IP ailesi için de tamamlayın |
| Yeni IP'den toplu gönderimde reddedilme | IP geçmişi yok, hacim ani yüksek | Günlük hacmi birkaç hafta içinde kademeli artırın (warm-up) |
Teslimat için ek öneriler
- Giden portu doğrulayın: Bazı sağlayıcılar 25. portun çıkışını kısıtlar.
nc -vz gmail-smtp-in.l.google.com 25ile bağlantıyı deneyin. - Transactional ve pazarlama maillerini ayırın: Farklı alt alan adı ve mümkünse farklı IP kullanmak, bir akıştaki şikâyetin diğerini etkilemesini önler.
- Abonelikten çıkma başlığı: Toplu iletilerde
List-UnsubscribeveList-Unsubscribe-Postekleyin. - Bounce'ları temizleyin: Geri dönen adreslere tekrar göndermeyin;
mailqve/var/log/mail.logdosyasını düzenli izleyin. - Açık relay'e izin vermeyin:
smtpd_relay_restrictionsayarını sıkı tutun, SASL kimlik doğrulamasını zorunlu kılın. - Güncel TLS: Geçerli sertifika (ör. Let's Encrypt) ve
smtp_tls_security_level = mayile gönderimde oportunistik TLS kullanın.
Altyapı tarafı: IP ve PTR üzerinde kontrol
Teslimat itibarı büyük ölçüde IP'ye bağlıdır; bu yüzden PTR'yi serbestçe ayarlayabildiğiniz ve IP geçmişini bildiğiniz bir altyapı işinizi kolaylaştırır. Kendi ASN'iniz ve IP bloğunuz varsa mail IP'lerinizi bağımsız yönetmek için BGP destekli VDS sunucular üzerinden bloğunuzu anons edebilir, reverse DNS ve itibar yönetimini kendi kontrolünüzde tutabilirsiniz. Yüksek hacimli gönderim için ayrılmış donanım gerekiyorsa fiziksel sunucu kiralama seçeneği de değerlendirilebilir.
Son olarak, DNS değişikliklerinin yayılması TTL'e bağlıdır. Test etmeden önce kayıtların yetkili ad sunucusunda göründüğünden emin olun: dig +short TXT example.com @ns1.example.com.
Sık sorulan sorular
PTR kaydı olmadan mail gönderebilir miyim?
Teknik olarak gönderebilirsiniz ama Gmail, Outlook ve birçok alıcı sunucu PTR'si olmayan ya da ileri çözümlemeyle uyuşmayan IP'lerden gelen iletileri reddeder veya spam'e atar. Kendi mail sunucunuzda PTR ve FCrDNS pratikte zorunludur.
SPF ve DKIM geçiyor ama DMARC neden başarısız oluyor?
DMARC yalnızca geçmeyi değil hizalamayı da ister. SPF'de Return-Path alan adı, DKIM'de d= alan adı, From başlığındaki alan adıyla eşleşmelidir. Üçüncü taraf servis kullanıyorsanız kendi alan adınız için DKIM imzalamasını açmanız gerekir.
DMARC'ı doğrudan p=reject ile başlatmalı mıyım?
Hayır. Önce p=none ile rapor toplayın, tüm meşru gönderim kaynaklarını belirleyin, sonra quarantine ve pct değeriyle kademeli ilerleyip en son reject'e geçin. Aksi hâlde meşru iletileriniz de engellenebilir.
Yeni bir IP'den mail göndermeye nasıl başlamalıyım?
Düşük hacimle ve etkileşimi yüksek alıcılara göndererek başlayın, hacmi birkaç hafta boyunca kademeli artırın. Google Postmaster Tools ile itibarı izleyin, bounce ve şikâyetleri düzenli temizleyin.