PHP – Mailden Attachment Okuma

PHP – Mailden Attachment Okuma

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ü bitti

imap_expunge($imap); // silmek üzere işaretlediğimiz mailleri siliyoruz
imap_close($imap); // mail bağlantısını kapatıyoruz

function 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;
}
?>

2 Yorum

  1. ersoy yaşar

    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

Yorum Yaz

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir