WordPress’te E-posta Gönderen Adı ve Adresi Değiştirme

WordPress sitenizden gönderilen e-postalar bazen çok “teknik” görünebilir. “WordPress ” gibi bir gönderen adı, müşterilerinize profesyonel bir izlenim vermez. Üstelik bazı hosting ortamlarında bu varsayılan adres spam filtrelere takılabilir ya da gerçekten var olmayan bir e-posta adresine işaret edebilir. İşte tam bu noktada WordPress’in wp_mail_from ve wp_mail_from_name filter hook’ları devreye giriyor.

Bu yazıda, functions.php dosyasına ekleyeceğiniz birkaç satır kod ile e-posta gönderen adını ve adresini nasıl değiştireceğinizi, WooCommerce siparişlerinde farklı bir gönderen nasıl kullanacağınızı ve çok siteli yapılarda (multisite) bu işi nasıl yöneteceğinizi adım adım ele alacağız.

Temel Mantık: WordPress E-posta Sistemi Nasıl Çalışır?

WordPress, e-posta göndermek için kendi wp_mail() fonksiyonunu kullanır. Bu fonksiyon, PHP’nin mail() fonksiyonunu veya tanımlı bir SMTP eklentisini kullanarak e-posta iletir. Gönderen adı ve adresi belirtilmediğinde WordPress, varsayılan olarak şu değerleri kullanır:

  • Gönderen adı: WordPress
  • Gönderen adresi: wordpress@

Bu değerler, iki ayrı filter hook üzerinden kontrol edilir:

  • wp_mail_from: Gönderen e-posta adresini filtreler
  • wp_mail_from_name: Gönderen görünen adını filtreler

Bu hook’lara bağlandığınızda (add_filter), WordPress her e-posta gönderiminde sizin belirlediğiniz değerleri kullanır. Tek satırla bile bunu çözebilirsiniz, ama gerçek dünya senaryolarında biraz daha ince ayar gerekir.

En Basit Kullanım: Sabit Ad ve Adres

Haydi önce en temel örneği görelim. Sitenizin functions.php dosyasına şu kodu ekleyin:

// functions.php

// Gönderen e-posta adresini değiştir
add_filter( 'wp_mail_from', function( $email ) {
    return '[email protected]';
});

// Gönderen görünen adını değiştir
add_filter( 'wp_mail_from_name', function( $name ) {
    return 'Sitenizin Adı';
});

Bu kadar. Artık sitenizden giden tüm e-postalar “Sitenizin Adı ” olarak görünecek. Ama dikkat: Bu yöntem tüm e-postalar için geçerli. WooCommerce siparişleri, şifre sıfırlama mailleri, iletişim formu bildirimleri… hepsi aynı gönderenden çıkacak.

Dinamik Yöntem: Site Başlığını ve URL’yi Kullanmak

Çok siteli bir yapı kuruyorsanız veya sitenizin adının değişebileceği bir senaryodaysa, sabit değer yerine dinamik değer kullanmak daha akıllıca olur:

// functions.php

add_filter( 'wp_mail_from', function( $email ) {
    // Site URL'sinden domain'i çek
    $site_url = get_site_url();
    $domain   = parse_url( $site_url, PHP_URL_HOST );
    // www. varsa kaldır
    $domain   = preg_replace( '/^www./', '', $domain );
    return 'info@' . $domain;
});

add_filter( 'wp_mail_from_name', function( $name ) {
    // WordPress ayarlarından site başlığını çek
    return get_bloginfo( 'name' );
});

Bu yaklaşımın güzelliği şu: Siteyi başka bir domain’e taşıdığınızda veya site adını değiştirdiğinizde, kodunuza dokunmanıza gerek kalmaz. Otomatik olarak güncellenir.

WooCommerce Siparişleri İçin Özel Gönderen

WooCommerce kullanan bir e-ticaret sitesinde genellikle iki farklı gönderen ihtiyacı doğar:

Bu ayrımı yapmak için, e-posta gönderilmeden önce hangi bağlamda olduğumuzu anlamamız gerekir. WooCommerce bunu WC()->mailer() üzerinden yönetir. Aşağıdaki kod, WooCommerce e-postaları için ayrı bir gönderen kullanır:

// functions.php

function custom_mail_from( $email ) {
    // WooCommerce e-postası mı gönderiliyor kontrol et
    if ( class_exists( 'WooCommerce' ) && WC()->mailer() ) {
        $current_email = WC()->mailer()->get_emails();
        if ( ! empty( $current_email ) ) {
            return '[email protected]';
        }
    }
    return '[email protected]';
}
add_filter( 'wp_mail_from', 'custom_mail_from' );

function custom_mail_from_name( $name ) {
    if ( class_exists( 'WooCommerce' ) ) {
        // Global $woocommerce_emails değişkenini kontrol et
        global $woocommerce_emails;
        if ( ! empty( $woocommerce_emails ) ) {
            return 'Mağaza Sipariş Bildirimi';
        }
    }
    return get_bloginfo( 'name' );
}
add_filter( 'wp_mail_from_name', 'custom_mail_from_name' );

Ancak bu yöntem her zaman güvenilir çalışmayabilir çünkü WooCommerce’in mail gönderim döngüsünü yakalamak için daha kesin bir yol var.

WooCommerce E-posta Tipine Göre Gönderen Belirleme

WooCommerce, farklı e-posta tipleri için farklı class’lar kullanır. Sipariş onayı, kargo bildirimi, iade talebi… Bunların her biri için ayrı gönderen ayarlayabilirsiniz:

// functions.php

add_action( 'woocommerce_email_before_order_table', function( $order, $sent_to_admin, $plain_text, $email ) {
    // Bu action tetiklendiğinde, doğru WC email nesnesi elimizde
    // Gönderen bilgisini global bir değişkende saklayabiliriz
    if ( $email->id === 'customer_completed_order' ) {
        add_filter( 'wp_mail_from', function() {
            return '[email protected]';
        }, 20 );
        add_filter( 'wp_mail_from_name', function() {
            return 'Mağaza Kargo Bildirimleri';
        }, 20 );
    } elseif ( $email->id === 'customer_invoice' ) {
        add_filter( 'wp_mail_from', function() {
            return '[email protected]';
        }, 20 );
        add_filter( 'wp_mail_from_name', function() {
            return 'Mağaza Fatura Servisi';
        }, 20 );
    }
}, 10, 4 );

Bu yaklaşım, e-posta hazırlanmaya başladığında doğru gönderen bilgisini tanımlar.

Şifre Sıfırlama ve Yönetici Bildirimlerini Ayırt Etmek

Bazen müşterilere giden e-postalar ile yöneticilere giden e-postaları ayırt etmek istersiniz. WordPress’in wp_mail() fonksiyonu tetiklenirken hangi e-posta adresine gittiğini bilmek, bunu mümkün kılar. Bunun için bir ara çözüm olarak pre_wp_mail hook’unu kullanabiliriz:

// functions.php

// wp_mail() çağrısını yakalamak için global bir bayrak kullanalım
$GLOBALS['mail_recipient'] = '';

add_action( 'pre_wp_mail', function( $atts ) {
    if ( isset( $atts['to'] ) ) {
        $GLOBALS['mail_recipient'] = is_array( $atts['to'] )
            ? implode( ',', $atts['to'] )
            : $atts['to'];
    }
}, 10, 1 );

add_filter( 'wp_mail_from', function( $email ) {
    $admin_email = get_option( 'admin_email' );

    // Alıcı yönetici ise
    if ( strpos( $GLOBALS['mail_recipient'], $admin_email ) !== false ) {
        return '[email protected]';
    }

    // Alıcı müşteri ise
    return '[email protected]';
}, 15 );

add_filter( 'wp_mail_from_name', function( $name ) {
    $admin_email = get_option( 'admin_email' );

    if ( strpos( $GLOBALS['mail_recipient'], $admin_email ) !== false ) {
        return 'Sistem Bildirimleri';
    }

    return get_bloginfo( 'name' ) . ' Destek';
}, 15 );

Not: pre_wp_mail hook’u WordPress 5.7 ile birlikte geldi. Daha eski bir sürüm kullanıyorsanız bu hook çalışmayacaktır.

WordPress Multisite İçin Yapılandırma

Çok siteli bir WordPress ağında (multisite), her alt sitenin kendi gönderen adresine ihtiyacı olabilir. Bunu merkezi olarak yönetmek için ağın functions.php dosyasına veya bir ağ çapında aktif eklentiye şunu ekleyebilirsiniz:

// functions.php (her sitenin kendi functions.php'si veya mu-plugins içinde)

add_filter( 'wp_mail_from', function( $email ) {
    // Mevcut blogun (alt sitenin) bilgilerini al
    $current_blog = get_current_blog_id();
    $site_details = get_blog_details( $current_blog );

    if ( $site_details ) {
        $domain = preg_replace( '/^www./', '', $site_details->domain );
        // Her alt site için kendi domainini kullan
        return 'info@' . $domain;
    }

    return $email; // Değişiklik yapamadıysak orijinali döndür
});

add_filter( 'wp_mail_from_name', function( $name ) {
    $current_blog = get_current_blog_id();
    $site_details = get_blog_details( $current_blog );

    if ( $site_details ) {
        return $site_details->blogname;
    }

    return $name;
});

Bu kod, her alt site e-posta gönderdiğinde o sitenin domain’ini ve adını otomatik olarak kullanır. 10 siteniz de olsa, 100 siteniz de olsa tek bir yapılandırma ile hepsini yönetirsiniz.

Öncelik Sırası: Eklentilerle Çakışmayı Önlemek

Eğer sitenizde WP Mail SMTP, FluentSMTP veya benzeri bir posta eklentisi kullanıyorsanız, gönderen ayarları çakışabilir. Bu eklentiler genellikle aynı hook’ları kullanır ve kendi ayarlarını ön plana çekmek için öncelik belirler.

Hook öncelikleri hakkında kısa bir hatırlatma:

  • add_filter‘in 3. parametresi önceliği belirler (varsayılan: 10)
  • Düşük sayı daha erken çalışır
  • Yüksek sayı daha geç çalışır, dolayısıyla önceki filtrelerin üzerine yazar

Kendi kodunuzun eklentilerin üzerinde çalışmasını istiyorsanız:

// functions.php

// Öncelik olarak 99 veya daha yüksek bir değer kullan
// Bu sayede çoğu eklentinin filtresinin üzerine yazar
add_filter( 'wp_mail_from', function( $email ) {
    return '[email protected]';
}, 99 );

add_filter( 'wp_mail_from_name', function( $name ) {
    return 'Site Adınız';
}, 99 );

Öte yandan, eklentinin kendi arayüzünden yaptığı ayarların geçerli olmasını isteyip sadece bir “geri dönüş” değeri tanımlamak istiyorsanız düşük öncelik kullanın:

// Eklenti boş değer dönerse devreye gir
add_filter( 'wp_mail_from', function( $email ) {
    // Eğer gelen değer varsayılan WordPress değeriyse değiştir
    if ( $email === 'wordpress@' . parse_url( home_url(), PHP_URL_HOST ) ) {
        return '[email protected]';
    }
    return $email; // Eklenti zaten bir değer tanımlamışsa dokunma
}, 5 );

Test Etme: Değişiklikleriniz Gerçekten Çalışıyor mu?

Kodu yazdınız, ama doğru çalışıp çalışmadığını nasıl anlayacaksınız? WordPress’te basit bir test e-postası göndermek için şu geçici kodu kullanabilirsiniz. Bunu test ettikten sonra mutlaka silin:

// functions.php - SADECE TEST İÇİN, test sonrası sil!

add_action( 'init', function() {
    // Sadece yönetici ve sadece bir kez çalışsın
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    // URL'ye ?test_mail=1 ekleyerek tetikle
    if ( isset( $_GET['test_mail'] ) && $_GET['test_mail'] === '1' ) {
        $result = wp_mail(
            get_option( 'admin_email' ),
            'Test E-postası - Gönderen Bilgisi Kontrolü',
            'Bu bir test e-postasıdır. Gönderen adı ve adresi doğru görünüyor mu?'
        );
        if ( $result ) {
            wp_die( 'E-posta gönderildi! Gelen kutunuzu kontrol edin.' );
        } else {
            wp_die( 'E-posta gönderilemedi.' );
        }
    }
});

Sitenize https://siteniz.com?test_mail=1 adresiyle giriş yapıp eriştiğinizde test e-postası tetiklenir. E-posta başlıklarında “From:” alanını kontrol ederek sonucu doğrulayabilirsiniz.

Sık Karşılaşılan Sorunlar ve Çözümleri

E-posta hiç gitmiyor: Gönderen adresinin gerçekten var olan ve o sunucudan gönderim iznine sahip bir adres olduğundan emin olun. Örneğin [email protected] tanımlıyorsanız ama bu adres hosting panelinizde oluşturulmamışsa, bazı sunucular SPF/DKIM doğrulaması yapamadığı için maili reddeder.

Gönderen adı değişiyor ama adres değişmiyor: Bu genellikle bir SMTP eklentisinin kendi From adresini zorla ayarlamasından kaynaklanır. Eklentinin arayüzünden “Force From Email” gibi seçenekleri kontrol edin veya öncelik değerini yukarı taşıyın.

WooCommerce yönetici bildirimleri yanlış adresten geliyor: WooCommerce, yönetici bildirimlerini get_option('admin_email') yerine WooCommerce ayarlarından alır. WooCommerce > Ayarlar > E-postalar bölümünden her e-posta tipinin alıcısını ayrı ayrı kontrol edin.

Multisite’da sadece ana site değişti: mu-plugins klasörünü kullanmıyorsanız ve kodu ana sitenin functions.php‘sine yazdıysanız, alt siteler etkilenmez. Alt sitelerin tema functions.php‘lerine ekleyin veya mu-plugins altında bir plugin oluşturun.

Neden Reply-To da Önemli?

Gönderen adresini değiştirdiniz, güzel. Ama müşteri “Yanıtla” butonuna bastığında yanıt nereye gidecek? Varsayılan olarak gönderen adresine gider. Eğer [email protected] adresini gerçek bir adres değilse ve müşterinin yanıtının destek ekibine ulaşmasını istiyorsanız, Reply-To başlığını da ayarlamalısınız:

// functions.php

add_filter( 'wp_mail', function( $atts ) {
    // Mevcut headers'ı al
    $headers = isset( $atts['headers'] ) ? $atts['headers'] : [];

    // String ise diziye çevir
    if ( is_string( $headers ) ) {
        $headers = explode( "n", str_replace( "rn", "n", $headers ) );
    }

    // Reply-To ekle (eğer yoksa)
    $has_reply_to = false;
    foreach ( $headers as $header ) {
        if ( stripos( $header, 'reply-to' ) !== false ) {
            $has_reply_to = true;
            break;
        }
    }

    if ( ! $has_reply_to ) {
        $headers[] = 'Reply-To: Destek Ekibi <[email protected]>';
    }

    $atts['headers'] = $headers;
    return $atts;
});

Bu sayede e-posta “[email protected]”dan gidecek ama müşteri yanıt verdiğinde “[email protected]”a gidecek.

Güvenlik Notu: Hangi Adresi Kullanmalısınız?

E-posta gönderici adresi olarak kullandığınız adresin mutlaka sitenizin hostt edildiği domain ile aynı veya SPF kaydında yetkili gösterilmiş bir domain üzerinde olması gerekir. Aksi halde:

  • Gmail ve Outlook gibi büyük sağlayıcılar maili spam olarak işaretleyebilir
  • Bazı sunucular maili hiç kabul etmeyebilir
  • SPF, DKIM ve DMARC kayıtlarınız başarısız olur ve bu da e-posta itibarınızı düşürür

Kısacası [email protected] gibi bir adresi, siteniz.com sunucusundan göndermeye çalışmayın. SPF kaydınızı kontrol etmek için [MXToolbox](https://mxtoolbox.com) gibi araçları kullanabilirsiniz.

Sonuç

WordPress ve WooCommerce sitelerinde gönderen adı ve adresi değiştirmek kulağa basit geliyor, ama doğru yapılmadığında e-postalarınız spam klasörüne düşebilir ya da hiç ulaşmayabilir. wp_mail_from ve wp_mail_from_name hook’larını kullanmak teknik olarak oldukça basit ancak asıl dikkat etmeniz gereken noktalar şunlar:

  • Kullandığınız e-posta adresi gerçekten var olmalı ve o domain üzerinden gönderim yapma izni bulunmalı
  • SMTP eklentileri veya diğer eklentilerle çakışma ihtimalini göz önünde bulundurarak öncelik değerlerini doğru ayarlamalısınız
  • WooCommerce kullanıyorsanız, e-posta tiplerine göre ayrı gönderenler tanımlamak hem daha profesyonel hem de daha yönetilebilir bir yapı sağlar
  • Multisite kurulumlarında mu-plugins üzerinden merkezi bir yönetim her zaman daha sağlıklıdır
  • Reply-To başlığını da unutmayın, çünkü müşterinin yanıtı nereye gideceği en az gönderen adresi kadar önemli

Bu yazıda verilen kod örneklerini kendi sitenize uyarlayarak kullanabilirsiniz. Her değişiklikten sonra bir test e-postası gönderip başlıkları kontrol etmeyi alışkanlık haline getirin. E-posta başlıklarını Gmail’de görmek için “Orijinali göster” veya Outlook’ta “İleti kaynağını görüntüle” seçeneğini kullanabilirsiniz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir