perl将outlook电子邮件移动到另一个文件夹

时间:2014-12-01 10:05:07

标签: perl

您好我有一个脚本通过电子邮件文件夹读取,如果主题行以' 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);

1 个答案:

答案 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,因此我可以保留整个消息对象)。