Ein einfaches Programm, das tut, was Sie wollen, ist unten.
#! /usr/bin/perl
use warnings;
use strict;
Die Mindestversion für Email::MIME
ist, wenn walk_parts
eingeführt wurde.
use Email::MIME 1.901;
use IO::Socket::SSL;
use Mail::IMAPClient;
use POSIX qw/ strftime /;
use Term::ReadKey;
Sie möchten Ihr Passwort nicht in Ihrem Programm fest codieren, oder?
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;
}
Verbindung über SSL herstellen. Wir sollten in der Lage sein, dies mit einem einfachen Ssl
Parameter für den Konstruktor zu tun, aber einige Anbieter haben entschieden, es in ihren Paketen zu brechen.
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];
Wenn Sie einen anderen Ordner als den Posteingang möchten, ändern Sie ihn.
$imap->select("INBOX")
or die "$0: select INBOX: ", $imap->LastError, "\n";
Mit IMAP suchen, suchen wir für alle Nachrichten, deren Themen das heutige Datum im Format JJJJMMTT enthalten. Das Datum kann irgendwo im Betreff sein, so würde beispielsweise ein Thema von "foo bar baz 20100316" heute übereinstimmen.
my $today = strftime "%Y%m%d", localtime $^T;
my @messages = $imap->search(SUBJECT => $today);
die "$0: search: [email protected]" if defined [email protected];
Schreiben Sie für jede solche Nachricht ihre Anlagen in Dateien im aktuellen Verzeichnis. Wir schreiben die äußerste Schicht von Anhängen und graben nicht nach verschachtelten Anhängen. Ein Teil mit einem Namensparameter in seinem Inhaltstyp (wie in image/jpeg; name="foo.jpg"
) wird als Anhang angenommen, und wir ignorieren alle anderen Teile. Der Name eines gespeicherten Anhangs besteht aus den folgenden Komponenten, die durch getrennt sind: Datum des heutigen Tages, seine IMAP-Nachrichten-ID, ein einzelner Index seiner Position in der Nachricht und sein Name.
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: $!";
});
}
können Sie dies versuchen: http://www.phocean.net/2007/06/03/how-to-strip-the-attachment-from-an-imap-mail.html – ghostdog74
Danke, das ist großartig. Können Sie bitte auch vorschlagen, dass es eine Option gibt, um die SSL-Authentifizierung zu aktivieren. – Space