PHP – Mailden Attachment Okuma
Tarih: : 18 Tem, 2012 Kategori: PHP, Programlama | 2 yorum
Daha önceki bir yazımda PHP kullanarak mail kutunuzdan maillerinizi nasıl çekebileceğinizi ve bunları nasıl başka bir maile yönlendirebileceğinizi anlatmıştım. Bu yazıda ise maillerinizdeki ekleri istediğiniz bir dizine kaydetmeyi anlatıyorum. Kod aynı zamanda inline ekleri de işleyebiliyor.
<?php
//Mail bilgileri
$mail_server = “{mail.domain.com:110/pop3/notls}INBOX”; // notls sertifika hatasını ignore eder.
$mail_user = “kullaniciadi@domain.com”; // mail kullanıcı adı
$mail_pass = “abc123″; // mail şifresi$imap = imap_open($mail_server, $mail_user, $mail_pass); // mail bağlantısını açıyoruz
// bağlantı sırasında bir hata oluşursa aşağıdaki komutu çalıştırarak hatayı görüntüleyebiliriz.
/*print_r(imap_errors());*/$message_count = imap_num_msg($imap); // mail kutusunda kaç mail olduğunu alıyoruz
for ($i = 1; $i <= $message_count; ++$i) // her bir mail için
{
$info = imap_headerinfo($imap, $i); // header bilgilerini aldık
$structure = imap_fetchstructure($imap, $info->Msgno); // mailin structure aliyoruz.
$attachments = get_attachments($structure); // attachmentlari aliyoruz
foreach ($attachments as $k => $at)
{ // her bir attachment icin
$content = imap_fetchbody($imap, $info->Msgno, $at[‘part’]); // body bilgilerini aliyoruz
switch ($at[‘encoding’])
{ // encodinge gore secimi yapiyoruz
case ‘3’:
$content = base64_decode($content);
break;
case ‘4’:
$content = quoted_printable_decode($content);
break;
}
$fname = $at[‘filename’]; // dosya adini aliyoruz
if ( in_array( substr($fname,-3),$disallowed_files )) // eger uzantiyi kabul etmiyorsak es geciyoruz
continue;
$filename = replace_tr($filename); // turkce karakterleri duzeltiyoruz
$filename = preg_replace(‘/[^a-zA-Z0-9\.\$\%\’\`\-\@\{\}\~\!\#\(\)\&\_\^]/’, ”, str_replace(array (‘ ‘, ‘%20’, ‘\”, ‘”‘), array (‘_’, ‘_’, ‘_’, ‘_’), $filename)); // izin verilmeyen karakterleri duzeltiyoruz
$filename = url_cevir($filename); // eklentideki karakterleri duzeltiyoruz
$filename = $fname; // ayni isimli eklentileri saklamak icin time prefix ekliyoruz
//print_r($attachments); // debug
$filepath = “/var/www/deneme/$filename”; // eklerin kaydedilecegi dizin
$fp=fopen($filepath,”w”); // dosya baglantisini aciyoruz
fputs($fp,$content); // dosyayi kaydediyoruz
$filesize = filesize($filepath); // dosya boyutunu aliyoruz}
}
} // for döngüsü bittiimap_expunge($imap); // silmek üzere işaretlediğimiz mailleri siliyoruz
imap_close($imap); // mail bağlantısını kapatıyoruzfunction get_attachments($content, $part = null) {
static $results;if (is_null($part)) { // parca bos ise
$results = array();
}if (substr($part, 0, 1) == ‘.’) { // ilk basta nokta var ise siliyoruz
$part = substr($part, 1);
}// parametreleri ayarliyoruz
if (isset($content->ifdparameters) && $content->ifdparameters == 1 && isset($content->dparameters) && is_array($content->dparameters)) {
foreach ($content->dparameters as $object) {
if (isset($object->attribute) && strtolower($object->attribute) == ‘filename’) {
$results[] = array(
‘type’ => (isset($content->subtype)) ? $content->subtype : ”,
‘encoding’ => $content->encoding,
‘part’ => (is_null($part)) ? 1 : $part,
‘filename’ => $object->value
);
}
}
}// parametreleri ayarliyoruz 2
else if (isset($content->ifparameters) && $content->ifparameters == 1 && isset($content->parameters) && is_array($content->parameters)) {
foreach ($content->parameters as $object) {
if (isset($object->attribute) && strtolower($object->attribute) == ‘name’) {
$results[] = array(
‘type’ => (isset($content->subtype)) ? $content->subtype : ”,
‘encoding’ => $content->encoding,
‘part’ => (is_null($part)) ? 1 : $part,
‘filename’ => $object->value
);
}
}
}if (isset($content->parts) && count($content->parts) > 0) {
// Other parts into content
foreach ($content->parts as $key => $parts) {
get_attachments($parts, ($part.’.’.($key + 1)));
}
}
return $results;
}
?>
Merhaba Burak ,yazın için teşekkür ederim türkçe kaynak konusunda oldukça faydalı, fakat örnek kodlamayı alamıyorum ansi kod ve utf8 sıkıntısı yüzünden karakter hataları veriyor. kopy paste yapma diceksin :) ben baştan başa satırları tek tek yazdım yinede olmadı :) rica etsem txt. dosyasına ekleyip paylaşırmısın. teşekkürler
Selamlar,
Mail adresinize dosya olarak gönderdim. :)