URL: https://linuxfr.org/forums/programmation-perl/posts/extraction-de-pi%C3%A8ce-jointes-sur-boite-imap Title: extraction de pièce jointes sur boite IMAP Authors: Anonyme Date: 2007年05月03日T15:15:24+02:00 Tags: Score: 0 Salut à tous, Voilà des jours que je bloque sur Perl. Je suis un piètre programmeur et je me suis mis à Perl voilà 2 semaines, et je galère comme pas possible. Mon script doit extraire la pièce jointe du dernier mail arrivé dans une boite IMAP. Je dois pas en être loin, puisque mon script arrive à afficher le contenu du message grâce au module IMAP:Talk. Le problème, c'est qu'ensuite j'essaye de passer le message au module Attachment::stripper. Celui ci attend un objet MIME et apparemment c'est cette transmission que j'arrive pas à faire... Voici mon code : #!/usr/bin/perl -w use Email::Simple; use Email::MIME; use Mail::IMAPTalk; use Email::MIME::Attachment::Stripper ; $FolderName = 'INBOX'; $imap = Mail::IMAPTalk->new( £spaces£ £/spaces£Server => '192.168.0.1', £spaces£ £/spaces£Port => 143, £spaces£ £/spaces£Username => 'user', £spaces£ £/spaces£Password => 'pass', £spaces£ £/spaces£Separator => '.', £spaces£ £/spaces£RootFolder => 'Inbox', £spaces£ £/spaces£CaseInsensitive => 1) £spaces£ £/spaces£|| die "Connection failed. Reason: $@"; £spaces£ £/spaces£# Select folder and get first unseen message £spaces£ £/spaces£$imap->select($FolderName) || die $@; £spaces£ £/spaces£$imap->select($FolderName) || die $@; £spaces£ £/spaces£$MsgId = $imap->search('not', 'seen')->[0]; print "Message ID :".$MsgId."\n"; print "Message ID2 :".$imap->search('not', 'seen')->[0]."\n"; print "quoi :".$imap->search('not', 'seen')->[1]."\n"; £spaces£ £/spaces£$MsgEV = $imap->fetch($MsgId, 'envelope')->{$MsgId}->{envelope}; £spaces£ £/spaces£print "From: " . $MsgEV->{From}."\n"; £spaces£ £/spaces£print "To: " . $MsgEV->{To}."\n"; £spaces£ £/spaces£print "Subject: " . $MsgEV->{Subject}."\n"; £spaces£ £/spaces£print "Sender: " . $MsgEV->{Sender}."\n"; £spaces£ £/spaces£# Get message body structur £spaces£ £/spaces£my $MsgBS = $imap->fetch($MsgId, 'bodystructure')->{$MsgId}->{bodystructure}; £spaces£ £/spaces£print "Size: ".$MsgBS->{Size}."\n"; £spaces£ £/spaces£# Find imap part number of text part of message £spaces£ £/spaces£$MsgTxtHash = Mail::IMAPTalk::find_message($MsgBS); £spaces£ £/spaces£$MsgPart = $MsgTxtHash->{text}->{'IMAP-Partnum'}; £spaces£ £/spaces£# Retrieve message text body £spaces£ £/spaces£$MsgTxt = $imap->fetch($MsgId, "body[$MsgPart]")->{$MsgId}->{body}; £spaces£ £/spaces£print "Content: ".$MsgTxt."\n"; my $parsed = Email::MIME->new($MsgPart); print "parsed ".$parsed."\n"; print "structure :".$parsed->debug_structure."\n"; my $parts = $parsed->parts; print "nb parts ".$parts."\n"; my @parts = $parsed->parts; my $i=0; foreach (@parts) { £spaces£ £/spaces£my $j=0; £spaces£ £/spaces£foreach ($parts[$i]) { £spaces£ £/spaces£print "parts ".$parts[$i]."\n"; £spaces£ £/spaces£$j++; £spaces£ £/spaces£} £spaces£ £/spaces£ £spaces£ £/spaces£$i++; } my $decoded = $parsed->body; print "body ".$decoded."\n"; my $stripper = Email::MIME::Attachment::Stripper->new($parsed); my Email::MIME $msg2 = $stripper->message; print "message ".$msg2[0]."\n"; my @attachments = $stripper->attachments; my $i=0; foreach (@parts) { £spaces£ £/spaces£my $j=0; £spaces£ £/spaces£foreach ($parts[$i]) { £spaces£ £/spaces£print "hash :".$attachments[$i]->{payload}."\n"; £spaces£ £/spaces£$j++; £spaces£ £/spaces£} £spaces£ £/spaces£ £spaces£ £/spaces£$i++; } Si une âme charitable veut bien m'aider... Merci d'avance à tous ceux qui vont regarder mon code.