Gagal mengirim email di skrip
Untuk berdiskusi dengan sesama programer dan peminat
PHP, bergabunglah dengan milis id-php,
milis PHP Indonesia paling aktif sejak 2002. Untuk subscribe,
kunjungi halaman web milis atau kirimkan email kosong ke id-php-subscribe@yahoogroups.com.
Jika Anda lebih suka forum diskusi berbasis web, kunjungi
Forum
PHP Masterweb. |
Masalah
Skrip PHP/CGI (contoh: skrip guestbook, formmail, contact us) gagal mengirim email. Pesan error antara lain:
- Mail must have Subject header
- Mail must not have multiple Subject header
- Mail must not have multiple From header
- Too many recipients to popular spam target domain: ...
- Sender domain (...) does not belong to user, please use your own domain
- (jika menggunakan SMTP ke localhost) Error Relaying Denied
- dll
Penjelasan/Solusi
Di server hosting MWN, program sendmail yang dipasang di server (spanel-sendmail) diperlengkapi dengan beberapa pengecekan tambahan yang lebih strict. Tujuannya adalah mencegah dan mengurangi dampak spamming yang dilakukan oleh spammer yang memanfaatkan/mengeksploit skrip PHP/CGI milik klien hosting. Seperti diketahui, spammer kini banyak memanfaatkan kelemahan pada skrip PHP, terutama fungsi mail()-nya, untuk mengirim spam dari server hosting orang lain. Dengan pengecekan-pengecekan tambahan pada spanel-sendmail, skrip PHP/CGI Anda lebih terlindungi dari penyalahgunaan. Strategi ini terbukti berhasil menekan jumlah spam keluar, terlihat dari sudah jarangnya server-server hosting terdaftar di DNS blacklist seperti spamhaus/spamcop/dll sejak instalasi spanel-sendmail Juli 2006 hingga artikel ini ditulis.
Beberapa pengecekan tambahan yang dilakukan oleh spanel-sendmail:
- mail harus mengandung header Subject.
- pembatasan jumlah To/Cc per email.
- pembatasan jumlah To/Cc ke domain-domain yang biasa dipakai untuk target spammer, mis: hotmail.com, aol.com, dll.
- pelarangan header Subject: atau From: yang dobel (indikasi ada penyuntikan/exploit terhadap fungsi mail() PHP).
- quota pengiriman email by default hanya beberapa puluh per jam dan beberapa ratus per 24 jam (namun jika aplikasi web Anda membutuhkan lebih, mis untuk pengiriman mailing list via web atau skrip shell, Anda dapat meminta staf kami untuk meningkatkan limit ini).
- by default From: harus sama dengan domain yang terdaftar pada account hosting (contoh: skrip formmail PHP Anda ada di http://www.tokoku.com/formmail.php, maka Anda harus menggunakan alamat From: <sesuatu@tokoku.com>.
- dll.
Agar skrip Anda terhindar dari pengecekan spanel-sendmail, pastikan agar bentuk email yang Anda gunakan "proper" dan tidak melanggar aturan-aturan yang ada, seperti tertera di atas.
Multiple header
Salah satu contoh kasus yang sering dijumpai adalah skrip yang menghasilkan header Subject atau From yang dobel, sehingga ditolak oleh spanel-sendmail. Contohnya, potongan skrip PHP berikut:
$to = "b@b.com";
$body = "Contoh bodi";
$subject = "Contoh subjek";
$headers = "From: <a@a.com>\n";
$headers .= "Subject: FORM MAIL: $subject\n";
mail($to, $subject, $body, $headers);
Perhatikan baris kelima pada kode di atas, yaitu:
$headers .= "Subject: FORM MAIL: $subject\n";
Sebetulnya fungsi mail() sudah menerima argumen kedua berupa subjek, dan PHP akan menghasilkan header email seperti ini:
To: <b@b.com>
Subject: Contoh subjek
Sehingga jika ditambah dengan $headers, akan menjadi:
To: <b@b.com>
Subject: Contoh subjek
From: <a@a.com>
Subject: FORM MAIL: Contoh subjek
Walhasil, header Subject-nya dobel. Dan ini diasumsikan mencurigakan oleh spanel-sendmail dan ada kemungkinan skrip tereksploit/terinjeksi, sehingga ditolak.
Solusinya, buang baris kelima. Tidak perlu lagi memasukkan header Subject di extra headers (argumen ke-4), karena header Subject sudah akan dihasilkan oleh fungsi mail() PHP melalui argumen ke-2 fungsi mail().
Contoh Skrip yang dianjurkan
Misal nama domain e-mail Anda bernard.or.id
<?
$headers = "From: support@bernard.or.id\r\n";
$headers .= "Reply-to: me@yahoo.com.sg\r\n";
$mail_sent = @mail("you@yahoo.com", "Judul TEST", "Isi TEST", $headers);
echo $mail_sent ? "Terkirim" : " Gagal";
?>
From mesti menggunakan domain sendiri, dalam hal ini bernard.or.id. Skrip ini akan bisa mengirim dengan filter 'Wajibkan From berasal hanya dari domain klien' aktif di SPANEL
Mengirim email menggunakan SMTP
Jika skrip Anda menggunakan SMTP ke localhost untuk mengirim email, maka Anda akan menjumpai pesan kesalahan ERR_RELAYING_DENIED. Terkecuali jika Anda menggunakan otentikasi (user+password) atau Anda mengirim ke domain lokal yang ada di server yang sama. Ini karena, demi alasan keamanan, fasilitas merelay ke email luar via SMTP lokal ditutup untuk meminimasi spam misalnya via eksploit terhadap PHPBB.
Mengirimkan email lewat SMTP ke localhost saat ini tidak dianjurkan dulu. Gunakanlah sendmail (yaitu: fungsi mail() jika di PHP, atau modul Email::Send::Sendmail di Perl misalnya, dll).
Penutup
Jika Anda masih mengalami masalah, jangan ragu untuk menghubungi technical support.
Untuk berdiskusi dengan sesama programer dan peminat
PHP, bergabunglah dengan milis id-php,
milis PHP Indonesia paling aktif sejak 2002. Untuk subscribe,
kunjungi halaman web milis atau kirimkan email kosong ke id-php-subscribe@yahoogroups.com.
Jika Anda lebih suka forum diskusi berbasis web, kunjungi
Forum
PHP Masterweb. |
|