WordPress E-posta Gönderimini Özelleştirme: wp_mail Fonksiyonu
WordPress’te e-posta gönderimi çoğu zaman göz ardı edilen ama aslında son derece kritik bir konudur. Bir siparişin onaylanması, kullanıcı kaydı, şifre sıfırlama ya da herhangi bir form bildirimi… Bunların hepsi wp_mail() fonksiyonu üzerinden geçer. Peki ya bu e-postaların gönderici adresini, içeriğini veya formatını değiştirmek istersen? İşte tam bu noktada wp_mail hook’ları devreye girer ve functions.php dosyası senin en iyi arkadaşın olur.
Bu yazıda WordPress e-posta sistemini derinlemesine inceleyecek, gerçek dünya senaryolarıyla nasıl özelleştirebileceğini göstereceğim. Hem küçük bir blog hem de WooCommerce tabanlı büyük bir mağaza için geçerli olacak pratik kod örnekleri paylaşacağım.
wp_mail() Fonksiyonu Nasıl Çalışır?
WordPress, PHP’nin yerel mail() fonksiyonu yerine kendi soyutlama katmanı olan wp_mail() fonksiyonunu kullanır. Bu sayede e-posta gönderimini hook’lar aracılığıyla kontrol edebilirsin.
wp_mail() fonksiyonu temel olarak şu parametreleri alır:
- $to: Alıcı e-posta adresi ya da adreslerin dizisi
- $subject: E-posta konusu
- $message: E-posta içeriği
- $headers: Ek başlıklar (CC, BCC, From, Content-Type vb.)
- $attachments: Ekler için dosya yollarının dizisi
Fonksiyon çağrıldığında, WordPress bu değerleri wp_mail filtresiyle filtreden geçirir, ardından PHPMailer kütüphanesini kullanarak gerçek gönderimi yapar. Bu akışı anlamak, neyi nerede özelleştireceğini bilmen açısından kritik.
Gönderici Adı ve E-posta Adresini Değiştirme
WordPress’in varsayılan gönderici adı “WordPress” olarak gelir ve e-posta adresi genellikle [email protected] formatında belirlenir. Bu, özellikle kurumsal sitelerde ya da WooCommerce mağazalarında hiç profesyonel görünmez. Müşterilerine “WordPress’ten” gelen bir sipariş onay maili göndermek istemezsin.
// functions.php dosyasına ekle
function ozellestir_mail_gonderen_adi( $name ) {
return 'Mağazam Destek Ekibi';
}
add_filter( 'wp_mail_from_name', 'ozellestir_mail_gonderen_adi' );
function ozellestir_mail_gonderen_adresi( $email ) {
return '[email protected]';
}
add_filter( 'wp_mail_from', 'ozellestir_mail_gonderen_adresi' );
Bu iki filtre, WordPress’ten gönderilen tüm e-postalar için geçerli olur. Sitenin alan adına uygun bir e-posta adresi kullanmak önemlidir çünkü [email protected] gibi gerçekte var olmayan adresler spam filtreleri tarafından işaretlenebilir.
İçerik Tipini HTML Olarak Ayarlama
Varsayılan olarak WordPress, wp_mail() ile düz metin (plain text) e-postalar gönderir. HTML içerikli, biçimlendirilmiş e-postalar göndermek istiyorsan Content-Type başlığını değiştirmen gerekir.
// Tüm WordPress e-postalarını HTML formatına çevir
function html_mail_icerigi() {
return 'text/html';
}
add_filter( 'wp_mail_content_type', 'html_mail_icerigi' );
Ancak bu yaklaşımda dikkatli olmak gerekir. Tüm e-postaları HTML’e çevirmek bazen sorunlara yol açabilir. Özellikle düz metin bekleyen sistemlerle entegrasyon varsa. Daha güvenli yaklaşım, sadece belirli e-postalar için bu değişikliği yapmaktır. Bunun için wp_mail filtresini kullanabilirsin:
// Sadece belirli konu satırına sahip e-postalar için HTML kullan
function kosullu_html_mail( $args ) {
// Sipariş onay e-postaları için HTML formatı
if ( strpos( $args['subject'], 'Sipariş Onayı' ) !== false ) {
$args['headers'][] = 'Content-Type: text/html; charset=UTF-8';
}
return $args;
}
add_filter( 'wp_mail', 'kosullu_html_mail' );
Tüm E-posta Parametrelerini wp_mail Filtresiyle Yönetme
wp_mail filtresi, e-posta gönderilmeden hemen önce tüm parametreleri bir dizi olarak ele geçirmeni sağlar. Bu, en kapsamlı ve esnek yöntemdir.
function gelismis_wp_mail_ozellestirme( $args ) {
// Mevcut değerleri al
$to = $args['to'];
$subject = $args['subject'];
$message = $args['message'];
$headers = $args['headers'];
$attachments = $args['attachments'];
// Tüm e-postalara BCC ekle (arşivleme amaçlı)
if ( ! is_array( $headers ) ) {
$headers = array( $headers );
}
$headers[] = 'BCC: [email protected]';
// Konuya site adı ekle
$site_adi = get_bloginfo( 'name' );
if ( strpos( $subject, '[' . $site_adi . ']' ) === false ) {
$args['subject'] = '[' . $site_adi . '] ' . $subject;
}
$args['headers'] = $headers;
return $args;
}
add_filter( 'wp_mail', 'gelismis_wp_mail_ozellestirme' );
Bu örnekte yaptıklarımıza bakalım: Tüm e-postalara otomatik olarak BCC ekledik (bu özellikle müşteri iletişimlerini arşivlemek için kullanışlıdır) ve konu satırına site adını bracket içinde ekledik. Bu, alıcının hangi siteden geldiğini anında anlamasını sağlar.
Şifre Sıfırlama E-postasını Özelleştirme
WordPress’in varsayılan şifre sıfırlama e-postası oldukça çirkin ve anlamsız görünür. Bunu daha profesyonel hale getirmek için retrieve_password_message filtresini kullanabilirsin:
function ozellestir_sifre_sifirlama_maili( $message, $key, $user_login, $user_data ) {
$sifreleme_linki = network_site_url(
"wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ),
'login'
);
$site_adi = get_bloginfo( 'name' );
$site_url = get_bloginfo( 'url' );
$yeni_mesaj = '<html><body>';
$yeni_mesaj .= '<div style="max-width:600px; margin:0 auto; font-family:Arial,sans-serif;">';
$yeni_mesaj .= '<h2 style="color:#333;">Şifre Sıfırlama Talebi</h2>';
$yeni_mesaj .= '<p>Merhaba <strong>' . esc_html( $user_login ) . '</strong>,</p>';
$yeni_mesaj .= '<p>' . esc_html( $site_adi ) . ' hesabınız için bir şifre sıfırlama talebinde bulundunuz.</p>';
$yeni_mesaj .= '<p>Aşağıdaki butona tıklayarak şifrenizi sıfırlayabilirsiniz:</p>';
$yeni_mesaj .= '<a href="' . esc_url( $sifreleme_linki ) . '" style="background:#0073aa; color:#fff; padding:12px 24px; text-decoration:none; border-radius:4px; display:inline-block;">Şifremi Sıfırla</a>';
$yeni_mesaj .= '<p style="margin-top:20px; color:#666; font-size:13px;">Bu link 24 saat geçerlidir.</p>';
$yeni_mesaj .= '<p style="color:#666; font-size:13px;">Eğer bu talebi siz yapmadıysanız, bu e-postayı dikkate almayın.</p>';
$yeni_mesaj .= '<hr style="border:1px solid #eee;">';
$yeni_mesaj .= '<p style="font-size:12px; color:#999;">' . esc_html( $site_adi ) . ' | <a href="' . esc_url( $site_url ) . '">' . esc_url( $site_url ) . '</a></p>';
$yeni_mesaj .= '</div></body></html>';
return $yeni_mesaj;
}
add_filter( 'retrieve_password_message', 'ozellestir_sifre_sifirlama_maili', 10, 4 );
// HTML formatı için content type'ı da ayarla
function sifre_maili_content_type() {
return 'text/html';
}
add_filter( 'wp_mail_content_type', 'sifre_maili_content_type' );
Kullanıcı Kayıt E-postasını Özelleştirme
Yeni kullanıcı kaydolduğunda hem kullanıcıya hem de admin’e e-posta gönderilir. Bu e-postaları da özelleştirebilirsin:
// Yeni kullanıcı kaydında admin bildirim e-postasını değiştir
function ozellestir_admin_kayit_bildirimi( $wp_new_user_notification_email_admin, $user, $blogname ) {
$wp_new_user_notification_email_admin['subject'] = sprintf(
'[%s] Yeni Üye Kaydı: %s',
$blogname,
$user->user_login
);
$mesaj = "Merhaba Admin,nn";
$mesaj .= sprintf( "%s sitesine yeni bir kullanıcı kayıt oldu.nn", $blogname );
$mesaj .= sprintf( "Kullanıcı Adı: %sn", $user->user_login );
$mesaj .= sprintf( "E-posta: %sn", $user->user_email );
$mesaj .= sprintf( "Kayıt Tarihi: %snn", current_time( 'd.m.Y H:i' ) );
$mesaj .= "Kullanıcı Yönetimi: " . admin_url( 'users.php' ) . "n";
$wp_new_user_notification_email_admin['message'] = $mesaj;
return $wp_new_user_notification_email_admin;
}
add_filter( 'wp_new_user_notification_email_admin', 'ozellestir_admin_kayit_bildirimi', 10, 3 );
Özel E-posta Gönderme Fonksiyonu Oluşturma
Gerçek dünya projelerinde genellikle tekrar kullanılabilir bir e-posta gönderme wrapper fonksiyonu oluşturmak iyi bir pratiktir. Hem kod tekrarını önler hem de merkezi bir kontrol noktası sağlar:
/**
* Merkezi e-posta gönderme fonksiyonu
*
* @param string|array $alici Alıcı e-posta adresi veya adresleri
* @param string $konu E-posta konusu
* @param string $html_icerik HTML içerik
* @param array $ekler Ek dosyaların yolları
* @param array $ek_basliklar Ek header'lar
* @return bool
*/
function site_mail_gonder( $alici, $konu, $html_icerik, $ekler = array(), $ek_basliklar = array() ) {
// Temel başlıklar
$basliklar = array(
'Content-Type: text/html; charset=UTF-8',
'From: ' . get_bloginfo( 'name' ) . ' <[email protected]>',
);
// Ek başlıkları birleştir
$basliklar = array_merge( $basliklar, $ek_basliklar );
// HTML içeriği tam bir e-posta şablonuna sar
$tam_icerik = '<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>' . esc_html( $konu ) . '</title>
</head>
<body style="margin:0; padding:0; background-color:#f4f4f4;">
<div style="max-width:600px; margin:20px auto; background:#fff; border-radius:8px; overflow:hidden; box-shadow:0 2px 4px rgba(0,0,0,0.1);">
<div style="background:#0073aa; padding:20px; text-align:center;">
<h1 style="color:#fff; margin:0; font-size:22px;">' . esc_html( get_bloginfo( 'name' ) ) . '</h1>
</div>
<div style="padding:30px;">
' . $html_icerik . '
</div>
<div style="background:#f9f9f9; padding:15px; text-align:center; font-size:12px; color:#999;">
<p>© ' . date( 'Y' ) . ' ' . esc_html( get_bloginfo( 'name' ) ) . ' | <a href="' . esc_url( get_bloginfo( 'url' ) ) . '">' . esc_url( get_bloginfo( 'url' ) ) . '</a></p>
</div>
</div>
</body>
</html>';
// Gönderimden önce log tut (geliştirme ortamı için)
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
error_log( 'Mail gönderiliyor: ' . $konu . ' -> ' . ( is_array( $alici ) ? implode( ', ', $alici ) : $alici ) );
}
$sonuc = wp_mail( $alici, $konu, $tam_icerik, $basliklar, $ekler );
return $sonuc;
}
Bu fonksiyonu kullanmak son derece basit:
// Örnek kullanım: Kullanıcıya hoş geldin maili gönder
function hosgeldin_maili_gonder( $user_id ) {
$kullanici = get_user_by( 'id', $user_id );
if ( ! $kullanici ) {
return;
}
$icerik = '<h2>Hoş Geldiniz, ' . esc_html( $kullanici->display_name ) . '!</h2>';
$icerik .= '<p>Sitemize başarıyla kayıt oldunuz. Artık tüm içeriklere erişebilirsiniz.</p>';
$icerik .= '<p><a href="' . esc_url( get_permalink( get_option( 'page_for_posts' ) ) ) . '" style="background:#0073aa; color:#fff; padding:10px 20px; text-decoration:none; border-radius:4px;">Siteyi Keşfet</a></p>';
$icerik .= '<p>Herhangi bir sorunuz için <a href="mailto:[email protected]">[email protected]</a> adresine yazabilirsiniz.</p>';
site_mail_gonder(
$kullanici->user_email,
'Hoş Geldiniz - ' . get_bloginfo( 'name' ),
$icerik
);
}
add_action( 'user_register', 'hosgeldin_maili_gonder' );
E-posta Gönderimini Loglama
Production ortamında hangi e-postaların gönderildiğini takip etmek önemlidir. Başarısız gönderimler kritik bilgilerin kaybolmasına neden olabilir.
// wp_mail başarı/başarısızlık loglaması
function mail_gonderi_logla( $mail_data ) {
$log_dosyasi = WP_CONTENT_DIR . '/mail-log.txt';
$log_girisi = sprintf(
"[%s] KONU: %s | ALICI: %sn",
current_time( 'd.m.Y H:i:s' ),
$mail_data['subject'],
is_array( $mail_data['to'] ) ? implode( ', ', $mail_data['to'] ) : $mail_data['to']
);
// Dosyaya yaz (sadece geliştirme ortamında ya da hata durumunda kullan)
if ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
file_put_contents( $log_dosyasi, $log_girisi, FILE_APPEND | LOCK_EX );
}
return $mail_data;
}
add_filter( 'wp_mail', 'mail_gonderi_logla' );
// Başarısız gönderim bildirimi
function mail_hata_bildirimi( $wp_error ) {
error_log( 'WP Mail Hatası: ' . $wp_error->get_error_message() );
// İsteğe bağlı: Yöneticiye anlık SMS/Slack bildirimi gönder
// slack_bildirim_gonder( 'Mail gönderilemedi: ' . $wp_error->get_error_message() );
}
add_action( 'wp_mail_failed', 'mail_hata_bildirimi' );
WooCommerce E-postalarında functions.php Kullanımı
WooCommerce kendi e-posta sistemini kullanır ama altta yatan mekanizma yine wp_mail()‘dir. WooCommerce e-postalarını woocommerce_email_headers filtresiyle özelleştirebilirsin:
// WooCommerce e-postalarına Reply-To ekle
function woocommerce_reply_to_ekle( $headers, $email_id, $object ) {
// Sadece müşteri e-postaları için
$musteri_emailleri = array(
'customer_processing_order',
'customer_completed_order',
'customer_invoice',
'customer_note',
);
if ( in_array( $email_id, $musteri_emailleri ) ) {
$headers .= "Reply-To: Sipariş Destek <[email protected]>rn";
$headers .= "X-Mailer: WooCommercern";
}
return $headers;
}
add_filter( 'woocommerce_email_headers', 'woocommerce_reply_to_ekle', 10, 3 );
// WooCommerce sipariş tamamlandı e-postasına özel mesaj ekle
function woocommerce_siparis_tamamlandi_mesaj( $message, $order ) {
$musteri_adi = $order->get_billing_first_name();
$siparis_no = $order->get_order_number();
$ek_icerik = '<div style="margin-top:20px; padding:15px; background:#f0f7ff; border-left:4px solid #0073aa;">';
$ek_icerik .= '<p><strong>Merhaba ' . esc_html( $musteri_adi ) . ',</strong></p>';
$ek_icerik .= '<p>' . $siparis_no . ' numaralı siparişiniz tamamlanmıştır. Alışverişiniz için teşekkür ederiz!</p>';
$ek_icerik .= '<p>Ürünlerinizle ilgili herhangi bir sorun yaşarsanız 30 gün içinde iade talebinde bulunabilirsiniz.</p>';
$ek_icerik .= '</div>';
return $message . $ek_icerik;
}
add_filter( 'woocommerce_mail_content', 'woocommerce_siparis_tamamlandi_mesaj', 10, 2 );
SMTP ile wp_mail Entegrasyonu
Shared hosting ortamlarında wp_mail() genellikle PHP’nin mail() fonksiyonunu kullanır ve bu çoğu zaman spam klasörüne düşmeye neden olur. Daha güvenilir bir yöntem olarak SMTP yapılandırabilirsin. Plugin kullanmadan bunu phpmailer_init action’ıyla yapabilirsin:
// SMTP ayarları (bu değerleri wp-config.php'de define ile sakla)
function smtp_yapilandirmasi( $phpmailer ) {
$phpmailer->isSMTP();
$phpmailer->Host = defined( 'SMTP_HOST' ) ? SMTP_HOST : 'smtp.gmail.com';
$phpmailer->SMTPAuth = true;
$phpmailer->Port = defined( 'SMTP_PORT' ) ? SMTP_PORT : 587;
$phpmailer->Username = defined( 'SMTP_USER' ) ? SMTP_USER : '';
$phpmailer->Password = defined( 'SMTP_PASS' ) ? SMTP_PASS : '';
$phpmailer->SMTPSecure = defined( 'SMTP_SECURE' ) ? SMTP_SECURE : 'tls';
$phpmailer->From = defined( 'SMTP_FROM' ) ? SMTP_FROM : get_option( 'admin_email' );
$phpmailer->FromName = defined( 'SMTP_FROM_NAME' ) ? SMTP_FROM_NAME : get_bloginfo( 'name' );
}
add_action( 'phpmailer_init', 'smtp_yapilandirmasi' );
wp-config.php dosyasına şu tanımlamaları ekle:
// wp-config.php
define( 'SMTP_HOST', 'smtp.gmail.com' );
define( 'SMTP_PORT', 587 );
define( 'SMTP_USER', '[email protected]' );
define( 'SMTP_PASS', 'uygulama-sifresi' );
define( 'SMTP_SECURE', 'tls' );
define( 'SMTP_FROM', '[email protected]' );
define( 'SMTP_FROM_NAME', 'Şirketim Destek' );
Bu yaklaşımda SMTP kimlik bilgilerini version control’a gitmeyecek şekilde wp-config.php‘de saklamak güvenlik açısından önemlidir.
Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler
WordPress’te e-posta özelleştirmesi yaparken bazı tuzaklara düşmemek için şunlara dikkat etmek gerekir:
- Content-Type kalıcı değişiklik:
wp_mail_content_typefiltresini global olarak HTML’e çevirirsen bazı eklentilerin düz metin e-postaları bozulabilir. Mümkünse e-posta bazlı kontrol yap.
- Karakter kodlaması: Türkçe karakterler için her zaman
charset=UTF-8belirle ve header’lara ekle.
- From adresi ve alan adı uyumu: Gönderici e-posta adresi sitenin alan adıyla aynı olmalı.
[email protected]olan bir sitenin e-postalarınıgmail.comadresinden göndermeye çalışmak SPF/DKIM sorunlarına yol açar.
- Attachment boyutu:
wp_mail()ile büyük ekler gönderirken sunucu limitlerine dikkat et.memory_limitvepost_max_sizedeğerlerini kontrol et.
- Test ortamı: Geliştirme ortamında gerçek kullanıcılara mail gitmemesi için
wp_mailfiltresinde ortam kontrolü yapabilirsin.
// Geliştirme ortamında tüm mailleri tek adrese yönlendir
function gelistirme_ortami_mail_yonlendirme( $args ) {
if ( defined( 'WP_ENV' ) && WP_ENV === 'development' ) {
$args['to'] = '[email protected]';
$args['subject'] = '[TEST] ' . $args['subject'];
}
return $args;
}
add_filter( 'wp_mail', 'gelistirme_ortami_mail_yonlendirme' );
Sonuç
wp_mail() ve ona bağlı hook’lar, WordPress’te e-posta gönderimini neredeyse tamamen kontrol altına alman için güçlü bir altyapı sunar. Gönderici bilgilerini düzeltmekten SMTP entegrasyonuna, basit log tutmaktan tam anlamıyla şablonlanmış HTML e-postalara kadar her şeyi functions.php üzerinden yönetebilirsin.
Önemli olan şu: Her özelleştirmeyi körü körüne tüm e-postalara uygulamak yerine, hangi e-postanın ne zaman etkileneceğini düşünerek filtrelerini ve action’larını kullan. Yanlış yapılandırılmış bir e-posta sistemi, müşteri siparişlerini kaybettirenden şifre sıfırlama linklerinin çalışmamasına kadar ciddi sorunlara yol açabilir.
Son bir pratik tavsiye olarak: Production’a geçmeden önce mutlaka WP Mail SMTP eklentisinin test aracını ya da benzer bir araçla mail gönderimini test et. Hem SMTP bağlantısını hem de Türkçe karakter uyumunu kontrol etmek, sonradan başını ağrıtacak sorunları peşinen çözer.
