2012-09-17 5 views
2

En ce moment, j'utilise ce code pour aller chercher des emails sur mon serveur.Enregistrer le serveur de pièces jointes avec IMAP et PHP

<?php 
$imap = imap_open($server, $username, $password) or die("Connection Error"); 
$message_count = imap_num_msg($imap); 
for ($i = 1; $i <= $message_count; ++$i){ 

    $header = imap_header($imap, $i); 
    //print_r($header); 

    $email[$i]['fromaddress'] = $header->from[0]->personal; 
    $email[$i]['to'] = $header->to[0]->mailbox; 
    $email[$i]['subject'] = $header->subject; 
    $email[$i]['message_id'] = $header->message_id; 
    $email[$i]['date'] = $header->udate; 

    $from = $email[$i]['fromaddress']; 
    $from_email = $email[$i]['from']; 
    $to = $email[$i]['to']; 
    $subject = $email[$i]['subject']; 

    echo $from_email . '</br>'; 
    echo $to . '</br>'; 
    echo $subject . '</br>'; 

    imap_setflag_full($imap, $i, "\\Seen"); 
    imap_mail_move($imap, $i, 'Trash'); 
} 

imap_close($imap); 

?> 

Je voudrais être en mesure de prendre les pièces jointes ainsi et les enregistrer dans un dossier sur mon serveur et afficher un lien vers les pièces jointes dans la sortie. Quelle est la manière la plus simple d'accomplir ceci?

+0

Avez-vous essayé d'utiliser [Google] (https://www.google.com/search?q=php + imap + pièces jointes) en premier? Il y a beaucoup d'exemples là-bas. Par exemple: http://stackoverflow.com/questions/11773169/extracting-php-imap-attachments –

+0

Oui, j'ai utilisé Google et j'ai vu cet article Stack. Malheureusement, je ne pouvais pas le faire fonctionner dans mon script. –

+0

Alors, quelles erreurs avez-vous rencontrées? Pouvez-vous coller le script que vous avez écrit, en suivant ces exemples? –

Répondre

21

En fait, j'ai pu obtenir de faire exactement ce que je voulais avec ce qui suit:

<?php 

function getFileExtension($fileName){ 
    $parts=explode(".",$fileName); 
    return $parts[count($parts)-1]; 
} 

$imap = imap_open($server, $username, $password) or die("imap connection error"); 
$message_count = imap_num_msg($imap); 
for ($m = 1; $m <= $message_count; ++$m){ 

    $header = imap_header($imap, $m); 
    //print_r($header); 

    $email[$m]['from'] = $header->from[0]->mailbox.'@'.$header->from[0]->host; 
    $email[$m]['fromaddress'] = $header->from[0]->personal; 
    $email[$m]['to'] = $header->to[0]->mailbox; 
    $email[$m]['subject'] = $header->subject; 
    $email[$m]['message_id'] = $header->message_id; 
    $email[$m]['date'] = $header->udate; 

    $from = $email[$m]['fromaddress']; 
    $from_email = $email[$m]['from']; 
    $to = $email[$m]['to']; 
    $subject = $email[$m]['subject']; 

    echo $from_email . '</br>'; 
    echo $to . '</br>'; 
    echo $subject . '</br>'; 

    $structure = imap_fetchstructure($imap, $m); 

    $attachments = array(); 
    if(isset($structure->parts) && count($structure->parts)) { 

     for($i = 0; $i < count($structure->parts); $i++) { 

      $attachments[$i] = array(
       'is_attachment' => false, 
       'filename' => '', 
       'name' => '', 
       'attachment' => '' 
      ); 

      if($structure->parts[$i]->ifdparameters) { 
       foreach($structure->parts[$i]->dparameters as $object) { 
        if(strtolower($object->attribute) == 'filename') { 
         $attachments[$i]['is_attachment'] = true; 
         $attachments[$i]['filename'] = $object->value; 
        } 
       } 
      } 

      if($structure->parts[$i]->ifparameters) { 
       foreach($structure->parts[$i]->parameters as $object) { 
        if(strtolower($object->attribute) == 'name') { 
         $attachments[$i]['is_attachment'] = true; 
         $attachments[$i]['name'] = $object->value; 
        } 
       } 
      } 

      if($attachments[$i]['is_attachment']) { 
       $attachments[$i]['attachment'] = imap_fetchbody($imap, $m, $i+1); 
       if($structure->parts[$i]->encoding == 3) { // 3 = BASE64 
        $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']); 
       } 
       elseif($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE 
        $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']); 
       } 
      } 
     } 
    } 

    foreach ($attachments as $key => $attachment) { 
     $name = $attachment['name']; 
     $contents = $attachment['attachment']; 
     file_put_contents($name, $contents); 
    } 

    //imap_setflag_full($imap, $i, "\\Seen"); 
    //imap_mail_move($imap, $i, 'Trash'); 
} 

imap_close($imap); 

?> 
+0

Juste essayé ceci. A travaillé la première fois. Bravo! Maintenant, j'ai juste besoin de comprendre comment obtenir la pièce jointe à enregistrer sur le serveur. –

+0

Damon, où est-ce que tu peux faire ça? – ingalcala

+0

Le code pour enregistrer le fichier sur le serveur est déjà là, jetez un oeil sur la dernière boucle foreach dans le code: file_put_contents ($ name, $ contents); – Farzan

Questions connexes