«Tidak ada surat yang datang» punya dua sebab yang sangat berbeda: servernya tidak pernah mengirimnya, atau ia mengirimnya dan penerimanya menolak. Log surat menjawab itu dalam satu baris, dan segala hal lain mengikuti jawabannya.

tail -50 /var/log/mail.log
  • status=sent — sudah berangkat. Masalahnya ada pada pengantaran, bukan pengiriman: lihat artikel tentang surat yang mendarat di spam.
  • status=bounced — penerimanya menolak, dan baris itu menyebut sebabnya.
  • Tidak ada sama sekali — aplikasinya tidak pernah menyerahkan apa pun.

Kalau tak ada apa pun yang sampai ke log

Fungsi mail() milik PHP mengembalikan true ketika program surat setempat MENERIMA pesan itu, dan itu bukan hal yang sama dengan mengirimkannya. Kalau tidak ada program surat yang terpasang, ia mengembalikan false, dan kebanyakan aplikasi mengabaikannya.

php -r 'var_dump(mail("you@example.com","test","body"));'
which sendmail

Pakailah SMTP, bukan mail()

SMTP terautentikasi ke kotak surat Anda sendiri lebih dapat diandalkan dan jauh lebih baik diantarkan: pesannya bertanda tangan dan datang dari server yang punya reputasi, bukan dari sebuah proses web.

Host: mail.yourdomain.com
Port: 465 (SSL) or 587 (TLS)
User: the full address
From: the SAME address
Alamat pada kolom From haruslah kotak surat yang benar-benar ada di domain pengirim. Formulir yang mengirim dengan alamat pengunjung akan gagal SPF di pihak penerima, sebab server Anda tidak berhak mengirim atas namanya. Taruh pengunjungnya di Reply-To.

Ujilah jalurnya, bukan formulirnya

swaks --to you@example.com --from noreply@yourdomain.com --server mail.yourdomain.com:587 -tls -au noreply@yourdomain.com

Itu menguji SMTP secara langsung dan mencetak seluruh percakapannya. Kalau berhasil tetapi situsnya tetap gagal, kesalahannya ada pada pengaturan aplikasi, bukan pada server suratnya.

Periksa antreannya di samping lognya: mailq. Pesan yang tersangkut di antrean berarti sudah diterima tetapi belum diantarkan, dan antrean itu menyebutkan alasan ia menunggu.