Un semplice programma che fa quello che vuoi è sotto.
#! /usr/bin/perl
use warnings;
use strict;
La versione minima per Email::MIME
è per quando walk_parts
è stato introdotto.
use Email::MIME 1.901;
use IO::Socket::SSL;
use Mail::IMAPClient;
use POSIX qw/ strftime /;
use Term::ReadKey;
Non si desidera inserire la password nel programma, vero?
sub read_password {
local $| = 1;
print "Enter password: ";
ReadMode "noecho";
my $password = <STDIN>;
ReadMode "restore";
die "$0: unexpected end of input"
unless defined $password;
print "\n";
chomp $password;
$password;
}
Connessione tramite SSL. Dovremmo essere in grado di farlo con un semplice parametro Ssl
per il costruttore, ma alcuni venditori hanno scelto di romperlo nei loro pacchetti.
my $pw = read_password;
my $imap = Mail::IMAPClient->new(
#Debug => 1,
User => "you\@domain.com",
Password => $pw,
Uid => 1,
Peek => 1, # don't set \Seen flag
Socket => IO::Socket::SSL->new(
Proto => 'tcp',
PeerAddr => 'imap.domain.com',
PeerPort => 993,
),
);
die "$0: connect: [email protected]" if defined [email protected];
Se si desidera una cartella diversa dalla Posta in arrivo, modificarla.
$imap->select("INBOX")
or die "$0: select INBOX: ", $imap->LastError, "\n";
Utilizzando ricerca IMAP, cerchiamo tutti i messaggi i cui soggetti contenere la data odierna in formato AAAAMMGG. La data può essere ovunque nell'oggetto, quindi, ad esempio, un soggetto di "foo bar baz 20100316" corrisponderebbe a oggi.
my $today = strftime "%Y%m%d", localtime $^T;
my @messages = $imap->search(SUBJECT => $today);
die "$0: search: [email protected]" if defined [email protected];
Per ogni messaggio di questo tipo, scrivere gli allegati ai file nella directory corrente. Scriviamo il livello più esterno degli allegati e non scaviamo per gli allegati annidati. Si presume che una parte con un parametro name nel suo tipo di contenuto (come in image/jpeg; name="foo.jpg"
) sia un allegato e ignoriamo tutte le altre parti. Il nome di un allegato salvato è i seguenti componenti separati da -
: la data odierna, il suo ID messaggio IMAP, un indice a un punto della sua posizione nel messaggio e il suo nome.
foreach my $id (@messages) {
die "$0: funky ID ($id)" unless $id =~ /\A\d+\z/;
my $str = $imap->message_string($id)
or die "$0: message_string: [email protected]";
my $n = 1;
Email::MIME->new($str)->walk_parts(sub {
my($part) = @_;
return unless ($part->content_type =~ /\bname=([^"]+)/
or $part->content_type =~ /\bname="([^"]+)"/); # " grr...
my $name = "./$today-$id-" . $n++ . "-$1";
print "$0: writing $name...\n";
open my $fh, ">", $name
or die "$0: open $name: $!";
print $fh $part->content_type =~ m!^text/!
? $part->body_str
: $part->body
or die "$0: print $name: $!";
close $fh
or warn "$0: close $name: $!";
});
}
si può provare questo: http://www.phocean.net/2007/06/03/how-to-strip-the-attachment-from-an-imap-mail.html – ghostdog74
Grazie, questo è grande. Puoi anche suggerire c'è qualche opzione per abilitare l'autenticazione SSL. – Space