Wednesday, January 21, 2009

PEAR SMTP

Hari ini aku melanjutkan apa yang dikerjakan Neni dengan PEAR::Mail di server e-recruitment (yang sebetulnya.. pekerjaan saya ya harusnya :) ). Status sebelumnya, PEAR::Mail mampu mengirim ke smtp ingoing milik telkom. Tetapi tidak dapat mengirimkan email outgoing ( ke luar telkom) karena smtp yang itu kan.. memang khusus untuk email masuk. Untuk dapat mengirimkan email keluar, kita butuh outgoing SMTP. Kalo dari dalam Telkom, tinggal pakai SMTP-nya domino, berikan authentication sesuai username & password dari account email internal yg dipakai. Nah, kalo dari luar..(servernya kan Internet-facing, technically dia ada di luar intranet Telkom) kita butuh outgoing SMTP yang bisa dipakai anonymously (atau kalau gak, username&password yg bisa dipakai untuk ngirim email). Siang ini dapat bocoran nama salah satu anonynous SMTP punya telkom yang bisa digunakan.
Tetapi percobaan2 awal gagal terus. Ga tau kenapa. Kemudian kuaktifkan error logging PHP (lihat set_error_handler di PHP manual) dengan kode seperti ini (I hate coding without frameworks) :
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
error_log("at $errfile line $errline : $errstr ($errno)\n",3,"/usr/local/apache/htdocs/erecrut/logs/log1.log");
return true;
}
$old_error_handler = set_error_handler("myErrorHandler");

ok.. keluar errornya cuma sedikit, dan tidak meaningful (cuma notice nggak penting yang ketangkep).
Setelah diingat2, dulu Neni bermasalah dalam mencek error yang muncul (kalo ga salah, kadang tipenya boolean, kadang tipenya object). Dulu aku suruh ga usah dicek aja (karena ga tau cara yg benernya). Dan sekarang saatnya untuk mencari cara yang bener.. :)
Ternyata cara error handling PEAR::Mail yg bener itu mirip seperti ini :
$mail = $smtp->send($to, $headers, $body);
if (PEAR::isError($mail))
error_log("PEAR error: ".var_export($mail,true)."\n",3,"/usr/local/apache/htdocs/erecrut/logs/pearerror.log");
biarkan PEAR yang meriksa itu error ato bukan. Di sini aku pakai variasi error_log yang naruh pesan ke file, dan karena ngga ngerti pathnya relatif ke mana aku pake path absolut. Soalnya directory lognya harus di- chmod o+rw dulu.
Ternyata.. Ada error yang ditangkap file log ini.. Masalahnya ialah email kita ditolak oleh SMTP server gara2 mengirimkan SPAM. Pesannya kira2 seperti ini: 'localhost rejected because you sent SPAM emails'. Terpikir, mungkin ga ini ditolak gara-gara string nama servernya masih localhost ? Jangan2 dia mengenali komputer yang mengirim email cuma dari string nama servernya? String nama server ini dikirimkan di SMTP ketika memulai percakapan (HELO namaserver). Aku ganti nama servernya dan presto.. all is well.. :
$smtp = Mail::factory('smtp',
array ('host' => $host,
'port' => $port, 'localhost' => 'namaserver.di.sini.com'));

No comments: