<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = '[email protected]';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";
if ($_POST['submit']) {
if (mail ($to, $subject, $body, $from)) {
echo '<p>Your message has been sent!</p>';
} else {
echo '<p>Something went wrong, go back and try again!</p>';
}
}
?>
Saya sudah mencoba membuat formulir surat sederhana. Formulir itu sendiri ada di index.html
halaman saya , tetapi mengirimkan ke halaman terpisah "terima kasih atas kiriman Anda" thankyou.php
, di mana kode PHP di atas tertanam. Kode dikirimkan dengan sempurna, tetapi tidak pernah mengirim email. Bagaimana saya bisa memperbaikinya?
$from
Jawaban:
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.
Lihat Bagaimana saya bisa mendapatkan pesan kesalahan yang berguna dalam PHP? - jawaban ini untuk detail lebih lanjut tentang ini.
Pastikan
mail()
fungsinya dipanggilIni 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 benarFungsi mail mengambil tiga parameter yang diperlukan dan opsional yang keempat dan kelima. Jika panggilan Anda ke
mail()
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 dengan
error_get_last()
tepat setelah kegagalan nyata.Periksa nilai
mail()
pengembalianThe
mail()
Fungsi:Ini penting untuk diperhatikan karena:
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.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 sedangkanTRUE
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:
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":
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.
Jangan gunakan
From:
pengirim palsuMeskipun 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:
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.
Cara lain untuk menguji ini adalah dengan mengkodekan nilai penerima ke
mail()
pemanggilan fungsi: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 keGET
atau tidak menyetelnya sama sekali, pastikan Anda menggunakan$_GET
untuk mencari nilai formulir Anda.Pastikan
action
nilai formulir Anda menunjuk ke lokasi yang benarPastikan
action
atribut formulir Anda berisi nilai yang mengarah ke kode surat PHP Anda.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 dikonfigurasiJika 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.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.)
sumber
mail()
, itu melakukan pekerjaan yang buruk dan lebih sulit untuk men-debug daripada perpustakaan surat lainTambahkan header surat pada fungsi surat:
sumber
sumber
Jika Anda menggunakan konfigurasi SMTP untuk mengirim email Anda, coba gunakan PHPMailer sebagai gantinya. Anda dapat mengunduh perpustakaan dari https://github.com/PHPMailer/PHPMailer .
Saya membuat email saya mengirim dengan cara ini:
sumber
Cukup tambahkan beberapa tajuk sebelum mengirim surat:
Dan satu hal lagi. The
mail()
fungsi tidak bekerja di localhost. Unggah kode Anda ke server dan coba.sumber
$from = 'From: yoursite.com';
Yang tidak terlihat seperti alamat email lengkap yang valid, tidak ada bagian lokal. Anda telah mengganti header Dari dan menambahkan yang lain. Atau lebih tepatnya di$from
atas berlebihan dalam contoh Anda. Dan menjadi cacat mungkin adalah masalah awal OP.Ini bekerja untuk saya di 000webhost dengan melakukan hal berikut:
Masukkan langsung alamat email saat mengirim email:
Gunakan
''
dan tidak""
.Kode ini berfungsi, tetapi email diterima dengan jeda setengah jam.
sumber
Sebagian besar
mail()
fungsi dinonaktifkan di hosting bersama. Pilihan yang lebih baik adalah menggunakan SMTP. Opsi terbaik adalah Gmail atau SendGrid.SMTPconfig.php
SMTPmail.php
contact_email.php
sumber
Jika Anda hanya menggunakan
mail()
fungsi ini, Anda harus menyelesaikan file konfigurasi.Anda perlu membuka ekspansi surat, dan mengatur
SMTP smtp_port
dan sebagainya, dan yang paling penting, nama pengguna dan kata sandi Anda. Tanpa itu, surat tidak dapat dikirim. Anda juga dapat menggunakanPHPMail
kelas untuk mengirim.sumber
Coba dua hal ini secara terpisah dan bersama-sama:
if($_POST['submit']){}
$from
(hanya usus saya)sumber
Saya pikir ini harus melakukan trik. Saya baru saja menambahkan
if(isset
dan menambahkan rangkaian ke variabel dalam tubuh untuk memisahkan PHP dari HTML.sumber
Bagi siapa saja yang menemukan ini maju, saya tidak akan merekomendasikan menggunakan
mail
. Ada beberapa jawaban yang menyentuh ini, tetapi bukan mengapa .mail
Fungsi PHP tidak hanya buram, sepenuhnya bergantung pada MTA apa pun yang Anda gunakan (yaitu Sendmail ) untuk melakukan pekerjaan. hanyamail
akan memberi tahu Anda jika MTA gagal menerimanya (mis. Sendmail turun saat Anda mencoba mengirim). Ia tidak dapat memberi tahu Anda jika surat berhasil karena dibagikan. Dengan demikian (seperti rincian jawaban John Conde ), Anda sekarang dapat mengutak-atik log MTA dan berharap bahwa itu memberi tahu Anda cukup tentang kegagalan untuk memperbaikinya. Jika Anda menggunakan host bersama atau tidak memiliki akses ke log MTA, Anda kurang beruntung. Sayangnya, default untuk sebagian besar pemasangan vanilla untuk Linux menanganinya dengan cara ini.Pustaka surat ( PHPMailer , Zend Framework 2+, dll.), Melakukan sesuatu yang sangat berbeda
mail
. Mereka membuka soket langsung ke server email penerima dan kemudian mengirim perintah email SMTP langsung ke soket itu. Dengan kata lain, kelas bertindak sebagai MTA sendiri (perhatikan bahwa Anda dapat memberi tahu perpustakaan untuk menggunakanmail
akhirnya mengirim surat, tapi saya sangat menyarankan Anda tidak melakukan itu).Ini berarti Anda kemudian dapat langsung melihat respons dari server penerima (di PHPMailer, misalnya, Anda dapat mengaktifkan hasil debug ). Tidak ada lagi menebak apakah email gagal dikirim atau mengapa.
Anda juga mendapatkan manfaat dari antarmuka yang lebih baik. Dengan
mail
Anda harus mengatur semua tajuk, lampiran, dll. Dengan perpustakaan, Anda memiliki fungsi khusus untuk melakukan itu. Ini juga berarti fungsi melakukan semua bagian yang rumit (seperti header).sumber
sumber
Anda dapat menggunakan email config oleh CodeIgniter . Misalnya, menggunakan SMTP (cara sederhana):
Ini bekerja untuk saya!
sumber
Coba ini
sumber
Mungkin masalahnya adalah konfigurasi server email. Untuk menghindari masalah seperti ini atau Anda tidak perlu khawatir tentang masalah server surat, saya sarankan Anda menggunakan PHPMailer .
Ini adalah plugin yang memiliki semua yang diperlukan untuk mengirim email, dan satu-satunya hal yang harus Anda perhitungkan adalah mengaktifkan port SMTP (Port: 25 dan 465), diaktifkan.
sumber
Pastikan Anda telah menginstal Sendmail di server Anda.
Jika Anda telah memeriksa kode Anda dan memverifikasi bahwa tidak ada yang salah di sana, buka / var / mail dan periksa apakah folder itu kosong.
Jika kosong, Anda harus melakukan:
jika Anda berada di server Ubuntu.
sumber
Pertama-tama, Anda mungkin memiliki terlalu banyak parameter untuk fungsi mail () ... Anda dapat memiliki maksimum lima,
mail(to, subject, message, headers, parameters);
Sejauh
$from
variabel berjalan, yang seharusnya secara otomatis berasal dari hosting Anda jika Anda menggunakan Linux cPanel . Secara otomatis berasal dari nama pengguna dan alamat IP cPanel Anda.Pastikan juga Anda memiliki urutan variabel yang benar dalam fungsi mail () Anda.
Dalam
mail($to, $subject, $message, etc.)
urutan itu, atau ada kemungkinan itu tidak berfungsi.sumber
Jika Anda kesulitan mengirim email dengan PHP, pertimbangkan alternatif seperti PHPMailer atau SwiftMailer .
Saya biasanya menggunakan SwiftMailer setiap kali saya perlu mengirim email dengan PHP.
Penggunaan dasar:
Lihat dokumentasi resmi untuk informasi lebih lanjut tentang cara menggunakan SwiftMailer.
sumber
Bagi mereka yang tidak ingin menggunakan mailer eksternal dan ingin mail () pada server Linux khusus.
Caranya, bagaimana surat PHP, dijelaskan
php.ini
pada bagian ini[mail function]
.Parameter
sendmail-path
menggambarkan bagaimana sendmail dipanggil. Nilai defaultnya adalahsendmail -t -i
, jadi jika Anda dapat bekerjasendmail -t -i < message.txt
di konsol Linux - Anda akan selesai. Anda juga dapat menambahkanmail.log
ke debug dan pastikan mail () benar-benar dipanggil.MTA yang berbeda dapat diimplementasikan
sendmail
. Mereka hanya membuat tautan simbolis ke binari mereka dengan nama itu. Sebagai contoh, di Debian defaultnya adalah Postfix . Konfigurasikan MTA Anda untuk mengirim email dan mengujinya dari konsol dengansendmail -v -t -i < message.txt
. Filemessage.txt
harus berisi semua tajuk pesan dan isi, alamat tujuan untuk amplop akan diambil dariTo:
tajuk. Contoh:Saya lebih suka menggunakan ssmtp sebagai MTA karena sederhana dan tidak perlu menjalankan daemon dengan port yang terbuka. ssmtp hanya cocok untuk mengirim surat dari localhost . Itu juga dapat mengirim email yang diautentikasi melalui akun Anda pada layanan surat publik. Instal ssmtp dan edit file konfigurasi
/etc/ssmtp/ssmtp.conf
. Untuk dapat juga menerima mail sistem lokal ke akun Unix (misalnya peringatan untuk melakukan root dari cron jobs), konfigurasikan/etc/ssmtp/revaliases
file.Ini adalah konfigurasi saya untuk akun saya di surat Yandex:
sumber
Ini hanya akan memengaruhi segelintir kecil pengguna, tetapi saya ingin mendokumentasikannya untuk segelintir kecil itu. Anggota segelintir kecil ini menghabiskan 6 jam untuk memecahkan masalah naskah surat PHP yang berfungsi karena masalah ini.
Jika Anda pergi ke universitas yang menjalankan XAMPP dari www.AceITLab.com, Anda harus tahu apa yang profesor kami tidak memberi tahu kami: Firewall AceITLab (bukan firewall Windows) memblokir MercuryMail di XAMPP. Anda harus menggunakan klien email alternatif, pear bekerja untuk kami. Anda harus mengirim ke akun Gmail dengan pengaturan keamanan rendah.
Ya, saya tahu, ini sama sekali tidak berguna untuk email dunia nyata. Namun, dari apa yang saya lihat, pengaturan akademik dan dunia nyata sering memiliki sedikit kesamaan yang berharga.
sumber
Jika Anda menjalankan kode ini di server lokal (mis. Komputer Anda untuk tujuan pengembangan), kode itu tidak akan mengirim email ke penerima. Ini akan membuat
.txt
file di folder bernamamailoutput
.Dalam hal ini jika Anda menggunakan layanan selang gratis, suka
000webhost
atauhostinger
, penyedia layanan tersebut menonaktifkanmail()
fungsi untuk mencegah penggunaan spoofing email, spamming, dll. Saya lebih suka Anda menghubungi mereka untuk melihat apakah mereka mendukung fitur ini.Jika Anda yakin bahwa penyedia layanan mendukung fungsi mail (), Anda dapat memeriksa manual PHP ini untuk referensi lebih lanjut,
Surat PHP ()
Untuk memeriksa cuaca layanan hosting Anda mendukung fungsi mail (), coba jalankan kode ini (ingat untuk mengubah alamat email penerima) :
sumber
Instalasi Sendmail untuk Debian 10.0.0 ('Buster') ternyata sepele!
php.ini
Instal paket sendmail standar (memungkinkan 'kirim'):
Perintah lain-lain yang bermanfaat:
Verifikasi (kemampuan mengirim)
Di atas butuh sekitar 5 menit. Maka saya membuang 5 jam ... Jangan lupa untuk memeriksa folder spam Anda !
sumber
Ada beberapa kemungkinan:
Anda menghadapi masalah server. Server tidak memiliki server surat apa pun. Jadi surel Anda tidak berfungsi, karena kode Anda baik-baik saja dan surel berfungsi dengan baik.
Anda tidak mendapatkan nilai yang diposting. Coba kode Anda dengan nilai statis.
Gunakan email SMTP untuk mengirim email ...
sumber
Anda dapat menggunakan libmail: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en
sumber
mail()
pembungkus fungsi. Hanya menambahkan konstruksi pesan dan beberapa tipuan.Anda dapat melihat kesalahan Anda dengan:
Dan kode sampel saya adalah:
sumber
SMTPDebug = 0
tidak membantu. Atau "kata sandi" biasa tidak akan berfungsi dengan GMail. Jawaban ini tidak banyak berkontribusi di sini.Selama sistem sendmail Anda berfungsi, kode Anda harus dimodifikasi sebagai berikut:
Ini memungkinkan Anda mengirim email berbasis HTML.
Yang menarik:
Catatan:
<<<EOB
sintaks memerlukan penanda EOB terakhir dimulai sebagai awal dari baris dan tidak memiliki spasi atau karakter apa pun setelah tanda titik koma.sumber