8722 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai un script PHP qui copie des pièces jointes dans un dossier, puis envoi un mail pour prévenir que des pièces jointes ont été déplacées.
J'aimerai récupérer dans le corps du message le nom de toutes les pièces jointes, mais pour l'instant je n'en récupère qu'une (la dernière)
ligne qui pose problème :
$msg = 'Nom de la pièce jointe déplacée : ' . $key['filename'] .'';

Ci-dessous mon code en espérant que vous puissiez m'aider.
Merci d'avance à vous tous.


<?php
 
function getFileExtension($fileName){
   $parts=explode(".",$fileName);
   return $parts[count($parts)-1];
}
 
 
  // Connexion sur le boîte mail
	$server = '{192.168.75.4:143/novalidate-cert}_Test';
	$username = 'user';
	$password = 'motdepasse';
 
 
 
 
	$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);
 
    $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']);
                }
            }
        }
    }
 
 
	if(count($attachments)!=0){
		foreach ($attachments as $key){
			if($key['is_attachment']==1){
	file_put_contents($key['filename'], $key['attachment']);
 
}
}
}
}
 
 
  // Copy des pièces jointes dans le dossier ou est lancé le script
 function recurse_copy($src,$dst) {  
 
    $dir = opendir($src);   
     @mkdir($dst);   
 
     while(false !== ( $file = readdir($dir)) ) {   
 
         if (( $file != '.' ) && ( $file != '..' )) {   
 
            if ( is_dir($src . '/' . $file) ) {   
 
                 recurse_copy($src . '/' . $file,$dst . '/' . $file);   
 
             }   
 
             else {   
 
                 copy($src . '/' . $file,$dst . '/' . $file);   
 
            }   
 
         }   
 
     }   
 
     closedir($dir);   
 
 }  
 
 
 // Copie des fichiers vers mon pc
 // Repertoire source
 $src = "C:/Program Files (x86)/OCS Inventory NG/xampp/htdocs/Script_Fourn2/";  
 
 // Repertoire de destination 
  $dst = "//MonPC/Partage/_AZ"; 
 
 recurse_copy($src,$dst); 
 
 
 
 
 	// Suppression du fichier php
unlink("//MonPC/Partage/_AZ/Move_Attachments_Test2.php");
 
 
	// Test du répertoire //MonPC/Partage/_AZ/ si vide ou non
 $OK=99;
$dir = ("//Didier-d/Partage/_AZ");
if (is_dir($dir)) 
{
 if ($Pointeur = opendir($dir)) 
  {
   while (($file = readdir($Pointeur)) !== false) 
      {
       if ($file!="." && $file!=".." ) $OK=0;
       if ($file=="." || $file==".." ) $OK=1;
       }
   closedir($Pointeur);
  }
}
	// if( $OK==0) echo ("Le répertoire n'est pas vide");
	// if( $OK==99) echo ("Le répertoire n'existe pas");
	// if( $OK==1) echo ("Le répertoire existe et est vide");
if ( $OK==1)
	{
echo ("...Le répertoire $dir existe et est vide...");
	}
else
	{
	$to = 'toto@toto.com';
	$subject = 'Copie des pièces joints fournisseurs';
	$msg = 'Nom de la pièce jointe déplacée :   '   . $key['filename'] .'';
	$headers = "From: Titi <titi@titi.com>\r\n";
	mail($to, $subject,$msg, $headers);
	}
 
 
	// Copie des fichiers du repertoire _AZ vers _AZ2	
	$src2 = "//MonPC/Partage/_AZ";   
    $dst2 = "//MonPC/Partage/_AZ2"; 
 
 
 recurse_copy($src2,$dst2);
 
 
	// Suppression des fichiers contenu dans le répertoire _AZ
		$dir2 = "//MonPC/Partage/_AZ";
function unlinkRecursive($dir2, $deleteRootToo) 
{ 
    if(!$dh = @opendir($dir2)) 
    { 
        return; 
    } 
    while (false !== ($obj = readdir($dh))) 
    { 
        if($obj == '.' || $obj == '..') 
        { 
            continue; 
        }  
 
        if (!@unlink($dir2 . '/' . $obj)) 
        { 
            unlinkRecursive($dir2.'/'.$obj, true); 
        } 
    }  
 
    closedir($dh);  
 
    if ($deleteRootToo) 
    { 
        @rmdir($dir2); 
    }  
 
    return; 
} 
unlinkRecursive($dir2, false); 
 
 
 
	// Suppression des fichiers dans le répertoire d'origine sauf les PHP
foreach (glob("*.pdf") as $filename)
{ 
@unlink($filename);
}
 
foreach (glob("*.xlsx") as $filename)
{
@unlink($filename);
}
 
foreach (glob("*.doc") as $filename)
{
@unlink($filename);
}
 
foreach (glob("*.xls") as $filename)
{
@unlink($filename);
}
 
foreach (glob("*.csv") as $filename)
{
@unlink($filename);
}
 
foreach (glob("*.docx") as $filename)
{
@unlink($filename);
}
 
foreach (glob("*.txt") as $filename)
{
@unlink($filename);
}
 
 
	// Déplacement des mails de INBOX vers Olds_Msgs
$nbmess = imap_num_msg($imap); 
for($j=1;$j<=$nbmess;$j++) 
{
  imap_mail_move($imap,$message_count,'_test2'); 
}
 
imap_expunge($imap);
imap_close($imap);
 
 
 
 
?>

Modifié par d_dalcan (06 Nov 2013 - 16:38)
Bonjour,
Tu utilises $key, mais tu n'es plus dans la boucle foreach qui l'a créée, donc $key existe toujours et contient, au moment où tu l'utilises, le dernier élément de la collection parcourue plus haut.
Je n'ai pas exploré plus en profondeur, mais il faudrait soit reparcourir $attachments, soit générér le message plus tôt, lors du parcours précédent.

Au passage, tu as laissé ton nom et adresse mail dans le code, tu devrais éditer le message pour les virer.