Pertanyaan
Saat ingin mengirim email, muncul pesan “sendmail: Can’t send mail: Mail must not have multiple From addresses”. Menurut artikel ini, Gagal mengirim email di skrip, saya tidak boleh mencetak header From dua kali. Tapi skrip saya di bawah ini tidak mencetak From dua kali?
<?
# pengisi form
$nama = 'akyu';
$email = 'akyu@domainkyu.com';
# string yg jadi masalah
$datetime = date("F j Y g:i:s a");
# setup header untuk menyesuaikan dengan restriksi
$addheaders = "From: noreply@educoachinternational.com";
$addheaders .= "Reply-to: $nama <$email>";
$subject = "$nama mengisi form $datetime";
$mailto = "aku@example.com";
$messagebody = "$nama mengisi form $datetime dan mengirim ke email $mailto dengan $addheaders";
$mail_sent = @mail("$mailto", "$subject", "$messagebody", "$addheaders");
echo $mail_sent ? "Sent" : "Fail";
?>
Jawaban
Anda kurang menambahkan 1 newline di akhir header. Sesuai instruksi di manual PHP, setiap header tambahan perlu diakhiri dengan newline.
$addheaders = "From: noreply@educoachinternational.com\n";
Contoh lain jika ada beberapa header:
$addheaders = "From: foo@bar\nPrecedence: bulk\nX-Foo: Bar\n";
Cara kerja fungsi mail() di PHP adalah membuat header standar (seperti From, Date, dsb) lalu menambah header tambahan ($addheaders dalam contoh skrip di atas) di bawah header standar tersebut. Lalu setelah itu PHP akan menambahkan 1 newline untuk mengakhiri header, dan lalu mencetak bodi email.
Jika $addheaders tidak mengandung newline, maka bodi email akan dianggap header karena kurang 1 newline sebagai pemisah header dan bodi. Header dan bodi dipisahkan oleh 1 baris kosong (“\n\n”). Dan kebetulan jika di dalam bodi terdapat baris yang di awali oleh “From: ” maka akan dianggap sebagai header From lagi oleh sendmail sehingga aturan “tidak boleh ada multiple From headers” terlanggar.