Một chương trình đơn giản làm những gì bạn muốn bên dưới.
#! /usr/bin/perl
use warnings;
use strict;
Phiên bản tối thiểu cho Email::MIME
là khi giới thiệu walk_parts
.
use Email::MIME 1.901;
use IO::Socket::SSL;
use Mail::IMAPClient;
use POSIX qw/ strftime /;
use Term::ReadKey;
Bạn không muốn mã hóa mật khẩu của mình trong chương trình, phải không?
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;
}
Kết nối bằng SSL. Chúng ta phải có khả năng thực hiện điều này với tham số Ssl
đơn giản đối với hàm tạo, nhưng một số nhà cung cấp đã chọn để phá vỡ nó trong các gói của họ.
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];
Nếu bạn muốn một thư mục khác ngoài hộp thư đến, hãy thay đổi nó.
$imap->select("INBOX")
or die "$0: select INBOX: ", $imap->LastError, "\n";
Sử dụng tìm kiếm IMAP, chúng tôi tìm tất cả các thư có chủ đề chứa ngày hôm nay theo định dạng YYYYMMDD. Ngày tháng có thể ở bất kỳ đâu trong chủ đề, ví dụ, một chủ đề của "foo bar baz 20100316" sẽ khớp với ngày hôm nay.
my $today = strftime "%Y%m%d", localtime $^T;
my @messages = $imap->search(SUBJECT => $today);
die "$0: search: [email protected]" if defined [email protected];
Đối với mỗi thư như vậy, hãy ghi phần đính kèm vào tệp trong thư mục hiện tại. Chúng tôi viết lớp ngoài cùng của tệp đính kèm và không đào cho các tệp đính kèm lồng nhau. Một phần có thông số tên trong loại nội dung của nó (như trong image/jpeg; name="foo.jpg"
) được giả định là tệp đính kèm và chúng tôi bỏ qua tất cả các phần khác. Tên của tệp đính kèm đã lưu là các thành phần sau được phân tách bằng -
: ngày hôm nay, ID thư IMAP của nó, chỉ mục dựa trên một vị trí của nó trong thư và tên của nó.
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: $!";
});
}
bạn có thể thử điều này: http://www.phocean.net/2007/06/03/how-to-strip-the-attachment-from-an-imap-mail.html – ghostdog74
Cảm ơn, điều này thật tuyệt. Bạn có thể xin vui lòng cũng đề nghị là có bất kỳ tùy chọn để cho phép xác thực SSL. – Space