Bu yanıtın yalnızca mail()
işlevin kendisinin kullanımı için geçerli olan bölümleri olmasına rağmen , bu sorun giderme adımlarının çoğu herhangi bir PHP posta sistemine uygulanabilir.
Komut dosyanızın e-posta göndermemesinin çeşitli nedenleri vardır. Açık bir sözdizimi hatası olmadıkça bunları teşhis etmek zordur. Biri olmadan karşılaşabileceğiniz olası tuzakları bulmak için aşağıdaki kontrol listesini çalıştırmanız gerekir.
Hata raporlamanın etkinleştirildiğinden ve tüm hataları bildirecek şekilde ayarlandığından emin olun
Hata raporları, kodunuzdaki hataları ve PHP'nin karşılaştığı genel hataları ortadan kaldırmak için önemlidir. Bu hataları alabilmek için hata raporlamanın etkinleştirilmesi gerekir. Aşağıdaki kodu PHP dosyalarınızın üstüne (veya ana yapılandırma dosyasına) yerleştirmek hata raporlamayı etkinleştirir.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
Bkz PHP yararlı hata iletileri alabilirim? - bununla ilgili daha fazla ayrıntı için bu cevap .
mail()
İşlevin çağrıldığından emin olun
Aptalca görünebilir, ancak yaygın bir hata, mail()
işlevi kodunuza yerleştirmeyi unutmaktır . Orada olduğundan ve yorum yapmadığından emin olun.
Emin olun mail()
fonksiyonun doğru denir
bool mail (dize $ -, dize $ konu, dize $ mesajı [, dize $ Additional_headers [, dize $ Additional_parameters]])
Posta işlevi üç gerekli parametreyi ve isteğe bağlı olarak dördüncü ve beşinci parametreleri alır. İçin yaptığınız çağrıda mail()
en az üç parametre yoksa, başarısız olur.
To çağrınız mail()
doğru sırada doğru parametrelere sahip değilse de başarısız olur.
Sunucunun posta günlüklerini kontrol edin
Web sunucunuz, üzerinden e-posta göndermek için yapılan tüm girişimleri günlüğe kaydetmelidir. Bu günlüklerin konumu değişiklik gösterir (sunucu yöneticinize nerede bulunduğunu sormanız gerekebilir), ancak genellikle kullanıcının kök dizininde bulunabilir logs
. İçeride, e-posta gönderme girişimlerinizle ilgili olarak sunucunun bildirdiği hata iletileri olacaktır.
Bağlantı noktası bağlantı hatası olup olmadığını kontrol edin
Port bloğu, çoğu geliştiricinin SMTP kullanarak e-posta teslim etmek için kodlarını entegre ederken karşılaştığı çok yaygın bir sorundur. Ve bu, sunucu posta günlüklerinde kolayca izlenebilir (posta günlüğü sunucusunun konumu, yukarıda açıklandığı gibi sunucudan sunucuya değişebilir). Paylaşılan bir barındırma sunucusundaysanız, 25 ve 587 numaralı bağlantı noktaları varsayılan olarak engellenmiş olarak kalır. Bu blok, barındırma sağlayıcınız tarafından bilerek yapılmıştır. Bu, bazı özel sunucular için bile geçerlidir. Bu bağlantı noktaları engellendiğinde, bağlantı noktası 2525'i kullanarak bağlanmayı deneyin. Bu bağlantı noktasının da engellendiğini görürseniz, tek çözüm bu bağlantı noktalarının engellemesini kaldırmak için barındırma sağlayıcınızla iletişim kurmaktır.
Barındırma sağlayıcılarının çoğu, ağlarını spam e-postaları göndermekten korumak için bu e-posta bağlantı noktalarını engeller.
Düz / TLS bağlantıları için 25 veya 587 numaralı bağlantı noktalarını ve SSL bağlantıları için 465 numaralı bağlantı noktasını kullanın. Çoğu kullanıcı için, bazı barındırma sağlayıcıları tarafından belirlenen hız sınırlarını önlemek için bağlantı noktası 587'yi kullanmanız önerilir.
Hata bastırma işlecini kullanma
Ne zaman hata bastırma operatörü @
PHP'de bir ifadesi önüne edilir, bu ifadesinin ürettiği olabilecek hata iletileri dikkate alınmaz. Bu operatörün kullanılmasının gerekli olduğu durumlar vardır, ancak posta göndermek bunlardan biri değildir .
Kodunuz içeriyorsa @mail(...)
, bu hata ayıklamanıza yardımcı olacak önemli hata mesajlarını gizliyor olabilirsiniz. Kaldırın @
ve herhangi bir hata bildirilip bildirilmediğine bakın.
Sadece beton arızaları için hemen sonra kontrolerror_get_last()
etmeniz tavsiye edilir .
mail()
Dönüş değerini kontrol edin
mail()
fonksiyon:
İade TRUE
posta başarıyla teslim kabul edildi eğer FALSE
aksi. E-postanın teslim için kabul edildiğinden, postanın gerçekte hedeflenen hedefe ulaşacağı anlamına gelmediğini not etmek önemlidir.
Bunu not etmek önemlidir, çünkü:
- Bir
FALSE
dönüş değeri alırsanız, hatanın sunucunuzun postanızı kabul etmesinden kaynaklandığını bilirsiniz. Bu muhtemelen bir kodlama sorunu değil, bir sunucu yapılandırma sorunudur. Bunun neden olduğunu öğrenmek için sistem yöneticinizle konuşmanız gerekir.
- Bir
TRUE
iade değeri alırsanız, bu, e-postanızın kesinlikle gönderileceği anlamına gelmez. Bu, e-postanın PHP tarafından sunucudaki ilgili işleyicisine başarıyla gönderildiği anlamına gelir. PHP'nin kontrolü dışında e-postanın gönderilmesine neden olabilecek daha fazla hata noktası var.
Yani FALSE
oysa doğru yönde bir işaret yardımcı olacaktır TRUE
gelmez değil mutlaka e-posta başarıyla gönderildi anlamına gelir. Bu not etmek önemlidir!
Barındırma sağlayıcınızın e-posta göndermenize izin verdiğinden ve posta göndermeyi sınırlamadığından emin olun
Birçok paylaşılan web barındırıcısı, özellikle ücretsiz web barındırma sağlayıcıları, e-postaların sunucularından gönderilmesine izin vermez veya belirli bir süre içinde gönderilebilecek miktarı sınırlandırmaz. Bunun nedeni, spam gönderenlerin daha ucuz hizmetlerinden yararlanmalarını sınırlama çabalarıdır.
Barındırıcınızın e-posta sınırlamaları olduğunu veya e-posta gönderilmesini engellediğini düşünüyorsanız, bu tür sınırlamaları listelediklerini görmek için SSS'lerini kontrol edin. Aksi takdirde, e-posta gönderme konusunda herhangi bir kısıtlama olup olmadığını doğrulamak için desteklerine ulaşmanız gerekebilir.
Spam klasörlerini kontrol edin; e-postaların spam olarak işaretlenmesini önleme
Çoğu zaman, çeşitli nedenlerle, PHP (ve diğer sunucu tarafı programlama dilleri) aracılığıyla gönderilen e-postalar, alıcının spam klasöründe bulunur. Kodunuzda sorun gidermeden önce daima orada kontrol edin.
PHP aracılığıyla gönderilen postanın bir alıcının spam klasörüne gönderilmesini önlemek için, hem PHP kodunuzda hem de e-postalarınızın spam olarak işaretlenme şansını en aza indirmek için yapabileceğiniz çeşitli şeyler vardır. Michiel de Mare'den iyi ipuçları :
- E- postalarınızın ve alan adınızın birbirine ait olduğunu kanıtlamak ve alan adınızın taklit edilmesini önlemek için SPF ve DKIM gibi e-posta kimlik doğrulama yöntemlerini kullanın . SPF web sitesi, siteniz için DNS bilgilerini oluşturmak üzere bir sihirbaz içerir.
- Posta sunucunuzun IP adresinin, posta göndermek için kullandığınız alan adını gösterdiğinden emin olmak için ters DNS'nizi kontrol edin .
- Kullandığınız IP adresinin bir kara listede olmadığından emin olun
- Yanıtlama adresinin geçerli ve varolan bir adres olduğundan emin olun.
- Yalnızca e-posta adresini (örneğin
"John Smith" <john@blacksmiths-international.com>
) değil, Kime alanındaki muhatabın tam, gerçek adını kullanın .
- Abuse@alanadiniz.com.tr ve postmaster@alanadiniz.com gibi kötüye kullanım hesaplarınızı izleyin. Bu - bu hesapların var olduğundan emin olun, kendilerine gönderilenleri okuyun ve şikayetler üzerine harekete geçin.
- Son olarak, abonelikten çıkmayı gerçekten kolaylaştırın. Aksi takdirde, kullanıcılarınız spam düğmesine basarak aboneliğinizi iptal eder ve bu itibarınızı etkiler.
Bkz. Programlı olarak gönderdiğiniz e-postanın otomatik olarak spam olarak işaretlenmediğinden nasıl emin olabilirsiniz? bu konuyla ilgili daha fazla bilgi için.
Tüm posta başlıklarının sağlandığından emin olun
Bazı spam yazılımları, "Kimden" ve "Yanıtla" gibi ortak başlıklar eksikse postaları reddeder:
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
Posta başlıklarında sözdizimi hatası olmadığından emin olun
Geçersiz üstbilgiler, üstbilgileri olmaması kadar kötüdür. Yanlış bir karakter, e-postanızı raydan çıkarmak için gereken her şey olabilir. Tekrar kontrol edin PHP şekliyle sözdizimi doğru olduğundan emin olmak için değil sizin için bu hataları yakalamak.
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
Sahte From:
gönderici kullanma
Postanın bir Gönderen: göndereni olsa da, yalnızca herhangi bir değer kullanamazsınız . Özellikle kullanıcı tarafından sağlanan gönderen adresleri, postaların engellenmesinin kesin bir yoludur:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
Nedeni: @hotmail veya @gmail adreslerinden sorumlu olduğunu iddia etmek için web veya gönderen posta sunucunuz SPF / DKIM beyaz listeye eklenmemiş. Hatta From:
yapılandırılmadığı gönderen etki alanlarına sahip postaları bile sessizce bırakabilir .
Alıcı değerinin doğru olduğundan emin olun
Bazen sorun, e-postanın alıcısı için yanlış bir değere sahip olmak kadar basittir. Bunun nedeni yanlış bir değişken kullanılması olabilir.
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
Bunu test etmenin başka bir yolu da alıcı değerini mail()
fonksiyon çağrısına kodlamaktır :
mail('user@example.com', $subject, $message, $headers);
Bu, tüm mail()
parametreler için geçerli olabilir .
Birden çok hesaba gönder
E-posta hesabı sorunlarını ortadan kaldırmak için e-postanızı farklı e-posta sağlayıcılarındaki birden çok e-posta hesabına gönderin . E-postalarınız bir kullanıcının Gmail hesabına gelmiyorsa, aynı e-postaları bir Yahoo hesabına, bir Hotmail hesabına ve normal bir POP3 hesabına (ISS tarafından sağlanan e-posta hesabınız gibi) gönderin.
E-postalar diğer e-posta hesaplarının tümüne veya bir kısmına ulaşırsa, kodunuzun e-posta gönderdiğini biliyorsunuzdur, ancak büyük olasılıkla e-posta hesabı sağlayıcısı bunları bir nedenden dolayı engelliyor olabilir. E-posta herhangi bir e-posta hesabına ulaşmazsa, sorunun kodunuzla ilgili olması daha olasıdır.
Kodun form yöntemiyle eşleştiğinden emin olun
Form yönteminizi olarak ayarladıysanız , form değerlerinizi aramak için POST
kullandığınızdan emin olun $_POST
. Ayarladıysanız GET
veya hiç ayarlamadıysanız $_GET
, form değerlerinizi aramak için kullandığınızdan emin olun .
Form action
değerinizin doğru konumu gösterdiğinden emin olun
Form action
özelliğinizin PHP posta kodunuza işaret eden bir değer içerdiğinden emin olun .
<form action="send_email.php" method="POST">
Web barındırıcısının e-posta göndermeyi desteklediğinden emin olun
Bazı Web barındırma sağlayıcıları, e-postaların sunucuları üzerinden gönderilmesine izin vermez veya bunları etkinleştirmez. Bunun nedenleri değişebilir, ancak posta göndermeyi devre dışı bırakmışlarsa, bu e-postaları sizin için göndermek için üçüncü bir taraf kullanan alternatif bir yöntem kullanmanız gerekir.
Teknik desteklerine yönelik bir e-posta (çevrimiçi desteklerine veya SSS'lerine yapılan bir geziden sonra), sunucunuzda e-posta özelliklerinin olup olmadığını açıklığa kavuşturmalıdır.
localhost
Posta sunucusunun yapılandırıldığından emin olun
WAMP, MAMP veya XAMPP kullanarak yerel iş istasyonunuz üzerinde geliştiriyorsanız, iş istasyonunuza bir e-posta sunucusu yüklenmemiş olabilir. Biri olmadan, PHP varsayılan olarak posta gönderemez.
Temel bir posta sunucusu yükleyerek bunun üstesinden gelebilirsiniz. Windows için ücretsiz Mercury Mail'i kullanabilirsiniz .
E-postalarınızı göndermek için SMTP'yi de kullanabilirsiniz. Bkz bu büyük cevabı dan Vikas dwivedi Bunun nasıl öğrenmek için.
PHP'nin özel özelliklerini etkinleştir mail.log
MTA ve PHP'nin günlük dosyasına ek olarak , mail()
işlev için günlüğe kaydetmeyi özellikle etkinleştirebilirsiniz . Tam SMTP etkileşimini kaydetmez, en azından işlev çağrı parametrelerini ve çağırma komut dosyasını işler.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
Ayrıntılar için http://php.net/manual/tr/mail.configuration.php adresine bakın. (Bu seçenekleri php.ini
ya .user.ini
da ya da .htaccess
belki de etkinleştirmek en iyisidir .)
Bir posta test hizmeti ile kontrol edin
MTA / web sunucusu kurulumunuzu test etmek için kullanabileceğiniz çeşitli dağıtım ve spam kontrol hizmetleri vardır. Genellikle bir posta sondası gönderirsiniz: adresleri, daha sonra bir teslim raporu ve daha sonra daha somut hatalar veya analizler alırsınız:
Farklı bir posta kullanın
PHP'nin yerleşik mail()
işlevi kullanışlı ve çoğu zaman işi hallediyor ama eksiklikleri var . Neyse ki, yukarıda özetlenen sorunların birçoğunu ele almak da dahil olmak üzere daha fazla güç ve esneklik sunan alternatifler var:
Hepsi profesyonel bir SMTP sunucusu / servis sağlayıcısı ile birleştirilebilir. (E-posta kurulumu / yapılandırılabilirliği söz konusu olduğunda, tipik 08/15 paylaşılan web barındırma planları vurulur veya özlenir.)