break a time, with break the c0de…

php

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.

email, sending, error, mail(), function

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.

email, sending, error, mail(), function

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 ;)