error sending mail in php ?
Yesterday, ketika saya ingin mencoba lagi membuat script html email pada php. script php tersebut sebagai berikut :
function kirim_email($name, $email, $to_mail, $subject, $msg) {
$sending = false;
$eol = "\n";
$tosend = array();
if (!empty($name) && !empty($email) && !empty($to_mail) && !empty($subject) && !empty($msg)) {
$from_name = $name;
$from_mail = $email;
$sending = true;
}
if ($sending) {
$tosend['email'] = $to_mail;
$tosend['subject'] = $subject;
$tosend['headers'] = "From: \"".$from_name."\" <".$from_mail.">".$eol;
$tosend['headers'] .= "Content-type: text/html; charset=iso-8859-1".$eol;
$tosend['message'] = $msg;
if (mail($tosend['email'], $tosend['subject'], $tosend['message'] , $tosend['headers']))
return true;
else
return false;
}//-- if ($sending)
return false;
}
if (kirim_email("Gunslinger_", "no-reply@host.com", "yudha.gunslinger@gmail.com", "Hi!", "<strong>Testing sending email</strong>")){
echo "sukses";
)
?>
saya tak sadar bahwa ternyata ada yang salah dengan sistem saya, karena dari fungsi yang dipakai menghasilkan “sukses” pertanda fungsi php pengiriman email tersebut mengalami True. ketika saya menjalankan script email, dan saya tunggu. ternyata pesan tak kunjung datang ? dan saya re-send kembali, dan saya tunggu kembali. dan baru saya sadari jika memang ada yang salah pada program pengiriman email setelah saya membaca logging dari mail yang dilakukan oleh postfix / sendmail.
ternyata pengiriman pesan email mengalami error. error tersebut sebagai berikut :
gunslinger@c0debreaker:/var/log$ cat mail.log ...cut very big error logging... Dec 20 01:42:34 c0debreaker postfix/smtp[19046]: 74FBF30501: to= relay=none, delay=10, status=deferred (Name service error for name=gmail.com type=MX: Host not found, try again) gunslinger@c0debreaker:/var/log$
ternyata memang benar, ada yang salah dengan pengiriman email. namun darimana error tersebut ?
sekian dari di teliti, kemungkinan bisa terjadi karena pada beberapa berikut ini :
- tidak bisa meresolve domain, terhalang firewall / iptable ?
- ISP tidak mengizinkan port smtp (port: 25), alasan keamanan anti spam ?
- daemon postfix / sendmail yang tak berfungsi ?
- gmail melakukan blok pada ip yang dinamis ?
- kesalahan konfigurasi, sendmail pada php.ini ?
- permasalahan perizinan hak akses dari user www-data ketika mengakses sendmail, dikarenakan dibutuhkan superuser untuk mengakses postfix / sendmail ?
- kemungkinan lain yang belum di ketahui
dari sekian kemungkinan saya mencoba untuk menganalisa lebih jauh dari setiap kemungkinan
- tidak bisa meresolve domain, terhalang firewall / iptable ?
saya mengecek apakah rule pada iptable saya telah memblok akses pengiriman dan penerimaan .
gunslinger@c0debreaker:/var/log$ sudo iptables -L -v Chain INPUT (policy ACCEPT 22038 packets, 9915K bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 22842 packets, 6103K bytes) pkts bytes target prot opt in out source destination gunslinger@c0debreaker:/var/log$
ternyata tidak, iptable mengizinkan packet untuk keluar masuk dari sistem.
dan saya mencoba lagi untuk meload php pengiriman email tersebut di browser, pesan masih tak kunjung datang.
- ISP tidak mengizinkan port smtp (port: 25), alasan keamanan anti spam ?
saya cek kembali, kali ini saya scanning ip saya sendiri dari luar, apakah port SMTP di blok oleh ISP ?
gunslinger@c0debreaker:/var/log$ nmap 10.70.191.159 Starting Nmap 4.76 ( http://nmap.org ) at 2010-12-20 02:38 WIT Interesting ports on 10.70.191.159: Not shown: 992 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 25/tcp open smtp 53/tcp open domain 80/tcp open http 111/tcp open rpcbind 443/tcp open https 6667/tcp open irc Nmap done: 1 IP address (1 host up) scanned in 0.74 seconds gunslinger@c0debreaker:/var/log$
lagi2 bukan itu permasalahannya. kembali ke kemungkinan masalah lain.
- daemon postfix / sendmail yang tak berfungsi ?
dengan kemungkinan berikut, saya mencoba melakukan testing mengirimkan email dari shell.
gunslinger@c0debreaker:/var/log$ mail -s testing yudha.gunslinger@gmail.com Testing send email Cc: gunslinger@c0debreaker:/var/log$
lalu kemudian saya mengecek email apakah email tersebut masuk.

ternyata masuk ke dalam email, hanya saja masuk ke kotak spam dikarenakan ip pengirim yang dinamis, dan hostname pengirim yang tidak jelas.
- gmail melakukan blok pada ip yang dinamis ?
sepertinya tidak, karena testing pengiriman email di atas telah sampai . hanya saja masuk ke bagian spam.
- kesalahan konfigurasi, sendmail pada php.ini ?
saya cek kembali, pada settingan php.ini yang default.
[mail function] ; For Win32 only. SMTP = localhost ; For Win32 only. sendmail_from = me@localhost.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ;sendmail_path =
pada php.ini yang default, sendmail dilakukan dengan perintah langsung ke shell “sendmail -t -i”
saya mencoba mengubah sendmail path yang dipakai oleh php.
pertama, saya memastikan dimana letak binary sendmail tersebut.
gunslinger@c0debreaker:/var/log$ whereis sendmail sendmail: /usr/sbin/sendmail /usr/lib/sendmail /usr/share/man/man1/sendmail.1.gz gunslinger@c0debreaker:/var/log$
binary sendmail terletak di /usr/sbin/sendmail
dan saya letakan di default sendmail_path yang akan terpakai oleh php.
[mail function] ; For Win32 only. SMTP = localhost ; For Win32 only. sendmail_from = me@localhost.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). sendmail_path = /usr/sbin/sendmail
lalu saya simpan.
lagi – lagi saya mencoba untuk membuka php pengiriman email tersebut di browser, akhirnya pesan datang ke email yang di tuju.

dan berikut ini laporan dari mail.log dikatakan bahwa pengiriman pesan berhasil.
gunslinger@c0debreaker:/var/log$ cat mail.log ...cut cause very big logging... Dec 20 03:30:02 c0debreaker postfix/qmgr[3097]: 21A7CCC5D7: removed Dec 20 03:30:52 c0debreaker postfix/pickup[25674]: 89EA1CC5D7: uid=65534 from= Dec 20 03:30:52 c0debreaker postfix/cleanup[4371]: 89EA1CC5D7: message-id=<20101219203052.89EA1CC5D7@c0debreaker> Dec 20 03:30:52 c0debreaker postfix/qmgr[3097]: 89EA1CC5D7: from=, size=390, nrcpt=1 (queue active) Dec 20 03:30:58 c0debreaker postfix/smtp[4747]: 89EA1CC5D7: to=, relay=gmail-smtp-in.l.google.com[74.125.127.27]:25, delay=6.4, delays=0.07/0.01/1.9/4.4, dsn=2.0.0, status=sent (250 2.0.0 OK 1292790657 u16si6152439yhc.52) Dec 20 03:30:58 c0debreaker postfix/qmgr[3097]: 89EA1CC5D7: removed gunslinger@c0debreaker:/var/log$
message yang terdelay karena kegagalan sebelumnya juga terkirim.
Dengan demikian, di simpulkan bahwa keberhasilan dari fungsi php yang di buat tidak di tentukan oleh return code pada fungsi mail(). fungsi mail() tidak melakukan pengecekan lebih jauh terhadap laporan status pengiriman pesan email. fungsi mail() tersebut hanya bertugas mengirim dan return code false hanya di karenakan jika parameter yang tidak valid. kemungkinan, ada server2 di indonesia (beberapa kali pernah saya rasakan ketika mendevelopment website) bahwa sering kali fungsi mail() bernilai kembali benar (return True) tetapi email tak kunjung datang. dan pemilik server mengira (mungkin sudah yakin?), email sudah terkirim hanya masalah delay. padahal email akan tak kunjung datang.
Demikian yang saya tulis semoga berguna, keep in touch http://bit.ly/codebreaker ;)




recent comment