Tuesday, January 04, 2011

Mastering PHP: Mail functions

Веб хөгжүүлэгчдийн өдөр тутам ашигладаг техникүүд дотор мэйлтэй холбоотой ажиллагаа яах аргагүй чухалд орно. Үүнийг интернэт программчлалын хамгийн түгээмэл хэлний нэг болох PHP дээр хэрэгжүүлсэн хэд хэдэн бэлэн санг ашиглан хэрэгжүүлье:

1. Imap, POP3 серверээс мэйл унших
 Эхлээд мэдээж мэйлтэй ажиллах нэмэлт санг суулгах хэрэгтэй. Үбүнтү систем дээр 

sudo apt-get install php5-imap  php5-cli 
гээд суулгачихна.


Олон файлд дахин дахин имэйл хаяг, нууц үг хийхгүй нь тулд config.inc.php файл үүсгэчихье:
config.inc.php file code:

< ?
$_mail_addr = 'your@gmail.com';
$_mail_pass = 'your_gmail_pass';
$_mail_in_serv = 'imap.googlemail.com';
$_mail_out_serv = 'smtp.googlemail.com';
$_to_address = 'test@gmail.com';
?>


Уг php5-imap нэмэлт дэхь стандарт мэйл функцээр серверээс имэйл уншиж үзэе:
read_gmail_basic.php file code:
< ? 
require('config.inc.php');
$mbox = imap_open("{".$_mail_in_serv.":993/imap/ssl/novalidate-cert}", $_mail_addr, $_mail_pass);

echo "\r\n imap error: ", imap_last_error(), "\r\n\r\n";

echo "Mailboxes\n";

$folders = imap_listmailbox($mbox, "{".$_mail_in_serv.":993}", "*");
if ($folders == false) {
    echo "Call failed
\n";
} else {
    foreach ($folders as $val) {
        echo $val . "
\n";
    }
}
echo "headers in Inbox\n";
$headers = imap_headers($mbox);
if ($headers == false) {
    echo "Call failed
\n";
} else {
    foreach ($headers as $val) {
        echo $val . "
\n";
    }
}
imap_close($mbox);
?>

Дээрх код нь мэйл доторх хавтасуудыг харуулаад, Inbox доторх бүх мэйлүүдийн толгойг хэвлэж харуулна. Хэрвээ уг мэйл хаягт их олон мэйл байгаа бол бүгдийг нь хэвлэх нь байна, тийм болохоор имэйлүүдээс шүүж, ялгаж авах хэрэгцээний үүднээс дараах жижиг классыг ашиглаж үзье:


2. Imap, POP3 серверээс мэйл шүүж унших
MailParser class эндээс татаж авна. Ингээд дахиад gmail хаягаасаа нээгээгүй буюу шинэ мэйлүүдээ уншаад үзье: 

read_gmail_filter.php
< ?
require('config.inc.php');
require_once(dirname(__FILE__) . '/MailParser.php');

$obj = new MailParser("{".$_mail_in_serv.":993/imap/ssl/novalidate-cert}", $_mail_addr, $_mail_pass);

//$obj->pasrseMessagesByRecDate('01-03-2011');

//$obj->pasrseMessagesByFromAddress('abc.xyz@gmail.com', true);
//$obj->pasrseMessagesBySubject('test4');
$obj->pasrseUnreadMessages();
//$obj->pasrseMessageById(4, true);

// Getting result
$result = $obj->getResult();

// Retrieving the message information from $result
foreach($result as $msg) {
    
    $palinText        = $msg['plainBody'];
    $html            = $msg['htmlBody'];
    $header            = $msg['headers'];
    $attachments    = $msg['attachments'];

    //print_r($palinText);
    //print_r($html);
    print_r($header);
}
?>

Дээрх код доторхи pasrseMessagesByRecDate, pasrseMessagesByFromAddress, pasrseMessagesBySubject гэх мэт хайлт хийх функцүүдээс аль тохиромжтойгоо ашиглаарай.
Гэхдээ их олон имэйл дотроос хайлт хийхэд бага зэрэг удаж байгаа тал ажиглагдсан.

3. SMTP SSL/TSL сервер ашиглаж мэйл илгээх
Мэйл функц дотроос хамгийн их ашигладаг нь мэдээж мэйл илгээх хэсэг. Гэхдээ php generated mail илгээхэд ихэвчлэн spam box, junk folder руу орчихоод байдаг шүү дээ. Тэгвэл жинхэнэ (valid mail address) ашиглавал ингэхгүй. PHPMailer гээд бас л түгээмэл ашигладаг класс ашиглая. Эндээс татаж аваарай. Энэ жишээнд v5.1 хувилбарыг ашиглав.

send_gmail.php file code:
< ?
require('config.inc.php');
error_reporting(E_STRICT);
date_default_timezone_set('Asia/Ulaanbaatar');
require_once('class.phpmailer.php');

$mail             = new PHPMailer();
$body             = 'test body'; 
$body             = eregi_replace("[\]",'',$body);
$mail->IsSMTP();
$mail->Host       = "mail.yourdomain.com";
$mail->SMTPDebug  = 2;              
$mail->SMTPAuth   = true;            
$mail->SMTPSecure = "ssl";           
$mail->Host       = $_mail_out_serv;
$mail->Port       = 465;          
$mail->Username   = $_mail_addr;
$mail->Password   = $_mail_pass;
$mail->SetFrom($_mail_addr, 'Your name');
$mail->Subject    = "Test Subject via smtp (Gmail), basic";
$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!";
$mail->MsgHTML($body);
$mail->AddAddress($_mail_to_addr, "First last");

if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
} else {
  echo "Message sent!";
}
?>

За ингээд боллоо доо! :) Гэхдээ ингэж сурчихаад спам илгээгээд, зар тараагаад байв даа гэсэн :D Сүүлийн үед мэйлээ нээх тоолонд 1-2 зар сурталчилгаа бүхий мэйл бол найдвартай байх болсон шүү, spam гэж мэдээлж л орхидог



Бичлэг таалагдсан бол сурталчилгаан дээр +1 дарж тус хүргээрэй ;)

0 Comments:

blogger templates | Make Money Online