Meskipun ada bagian dari jawaban ini yang hanya berlaku untuk penggunaan mail()
fungsi itu sendiri, banyak dari langkah pemecahan masalah ini dapat diterapkan ke sistem pengiriman PHP apa pun.
Ada berbagai alasan mengapa skrip Anda tampaknya tidak mengirim email. Sulit untuk mendiagnosis hal-hal ini kecuali ada kesalahan sintaksis yang jelas. Tanpa yang Anda perlu menjalankan melalui daftar periksa di bawah ini untuk menemukan potensi jebakan yang mungkin Anda temui.
Pastikan pelaporan kesalahan diaktifkan dan diatur untuk melaporkan semua kesalahan
Pelaporan kesalahan sangat penting untuk membasmi bug dalam kode Anda dan kesalahan umum yang ditemui PHP. Pelaporan kesalahan perlu diaktifkan untuk menerima kesalahan ini. Menempatkan kode berikut di bagian atas file PHP Anda (atau dalam file konfigurasi master) akan memungkinkan pelaporan kesalahan.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
Lihat Bagaimana saya bisa mendapatkan pesan kesalahan yang berguna dalam PHP? - jawaban ini untuk detail lebih lanjut tentang ini.
Pastikan mail()
fungsinya dipanggil
Ini mungkin tampak konyol tetapi kesalahan umum adalah lupa untuk benar-benar menempatkan mail()
fungsi dalam kode Anda. Pastikan itu ada di sana dan tidak dikomentari.
Pastikan mail()
fungsinya dipanggil dengan benar
bool mail (string $ to, string $ subject, string $ message [, string $ additional_headers [, string $ additional_parameters]])
Fungsi mail mengambil tiga parameter yang diperlukan dan opsional yang keempat dan kelima. Jika panggilan Anda kemail()
tidak memiliki setidaknya tiga parameter itu akan gagal.
Jika panggilan Anda ke mail()
tidak memiliki parameter yang benar dalam urutan yang benar, itu juga akan gagal.
Periksa log surat server
Server web Anda harus mencatat semua upaya untuk mengirim email melaluinya. Lokasi log ini akan bervariasi (Anda mungkin perlu bertanya kepada administrator server Anda di mana mereka berada) tetapi mereka biasanya dapat ditemukan di direktori root pengguna di bawah logs
. Di dalamnya akan ada pesan kesalahan yang dilaporkan server, jika ada, terkait dengan upaya Anda untuk mengirim email.
Periksa kegagalan koneksi Port
Port block adalah masalah yang sangat umum yang dihadapi sebagian besar pengembang saat mengintegrasikan kode mereka untuk mengirim email menggunakan SMTP. Dan, ini dapat dengan mudah dilacak di server maillogs (lokasi server mail log dapat bervariasi dari server ke server, seperti dijelaskan di atas). Jika Anda menggunakan server hosting bersama, port 25 dan 587 tetap diblokir secara default. Blok ini sengaja dilakukan oleh penyedia hosting Anda. Ini berlaku bahkan untuk beberapa server khusus. Ketika port-port ini diblokir, cobalah untuk terhubung menggunakan port 2525. Jika Anda menemukan port itu juga diblokir, maka satu-satunya solusi adalah dengan menghubungi penyedia hosting Anda untuk membuka blokir port-port ini.
Sebagian besar penyedia hosting memblokir port email ini untuk melindungi jaringan mereka dari mengirim email spam apa pun.
Gunakan porta 25 atau 587 untuk koneksi plain / TLS dan port 465 untuk koneksi SSL. Untuk sebagian besar pengguna, disarankan untuk menggunakan port 587 untuk menghindari batas tingkat yang ditetapkan oleh beberapa penyedia hosting.
Jangan gunakan operator penekan kesalahan
Ketika operator penekan kesalahan @
didahului dengan ekspresi dalam PHP, pesan kesalahan apa pun yang mungkin dihasilkan oleh ekspresi itu akan diabaikan. Ada keadaan di mana menggunakan operator ini diperlukan tetapi mengirim surat bukan salah satunya.
Jika kode Anda berisi @mail(...)
maka Anda mungkin menyembunyikan pesan kesalahan penting yang akan membantu Anda men-debug ini. Hapus @
dan lihat apakah ada kesalahan yang dilaporkan.
Ini hanya disarankan ketika Anda memeriksa denganerror_get_last()
tepat setelah kegagalan nyata.
Periksa nilai mail()
pengembalian
The mail()
Fungsi:
Kembali TRUE
jika surat berhasil diterima untuk pengiriman, FALSE
jika tidak. Penting untuk dicatat bahwa hanya karena surat diterima untuk pengiriman, BUKAN berarti surat itu benar-benar akan mencapai tujuan yang dimaksud.
Ini penting untuk diperhatikan karena:
- Jika Anda menerima
FALSE
nilai kembali, Anda tahu kesalahannya terletak pada server Anda menerima email Anda. Ini mungkin bukan masalah pengkodean tetapi masalah konfigurasi server. Anda perlu berbicara dengan administrator sistem Anda untuk mengetahui mengapa hal ini terjadi.
- Jika Anda menerima
TRUE
nilai kembali, itu tidak berarti email Anda pasti akan dikirim. Ini berarti email berhasil dikirim ke handler masing-masing di server oleh PHP. Masih ada lebih banyak titik kegagalan di luar kendali PHP yang dapat menyebabkan surel tidak terkirim.
Jadi FALSE
akan membantu mengarahkan Anda ke arah yang benar sedangkan TRUE
yang tidak selalu berarti email Anda berhasil dikirim. Ini penting untuk diperhatikan!
Pastikan penyedia hosting Anda memungkinkan Anda untuk mengirim email dan tidak membatasi pengiriman email
Banyak hosting bersama, terutama penyedia hosting web gratis, tidak mengizinkan email dikirim dari server mereka atau membatasi jumlah yang dapat dikirim selama periode waktu tertentu. Ini karena upaya mereka untuk membatasi spammer dari mengambil keuntungan dari layanan mereka yang lebih murah.
Jika menurut Anda host Anda memiliki batas email atau memblokir pengiriman email, periksa FAQ mereka untuk melihat apakah mereka mencantumkan batasan tersebut. Jika tidak, Anda mungkin perlu menjangkau dukungan mereka untuk memverifikasi jika ada batasan yang berlaku terkait pengiriman email.
Periksa folder spam; mencegah email ditandai sebagai spam
Seringkali, karena berbagai alasan, email yang dikirim melalui PHP (dan bahasa pemrograman sisi server lainnya) berakhir di folder spam penerima. Selalu periksa di sana sebelum memecahkan masalah kode Anda.
Agar email yang dikirim melalui PHP tidak terkirim ke folder spam penerima, ada berbagai hal yang dapat Anda lakukan, baik dalam kode PHP Anda maupun sebaliknya, untuk meminimalkan peluang email Anda ditandai sebagai spam. Kiat-kiat bagus dari Michiel de Mare meliputi:
- Gunakan metode otentikasi email, seperti SPF , dan DKIM untuk membuktikan bahwa email Anda dan nama domain Anda menjadi satu, dan untuk mencegah spoofing nama domain Anda. Situs web SPF mencakup panduan untuk menghasilkan informasi DNS untuk situs Anda.
- Periksa DNS balik Anda untuk memastikan alamat IP server surat Anda menunjuk ke nama domain yang Anda gunakan untuk mengirim email.
- Pastikan alamat IP yang Anda gunakan tidak ada dalam daftar hitam
- Pastikan alamat balasan adalah alamat yang ada dan valid.
- Gunakan nama asli penerima yang lengkap di bidang Ke, bukan hanya alamat email (mis
"John Smith" <john@blacksmiths-international.com>
.).
- Pantau akun penyalahgunaan Anda, seperti abuse@domainanda.com dan postmaster@domainanda.com. Itu berarti - pastikan bahwa akun-akun ini ada, baca apa yang dikirimkan kepada mereka, dan menindaklanjuti keluhan.
- Akhirnya, membuatnya sangat mudah untuk berhenti berlangganan. Jika tidak, pengguna Anda akan berhenti berlangganan dengan menekan tombol spam , dan itu akan memengaruhi reputasi Anda.
Lihat Bagaimana Anda memastikan email yang Anda kirim secara terprogram tidak secara otomatis ditandai sebagai spam? untuk lebih lanjut tentang topik ini.
Pastikan semua header surat disediakan
Beberapa perangkat lunak spam akan menolak email jika tidak ada tajuk umum seperti "Dari" dan "Balas ke":
$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);
Pastikan header surat tidak memiliki kesalahan sintaksis
Header yang tidak valid sama buruknya dengan tidak memiliki header. Hanya satu karakter yang salah yang diperlukan untuk menggagalkan email Anda. Periksa ulang untuk memastikan sintaks Anda benar karena PHP tidak akan menangkap kesalahan ini untuk Anda.
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
Jangan gunakan From:
pengirim palsu
Meskipun email harus memiliki pengirim Dari:, Anda tidak boleh hanya menggunakan nilai apa pun . Khususnya alamat pengirim yang dikotori oleh pengguna adalah cara yang pasti untuk membuat email diblokir:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
Alasan: web atau server email Anda tidak masuk dalam daftar SPF / DKIM untuk berpura-pura bertanggung jawab atas alamat @hotmail atau @gmail. Bahkan dapat secara diam-diam mengirim surat dengan From:
domain pengirim yang tidak dikonfigurasikan untuknya.
Pastikan nilai penerima sudah benar
Terkadang masalahnya sesederhana memiliki nilai yang salah untuk penerima email. Ini bisa jadi karena menggunakan variabel yang salah.
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
Cara lain untuk menguji ini adalah dengan mengkodekan nilai penerima ke mail()
pemanggilan fungsi:
mail('user@example.com', $subject, $message, $headers);
Ini dapat berlaku untuk semua mail()
parameter.
Kirim ke banyak akun
Untuk membantu mengesampingkan masalah akun email, kirim email Anda ke beberapa akun email di penyedia email berbeda . Jika email Anda tidak sampai di akun Gmail pengguna, kirim email yang sama ke akun Yahoo, akun Hotmail, dan akun POP3 biasa (seperti akun email yang disediakan ISP Anda).
Jika email sampai di semua atau beberapa akun email lain, Anda tahu kode Anda mengirim email, tetapi kemungkinan penyedia akun email memblokirnya karena alasan tertentu. Jika email tidak sampai pada akun email apa pun, masalahnya lebih mungkin terkait dengan kode Anda.
Pastikan kode cocok dengan metode formulir
Jika Anda telah mengatur metode formulir Anda POST
, pastikan Anda menggunakan $_POST
untuk mencari nilai formulir Anda. Jika Anda telah menyetelnya ke GET
atau tidak menyetelnya sama sekali, pastikan Anda menggunakan $_GET
untuk mencari nilai formulir Anda.
Pastikan action
nilai formulir Anda menunjuk ke lokasi yang benar
Pastikan action
atribut formulir Anda berisi nilai yang mengarah ke kode surat PHP Anda.
<form action="send_email.php" method="POST">
Pastikan host Web mendukung pengiriman email
Beberapa penyedia hosting web tidak mengizinkan atau mengaktifkan pengiriman email melalui server mereka. Alasannya mungkin berbeda, tetapi jika mereka telah menonaktifkan pengiriman surat, Anda harus menggunakan metode alternatif yang menggunakan pihak ketiga untuk mengirim email itu untuk Anda.
Email ke dukungan teknis mereka (setelah perjalanan ke dukungan online atau FAQ mereka) harus menjelaskan apakah kemampuan email tersedia di server Anda.
Pastikan localhost
server email dikonfigurasi
Jika Anda mengembangkan pada workstation lokal Anda menggunakan WAMP, MAMP, atau XAMPP, server email mungkin tidak diinstal pada workstation Anda. Tanpa satu, PHP tidak dapat mengirim email secara default.
Anda dapat mengatasinya dengan menginstal server email dasar. Untuk Windows Anda dapat menggunakan Mercury Mail gratis .
Anda juga dapat menggunakan SMTP untuk mengirim email Anda. Lihat jawaban hebat dari Vikas Dwivedi ini untuk mempelajari cara melakukan ini.
Aktifkan custom PHP mail.log
Selain file log MTA dan PHP, Anda dapat mengaktifkan pencatatan untuk mail()
fungsi secara khusus. Itu tidak merekam interaksi SMTP lengkap, tetapi setidaknya parameter fungsi panggilan dan skrip doa.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
Lihat http://php.net/manual/en/mail.configuration.php untuk detailnya. (Cara terbaik untuk mengaktifkan opsi ini di php.ini
atau .user.ini
atau .htaccess
mungkin.)
Periksa dengan layanan pengujian surat
Ada berbagai layanan pengiriman dan pemeriksaan spam yang dapat Anda gunakan untuk menguji pengaturan MTA / server web Anda. Biasanya Anda mengirim penyelidikan surat ke: alamatnya, lalu dapatkan laporan pengiriman dan kegagalan atau analisis yang lebih nyata nanti:
Gunakan mailer lain
mail()
Fungsi built-in PHP berguna dan seringkali menyelesaikan pekerjaan tetapi memiliki kekurangan . Untungnya ada alternatif yang menawarkan lebih banyak kekuatan dan fleksibilitas termasuk menangani banyak masalah yang diuraikan di atas:
Semuanya dapat dikombinasikan dengan server / penyedia layanan SMTP profesional. (Karena paket webhosting bersama 08/15 tipikal mengenai hit atau miss ketika datang ke pengaturan email / konfigurabilitas.)