您好我有一个脚本通过电子邮件文件夹读取,如果主题行以' test'它将邮件正文提取到txt文件。我希望它然后将所有6个电子邮件移动到另一个文件夹。但是当脚本从文件夹中的所有6封电子邮件中提取时,当我添加行( $message->Move($tofolder); )
时,我只能一次移动3封电子邮件,而不是全部!
我收到警告:Use of uninitialized value in pattern match (m//) on ~ /^test /) ..... line
#!/usr/bin/perl
use strict;
use warnings;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Outlook';
my $filename = 'c:\\net.txt' ;
open(FH,"> $filename")
or die ("cannot open $filename");
my $outlook = Win32::OLE->new('Outlook.Application')
or die "Failed Opening Outlook.";
my $namespace = $outlook->GetNamespace("MAPI");
my $folder = $namespace->Folders("test")->Folders("test1");#->Folders; ("Junk Mail")->Folders("Bad");
my $tofolder = $namespace->Folders("test")->Folders("test1");#->Folders; ("Junk Mail")->Folders("Bad");
my $items = $folder->Items;
for my $itemIndex (1..$items->Count)
{
my $message = $items->item($itemIndex);
if ($message->{Subject} =~ /^test/){
print $message->{Subject}."\n";
print FH $message->{Body};
$message->Move($tofolder);
}
}
close(FH);
答案 0 :(得分:1)
我担心我不太确定是什么 - 从评论中,第24行的错误表明您作为信息访问的内容并非如此。有一个'主题'领域。
所以它实际上可能根本就不是消息。
我尝试过这样的事情(稍微复述一下)似乎有效:
#!/usr/bin/perl
use strict;
use warnings;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Outlook';
my $filename = 'c:\\net.txt';
open( my $output_fh, ">", $filename ) or die $!;
my $outlook = Win32::OLE->new('Outlook.Application')
or die "Failed Opening Outlook.";
my $namespace = $outlook->GetNamespace("MAPI");
my $archive = $namespace->GetDefaultFolder(6)->Folders('Archive');
my $deletedItems = $namespace->GetDefaultFolder(3);
my $items = $archive->Items;
foreach my $msg ( $items->in ) {
if ( $msg->{Subject} =~ m/^test/ ) {
print $msg ->{Subject}, "\n";
print {$output_fh} $msg->{Body};
$msg->Move($deletedItems);
}
}
close($output_fh);
这会移动'存档' ' Inbox'的子文件夹删除的项目。并在我们去的时候提取到文件。请注意,它只是挥霍身体'到输出文件,没有任何分隔符,所以你可能想要做一些更复杂的事情。 (我已经开始使用$msg -> SaveAs
,因此我可以保留整个消息对象)。