Güvenlik & SSL

    Sunucumdan Spam Mail Gidiyor: Kaynağı Nasıl Bulurum?

    Mail kuyruğundan spam'in hangi hesap, form ya da zararlı scriptten çıktığını tespit edip kaynağı kapatmayı anlatır.

    12 dk okuma Güncellendi: 11 Ağustos 2026

    Sabaha karşı gelen e-posta hep aynı cümleyle başlar: "Hesabınızdan yoğun spam gönderimi tespit edilmiştir, hesabınız askıya alınmıştır." Siteniz kapalı, e-postalarınız çalışmıyor, kuyrukta binlerce mesaj var ve bunların hiçbirini siz göndermediniz. "Sitemden spam mail gidiyor" diye arama yapan herkesin ortak sorunu aslında tek bir soruya iniyor: bu mesajları kim üretiyor? Kuyruğu silmek beş saniye sürer ama kaynağı kapatmadığınız için ertesi sabah aynı e-postayı yeniden alırsınız.

    Bu yazıda kuyruğun nasıl okunacağını, bir spam mesajının başlıklarından gönderen scriptin tam dosya yolunun nasıl çıkarılacağını, exim ve postfix loglarında ele geçirilmiş bir e-posta hesabının nasıl tespit edileceğini ve kaynak kapatıldıktan sonra sunucu itibarının nasıl toparlanacağını anlatacağım. Türkçe içeriklerin çoğu konuyu "blacklist nedir" tarafından, yani sonucundan anlatıyor; oysa asıl iş kuyruğun içindeki tek bir mesajın başlıklarını okumakla başlıyor. O başlıkta genelde suçlunun adresi yazılı durur.

    Spam Çıkışının İlk Belirtileri#

    Spam çıkışı çoğu zaman siz fark etmeden önce sistem tarafından fark edilir. Tipik belirtiler:

    • Sağlayıcıdan gelen askıya alma veya uyarı bildirimi
    • Kuyrukta binlerce, hatta on binlerce bekleyen mesaj
    • Sunucu yükünün ve disk kullanımının anlamsız biçimde artması (kuyruk dosyaları disk yer)
    • Gönderdiğiniz normal e-postaların karşı tarafa hiç ulaşmaması ya da doğrudan spam'e düşmesi
    • Hiç göndermediğiniz adreslerden gelen "teslim edilemedi" (bounce) mesajlarının kutunuzu doldurması — buna geri saçılma (backscatter) denir ve neredeyse her zaman sunucunuzdan spam çıktığının işaretidir

    Kuyruğun büyüklüğünü ölçmek tek komutluk iştir:

    # Exim (cPanel/WHM sunucularında standart)
    exim -bpc
    
    # Postfix
    postqueue -p | tail -1
    

    exim -bpc size 40.000 gibi bir sayı döndürüyorsa teşhis zaten konmuştur. Şimdi asıl soru: bu mesajlar nereden çıkıyor?

    Kaynak Üç Başlıktan Birindedir#

    Yıllardır gördüğüm her spam çıkışı olayı şu üç kategoriden birine giriyor. Doğru kategoriyi bulmak, doğru komutu çalıştırmaktan daha önemlidir:

    KaynakNasıl çalışırLogdaki imzaÇözüm
    Ele geçirilmiş e-posta hesabıSaldırgan çalınan parolayla SMTP'ye kimlik doğrulayıp gönderirA=dovecot_login:[email protected]Parola değiştir, oturumları kes, 2FA
    Zararlı PHP scriptiSitedeki arka kapı doğrudan mail() çağırırcwd=/home/kullanici/public_html/... ve X-PHP-ScriptDosyayı sil, arka kapı avı yap
    Güvensiz iletişim formuForm, To/Cc başlığını kullanıcı girdisinden alıyorAynı script yolu, ama dosya meşruFormu düzelt veya kapat

    Bu üçünü ayırt etmenin yolu kuyruktaki bir mesajı açıp başlıklarına bakmaktır. Şimdi tam olarak bunu yapacağız.

    Adım 1: Kuyruktaki Bir Mesajı Açıp Başlıklarını Okuyun#

    Önce kuyruktan bir mesaj kimliği alın:

    # Kuyruktaki ilk 10 mesajın kimliği
    exiqgrep -i | head -10
    
    # Örnek çıktı
    # 1uKcH2-0004Xy-9A
    

    Şimdi o mesajın başlıklarını okuyun — bu, tüm sürecin en önemli komutudur:

    exim -Mvh 1uKcH2-0004Xy-9A
    

    Çıktıda aradığınız satırlar şunlardır:

    X-PHP-Script: alanadiniz.com/wp-content/uploads/2026/06/wp-cache.php for 203.0.113.44
    X-Source: /usr/bin/php
    X-Source-Args: /usr/bin/php /home/kullanici/public_html/wp-content/uploads/2026/06/wp-cache.php
    X-Source-Dir: alanadiniz.com:/wp-content/uploads/2026/06
    From: "Ödül Bildirimi" <[email protected]>
    Subject: Tebrikler, kazandiniz
    

    İşte bu. X-PHP-Script başlığı size spam'i üreten dosyanın tam yolunu, hatta scripti tetikleyen IP adresini verir. Türkçe rehberlerde neredeyse hiç geçmeyen ama olayı beş dakikada çözen bilgi budur.

    uploads klasörü altında bir PHP dosyası görüyorsanız orada meşru hiçbir şey yoktur — o bir arka kapıdır. Eğer yol wp-content/themes/tema/contact-form.php gibi meşru bir dosyayı gösteriyorsa kaynak zararlı değil, güvensiz bir formdur.

    Bu başlıklar sunucuda etkin değilse görünmezler. cPanel sunucularında WHM > Tweak Settings altındaki e-posta kaynağı izleme ayarı bunu sağlar; kapalıysa açtırın, çünkü bir sonraki olayda tek başına saatler kazandırır.

    Mesajın gövdesini de görmek isterseniz:

    exim -Mvb 1uKcH2-0004Xy-9A | head -30
    

    Adım 2: Exim Logundan Gönderen Scripti ve Hesabı Bulun#

    Tek mesaj yerine bütün resmi görmek için exim ana loguna geçin. cPanel sunucularında yol /var/log/exim_mainlog şeklindedir.

    # En çok mesaj üreten çalışma dizinleri (yani scriptler)
    grep "cwd=" /var/log/exim_mainlog | grep -oP "cwd=\K[^ ]+" | sort | uniq -c | sort -rn | head -20
    
    # Örnek çıktı
    #  38412 /home/kullanici/public_html/wp-content/uploads/2026/06
    #     94 /home/kullanici/public_html
    #     12 /root
    

    Bu tablo, spam'in hangi dizinden çıktığını doğrudan gösterir. uploads altında 38 bin mesaj varsa kaynağı buldunuz.

    Kimlik doğrulamalı gönderim, yani ele geçirilmiş bir e-posta hesabı varsa imzası farklıdır:

    # Kimlik doğrulayarak gönderen hesaplar ve mesaj sayıları
    grep "A=dovecot_login" /var/log/exim_mainlog \
      | grep -oP "A=dovecot_login:\K[^ ]+" | sort | uniq -c | sort -rn | head -20
    
    # Bu hesap hangi IP'lerden bağlanmış
    grep "A=dovecot_login:[email protected]" /var/log/exim_mainlog \
      | grep -oP "\[\K[0-9.]+(?=\])" | sort | uniq -c | sort -rn | head -20
    

    Çıktıda tanımadığınız ülkelerden onlarca IP görüyorsanız o hesabın parolası çalınmıştır. Bu senaryonun tam müdahalesi mail hesabım ele geçirildi yazısında ayrıca anlatılıyor.

    En çok gönderen adresleri ve alıcı yoğunluğunu görmek için:

    # Gönderen adreslere göre kuyruk özeti
    exim -bp | exiqsumm | head -20
    
    # Belirli bir göndericiye ait kuyruk mesajları
    exiqgrep -i -f "[email protected]" | wc -l
    

    Postfix kullanan bir sunucudaysanız komutlar değişir, mantık aynıdır:

    İşlemEximPostfix
    Kuyruk sayısıexim -bpcpostqueue -p | tail -1
    Kuyruk listesiexim -bppostqueue -p
    Mesaj başlıklarıexim -Mvh <id>postcat -q <id> | head -40
    Gönderene göre filtreexiqgrep -i -f <adres>postqueue -j | grep <adres>
    Tek mesaj silmeexim -Mrm <id>postsuper -d <id>
    Ana log/var/log/exim_mainlog/var/log/mail.log
    Kimlik doğrulamalı gönderim iziA=dovecot_login:sasl_username=

    Postfix tarafında ele geçirilmiş hesabı bulma komutu şudur:

    grep -oP "sasl_username=\K[^ ,]+" /var/log/mail.log | sort | uniq -c | sort -rn | head -20
    

    Adım 3: Zararlı Scripti Bulun ve Silin#

    X-PHP-Script başlığı veya cwd= çıktısı size dizini verdi. Şimdi o dizindeki dosyaları inceleyin:

    cd /home/kullanici/public_html/wp-content/uploads/2026/06
    ls -la *.php
    
    # İçerik kontrolü — silmeden önce bir kopyasını alın
    cp -a wp-cache.php ~/kanit-wp-cache.php
    head -c 600 wp-cache.php
    

    Tipik bir spam gönderici scriptin içeriği mail(, base64_decode(, str_rot13( ve $_POST kombinasyonu içerir. Silmeden önce kopyasını almanız, kaynağın gerçekten bu olduğunu ispatlamak için gerekir.

    Aynı zararlının kardeşleri olabilir; sunucuyu tarayın:

    cd /home/kullanici/public_html
    
    # uploads altında PHP olmamalıdır, istisnasız
    find wp-content/uploads -type f -name "*.php"
    
    # mail() çağıran şüpheli dosyalar
    grep -rln --include="*.php" -E "mail\(.*base64|base64_decode\(.*mail\(|@mail\(" . | head -20
    
    # Son 7 günde değişen PHP dosyaları
    find . -name "*.php" -mtime -7 -printf "%TY-%Tm-%Td %TH:%TM  %p\n" | sort
    

    Scripti silmek yeterli değildir. Onu sunucuya kim, nasıl yükledi sorusunu da yanıtlamanız gerekir; aksi hâlde aynı dosya birkaç saat içinde geri gelir. Arka kapı avının tam listesi — mu-plugins, .user.ini içindeki auto_prepend_file, cron görevleri, sahte yönetici hesapları — yönlendirme zararlısı temizliği yazısında adım adım anlatılıyor ve spam gönderici zararlılar için birebir geçerlidir.

    Kalıcı önlem olarak uploads altında PHP çalıştırmayı sunucu seviyesinde kapatın:

    # wp-content/uploads/.htaccess
    <FilesMatch "\.(php|php5|php7|phtml|pht)$">
      Require all denied
    </FilesMatch>
    
    location ~* ^/wp-content/uploads/.*\.php$ { deny all; }
    

    Adım 4: Güvensiz İletişim Formunu Tespit Edin#

    Bulduğunuz dosya zararlı değil, sizin kendi formunuzsa sorun kod tarafındadır. En yaygın hata, kullanıcı girdisini doğrudan e-posta başlığına koymaktır:

    // YANLIŞ — başlık enjeksiyonuna açık
    $headers = "From: " . $_POST['email'] . "\r\n";
    mail($_POST['to'], $_POST['subject'], $_POST['message'], $headers);
    

    Saldırgan email alanına satır sonu karakteri ve kendi Bcc: başlığını yazarak formu toplu spam gönderici hâline getirir. Doğrusu şudur:

    // DOĞRU — alıcı sabit, girdi doğrulanmış, başlığa girdi konmuyor
    $alici  = '[email protected]';           // asla $_POST'tan gelmez
    $eposta = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
    if (!$eposta) { http_response_code(400); exit('Geçersiz e-posta'); }
    
    $konu   = mb_substr(str_replace(["\r", "\n"], '', $_POST['subject'] ?? ''), 0, 120);
    $govde  = "Gönderen: {$eposta}\n\n" . strip_tags($_POST['message'] ?? '');
    $basliklar = "From: [email protected]\r\nReply-To: {$eposta}\r\n";
    
    mail($alici, $konu, $govde, $basliklar);
    

    Formu ayrıca hız sınırı ve bot kontrolüyle koruyun. Uzun vadede en sağlıklı çözüm, site e-postalarını mail() yerine kimlik doğrulamalı SMTP üzerinden göndermektir; hem teslimat oranı yükselir hem her gönderim bir hesaba bağlandığı için izlenebilir hâle gelir.

    Adım 5: Kuyruğu Temizleyin — Ama Sırayı Bozmadan#

    Kuyruğu kaynağı kapatmadan önce temizlemek, en sık yapılan ve en çok zaman kaybettiren hatadır: script çalışmaya devam ettiği için kuyruk dakikalar içinde yeniden dolar ve elinizde inceleyecek kanıt da kalmaz. Sıra şudur: önce bir mesajın başlıklarını oku, sonra scripti sil ya da hesabı kilitle, sonra kuyruğu temizle.

    # Belirli bir göndericiye ait mesajları silme
    exiqgrep -i -f "[email protected]" | xargs -r exim -Mrm
    
    # Belirli bir alan adına ait tüm mesajlar
    exiqgrep -i -f "@alanadiniz\.com" | xargs -r exim -Mrm
    
    # Kuyruğun tamamını silme (son çare; meşru mesajlar da gider)
    exim -bp | awk '/^ *[0-9]+[mhd]/{print $3}' | xargs -r exim -Mrm
    

    Postfix karşılığı:

    postsuper -d ALL          # tüm kuyruk
    postsuper -d ALL deferred # sadece ertelenmişler
    

    Temizlik sonrası kuyruğun yeniden dolup dolmadığını beş dakika izleyin:

    watch -n 30 exim -bpc
    

    Sayı sabit kalıyor ya da düşüyorsa kaynağı kapatmışsınızdır. Artmaya devam ediyorsa ikinci bir gönderici daha vardır; cwd= sorgusunu tekrar çalıştırın.

    Adım 6: Sunucu İtibarını Toparlayın#

    Kaynak kapandıktan sonra iş bitmez, çünkü IP adresiniz muhtemelen kara listelere girmiştir. Sırasıyla:

    1. IP'nizi ve alan adınızı sorgulayın. Hangi listelerde olduğunuzu görün ve her biri için ayrı çıkış talebi açın; süreç mail blacklist sorgulama ve çıkma yazısında ayrıntılı anlatılıyor.
    2. Kimlik doğrulama kayıtlarınızı düzeltin. SPF, DKIM ve DMARC eksikse teslimat toparlanmaz. Bu üçlünün doğru kurulumu için SPF, DKIM ve DMARC yazısını uygulayın.
    3. PTR (reverse DNS) kaydınızı kontrol edin. Gönderen IP'nin PTR kaydı yoksa veya alan adınızla uyuşmuyorsa birçok alıcı sunucu mesajı doğrudan reddeder; bu kayıt DNS panelinizden değil, IP'nin sahibi olan sağlayıcı tarafından tanımlanır.
    4. Çıkış talebi göndermeden önce temizliğin bittiğinden emin olun. Reddedilen bir delisting talebi, sonraki talebi zorlaştırır.
    5. Gönderim hacmini kademeli artırın. Uzun süre spam üreten bir IP'den aniden normal hacme dönmek, filtrelerde yeni bir alarm yaratır.

    Tekrarını Önleyecek Kalıcı Ayarlar#

    Olay kapandıktan sonra şu ayarlar aynı senaryoyu neredeyse imkânsız hâle getirir:

    1. Saatlik gönderim limiti koyun. cPanel sunucularında alan adı başına saatlik e-posta limiti tanımlanabilir; makul bir limit, bir sonraki olayda 40 bin yerine 200 mesaj çıkmasını sağlar.
    2. nobody kullanıcısının e-posta göndermesini engelleyin. Bu ayar, web sunucusu kullanıcısı üzerinden çalışan zararlı scriptlerin doğrudan gönderim yapmasını kapatır.
    3. Tüm e-posta hesaplarının parolasını yenileyin ve kullanılmayan hesapları silin. Yıllardır dokunulmamış info@, test@, admin@ hesapları en sık ele geçirilenlerdir.
    4. Panel erişimine iki faktörlü doğrulama ekleyin. Çalınmış bir parolanın tek başına işe yaramamasını sağlayan tek önlem budur.
    5. Dosya izinlerini sıkın: dizinler 755, dosyalar 644, hiçbir yerde 777 olmasın.
    6. Kuyruk büyüklüğünü izleyin. Basit bir cron, sizi sağlayıcıdan önce haberdar eder:
    # /etc/cron.d/kuyruk-izleme — 10 dakikada bir, eşik aşılırsa uyarı
    */10 * * * * root [ "$(exim -bpc)" -gt 500 ] && echo "Kuyruk: $(exim -bpc)" | mail -s "Mail kuyrugu uyarisi" [email protected]
    

    Sıkça Sorulan Sorular#

    Kuyruğu sildim ama ertesi gün yine doldu, neden#

    Çünkü kuyruk sonuçtur, kaynak değildir; gönderen script veya ele geçirilmiş hesap hâlâ çalışıyordur. Kuyruğu silmek yalnızca birikmiş mesajları temizler, mesajları üreten şeye dokunmaz. Doğru sıra önce bir mesajın başlıklarını exim -Mvh ile okuyup X-PHP-Script satırından kaynağı tespit etmek, kaynağı kapatmak ve en son kuyruğu temizlemektir. Kaynak kapandıktan sonra kuyruk sayısı düşmeye başlar ve bir daha artmaz.

    X-PHP-Script başlığını göremiyorum, ne yapmalıyım#

    Bu başlık sunucuda e-posta kaynağı izleme özelliği açık değilse eklenmez; cPanel sunucularında WHM ayarlarından etkinleştirilebilir, paylaşımlı barındırmadaysanız sağlayıcıdan açmasını isteyin. Başlık yokken de kaynağa ulaşabilirsiniz: exim ana logundaki cwd= alanı, mesajı üreten sürecin çalışma dizinini gösterir ve grep -oP "cwd=\K[^ ]+" | sort | uniq -c | sort -rn komutu en çok mesaj üreten dizini doğrudan listeler. Postfix tarafında ise sasl_username alanı, kimlik doğrulamalı gönderimlerde hesabı verir.

    Hesabım askıya alındı, önce açtırmalı mıyım#

    Hayır, önce temizliği yapın; hesap açıldığı anda spam yeniden başlarsa ikinci askıya alma gelir ve bu kez süreç çok daha uzar. Sağlayıcıdan siteyi ve e-postayı kapalı tutup size yalnızca SSH veya dosya yöneticisi erişimi vermesini isteyin. Temizlik bittiğinde hangi dosyayı sildiğinizi, hangi hesabın parolasını değiştirdiğinizi ve hangi önlemleri aldığınızı özetleyen kısa bir not iletin; bu bilgi, hesabın açılmasını belirgin şekilde hızlandırır.

    Spam mesajlarında gönderen benim adresim görünüyor, hesabım mı çalındı#

    Şart değil; gönderen adresi taklit edilmiş de olabilir. Ayrım şuradan yapılır: exim logunda o mesajların yanında A=dovecot_login:[email protected] ifadesi varsa gerçekten sizin hesabınızla kimlik doğrulaması yapılmıştır, yani parola çalınmıştır. Böyle bir ifade yoksa ve mesajlar cwd= ile bir dizinden çıkıyorsa gönderen adı sadece scriptin yazdığı bir metindir. İlk durumda parolayı hemen değiştirin ve o hesabın açık oturumlarını sonlandırın.

    Spam sadece iletişim formumdan gidiyorsa formu kapatmalı mıyım#

    Geçici olarak kapatmak makul ama kalıcı çözüm formu düzeltmektir. Alıcı adresi kod içinde sabit olmalı, kullanıcı girdisi hiçbir zaman To, Cc, Bcc veya From başlığına doğrudan yazılmamalı, girdilerdeki satır sonu karakterleri temizlenmelidir. Buna ek olarak gönderim hızını IP başına sınırlayın ve bot kontrolü ekleyin. Formu düzelttikten sonra kuyruğu izleyin; yeni mesaj gelmiyorsa kaynak gerçekten oydu.

    IP adresim kara listeye girdi, ne kadar sürede çıkarım#

    Liste politikasına göre değişir; bazıları kaynak kapandıktan sonra kendiliğinden birkaç gün içinde düşürür, bazıları elle çıkış talebi ister. Talebi göndermeden önce spam çıkışının gerçekten durduğundan emin olun, çünkü reddedilen bir talep sonraki başvuruyu zorlaştırır ve bekleme süresini uzatır. Çıkıştan sonra SPF, DKIM, DMARC ve PTR kayıtlarınızın eksiksiz olduğunu doğrulayın; bu dört kayıt tamam değilse listeden çıksanız bile teslimat oranınız düşük kalır.

    Paylaşımlı hostingdeyim, komşu siteden mi kaynaklanıyor#

    Mümkündür ama kendi hesabınızın loglarına bakarak ayırt edebilirsiniz: kuyruktaki mesajların cwd= değeri sizin ana dizininizi göstermiyorsa ve gönderen adresler sizin alan adınıza ait değilse kaynak başka bir hesaptır. Bu durumda müdahale sağlayıcıdadır; bulgularınızı iletip sunucu genelinde inceleme talep edin. Kendi hesabınızın etkilenmemesi için ayrıca kendi e-posta parolalarınızı yenileyin, çünkü aynı sunucudaki bir zararlı yalnızca kendi hesabında kalmayabilir.

    Kapanış#

    Spam çıkışı olaylarında belirleyici olan tek şey, kaynağı doğru tespit etmektir: kuyruktan alınan bir mesajın başlıklarındaki X-PHP-Script satırı ya da exim logundaki cwd= alanı, çoğu vakada suçlunun tam dosya yolunu beş dakikada verir; A=dovecot_login satırı ise ele geçirilmiş hesabı gösterir. Kuyruğu silmekle başlayan her müdahale, kaynağa dokunmadığı için ertesi gün aynı noktaya döner. Kaynağı kapattıktan sonra sıra kalıcı önlemlere gelir: saatlik gönderim limiti, uploads altında PHP yasağı, güçlü ve yenilenmiş e-posta parolaları, doğru SPF/DKIM/DMARC ve PTR kayıtları.

    Bu işin altyapı tarafını kendiniz yönetmek istemiyorsanız Clou.TR tarafında yardımcı olabilecek başlıklar var: kimlik doğrulamalı gönderim, doğru DNS kayıtları ve kota yönetimiyle gelen kurumsal e-posta hizmeti, toplu gönderim yapacaksanız itibarı ve IP'si ayrılmış SMTP sunucu paketleri ve spam üreten scriptlerin siteye ulaşmasını en baştan engelleyen WAF çözümü. E-posta yapılandırmanızı hızlıca doğrulamak isterseniz ücretsiz SMTP test aracımız port, TLS ve kimlik doğrulama ayarlarınızı tek ekranda kontrol etmenizi sağlar.

    e-postazararlı yazılımspam

    Uygulamaya geçmeye hazır mısınız?

    NVMe SSD, ücretsiz SSL ve %99.9 uptime garantisiyle Clou.TR hosting ve sunucu çözümleriyle projenizi hayata geçirin.