12 Temmuz 2009 Pazar

Zend_Mail_Storage_Pop3 Zend_Mail Kullanimi

Yazacağımız bir ticket sistemi için uygun kütüphane bakarken en iyisinin Zend olduğuna karar verdim. Zend de dahi bazı eksikler olmasına rağmen ne varki okunabilirlik, dökümantasyon ve destek açısından (google) en iyisi zend gözüküyordu.

Olaya burdan başlayalım.
http://zendframework.com/manual/en/zend.mail.read.html

Pop3 ile, gelen emailleri okumak için Zend_Mail_Storage_Pop3 sınıfı kullanılmakta
iyi güzel diyip emailleri alıyorsunuz ama olay bundan sonra başlıyor. Çünkü her email in ayrı birde derdi ve sıkıntısı var.


$configurations = array(
'host' => $settings['popHost'],
'port' => $settings['popPort'],
'user' => $settings['user'],
'password' => $settings['password']
);

$mail = new Zend_Mail_Storage_Pop3 ( $configurations );

self::$_settings = ( object ) $settings;
echo $mail->countMessages ( ) . "

messages found

\n";


Şeklinde parametreleri girince emailleri alıp adetini ekrana basıyorsunuz.
Gmail i okumak için ssl özelliği var ama siz hosta ssl://pop.gmail.com port a 995 yazarsanızda iş görüyor.

Aşağıda örnek kullanım ile ilgili kodları göreceksiniz. Bu kodlarda gelen dosyaları almaktan tutun da mesaj ve konuya kadar bütün verinin alınması mevcut. Size düşen biraz incelemek.


foreach ( $mail as $messageNum => $message ) {

$fromEmail = Helper_Common::getEmailAddress ( $message->from );
$fromName = Helper_Common::getName ( $message->from );

$recordUniqueID = $mail->getUniqueId ( $messageNum );

//mail daha once eklenmediyse ekle
if ( self::isExistMail ( $recordUniqueID ) == false ) {
$arrAttach = array ();
/**
* Gelen verileri tiplerine gore ayristiriyoruz
*/
foreach ( new RecursiveIteratorIterator ( $message ) as $no => $parts ) {
//bazi emaillerde contentTransferEncoding olmuyor o yuzden bunu koydum
try {
$contentTransferEncoding = $parts->contentTransferEncoding;
} catch ( Zend_Exception $e ) {
$contentTransferEncoding = '';
}

try {
//apllicationa gore bakmak olmuyor ekte text/plain olabiliyor
//o yuzden name gore bakiyoruz
$tmpfilename = self::getFileName ( $parts->contentType );

if ( $tmpfilename != false ) {
$arrAttach[] = array(
'FileName'=>$tmpfilename, 'ContentType' => $parts->contentType,'Part'=> self::decode ( $contentTransferEncoding, $parts ),
'ContentTransferEncoding' => $contentTransferEncoding
);
}

if ( strtok ( $parts->contentType, ';' ) == 'text/plain' && $tmpfilename == false ) {
$part = $parts;
$part->contentTransferEncoding = $contentTransferEncoding;
}
} catch ( Zend_Mail_Exception $e ) {
//echo $e;
}
}
/**
* Bazen yukardaki foreach e girilmiyor o zaman direk atiyoruz
*/
if ( $part == null ) {
$part = $message;
while ( $part->isMultipart ( ) ) {
$part = $message->getPart ( 1 );
}

try {
$contentTransferEncoding = $part->contentTransferEncoding;
} catch ( Zend_Exception $e ) {
$contentTransferEncoding = '';
}

$part->contentTransferEncoding = $contentTransferEncoding;
}

$recordSubject = self::convertSubjectToUTF8 ( $message->subject, $part->contentTransferEncoding );

/**
* Message
*/
$content = $part->getContent ( );
$recordMessage = self::convertContentToUTF8 ( $content, $part->contentTransferEncoding, $part->contentType );
$recordHeaders = $mail->getRawHeader ( $messageNum );

/**
* Attachment
*/
for ( $i = 0; $i < count ( $arrAttach ); $i++ ) {
$filename_ = $arrAttach [ $i ]['FileName'];
$fileExt = pathinfo($filename_, PATHINFO_EXTENSION);
$attachpart_ = $arrAttach [ $i ]['Part'];
$attachcontentType = $arrAttach [ $i ]['ContentType'];
$contentTransferEncoding = $arrAttach [ $i ]['ContentTransferEncoding'];
}

//email ile isimiz bitince siliyoruz
$mail->removeMessage($messageNum);
}
}



Yukarda kullanılan önemli metodlar

/**
*
* @param $content
* @param $contentTransferEncoding - 7bit,quoted-printable biciminde data
* @param $toContentType - text/plain; charset=ISO-8859-9 biciminde data
* @return unknown_type
*/
public static function convertContentToUTF8 ( $content, $contentTransferEncoding, $contentType ) {

if ( $contentTransferEncoding == '' ) {
return $content;
}

$contentType = self::getCharset ( $contentType );

$content = self::striptags ( $content );

if ( $contentType == 'us-ascii' || $contentType == false ) {
return htmlspecialchars ( $content );
} else {
return mb_convert_encoding ( htmlspecialchars ( self::decode ( $contentTransferEncoding, $content ) ), "UTF-8", $contentType );
}
}

public static function convertSubjectToUTF8 ( $subject, $contentTransferEncoding = '' ) {
if ( $contentTransferEncoding == '' ) {
return $subject;
}

return imap_utf8 ( self::striptags ( $subject ) );
}


public static function striptags ( $str ) {
return strip_tags ( html_entity_decode ( $str ) ); //strip all tags ...no mercy!
}

public static function decode ( $encoding, $text ) {
$encoding = trim ( $encoding );
switch ( $encoding ) {
case '7bit' :
$text = imap_8bit ( $text );
break;
case 'binary' :
$text = imap_binary ( $text );
break;
case 'base64' :
$text = imap_base64 ( $text );
break;
case 'quoted-printable' :
$text = imap_qprint ( $text );
break;
case '' :
default :
$text = imap_8bit ( $text );
//$text=$text;
}
return $text;
}


İpucu: En önemli kısım transferencoding olayı Biz kastık başkadı kasmasın :)

Hiç yorum yok: