Perl:Win32::OLE和Microsoft Outlook-高效地迭代电子邮件附件

Perl:Win32::OLE和Microsoft Outlook-高效地迭代电子邮件附件,perl,email,automation,ole,attachment,Perl,Email,Automation,Ole,Attachment,我是一名实习生,对这个很陌生 我的老板每周一都会收到一封带有两个附件的电子邮件,他必须把它转换成维基代码,并放在我们的内部网站上。由于要传输的信息量很大,该过程每周一大约需要20分钟。我被要求将这个过程流线化 我有解析文件并将其分解为组件的代码,我有从他的收件箱中取出所有附件的代码 我面临的问题是,我的脚本从最早的电子邮件开始。这不是一个大问题,但它会导致脚本运行的时间远远超过需要的时间 #!/usr/bin/perl use Cwd; use Win32::OLE qw(in with); u

我是一名实习生,对这个很陌生

我的老板每周一都会收到一封带有两个附件的电子邮件,他必须把它转换成维基代码,并放在我们的内部网站上。由于要传输的信息量很大,该过程每周一大约需要20分钟。我被要求将这个过程流线化

我有解析文件并将其分解为组件的代码,我有从他的收件箱中取出所有附件的代码

我面临的问题是,我的脚本从最早的电子邮件开始。这不是一个大问题,但它会导致脚本运行的时间远远超过需要的时间

#!/usr/bin/perl
use Cwd;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Outlook';
use Win32::OLE::Variant;

my $OL = Win32::OLE->GetActiveObject('Outlook.Application') || Win32::OLE->new('Outlook.Application', 'Quit');
my $NameSpace = $OL->GetNameSpace("MAPI");
my $Folder = $NameSpace->GetDefaultFolder(olFolderInbox);
my $dir = cwd . "\\";
$dir =~ s/\//\\/g;
my $atch1, $file1, $atch2, $file2;

print ref($Folder->{Items}) . "\n";

foreach my $msg (in $Folder->{Items}){
    #print $msg->{CreationTime} . "\n";
    foreach my $atch (in $msg->{Attachments}){
        if($atch->{FileName} =~ m/.xls$/i){
            if($atch->{FileName} =~ /Name of attachment1/i){
                $atch1 = $atch;
                $file1 = $dir . "file1.xls";
            }
            if($atch->{FileName} =~ /Name of attachment2/i){
                $atch2 = $atch;
                $file2 = $dir . "file2.xls";
            }
       }
   }
}

if($atch1 && $atch2){
    print $file1 . "\n" . $file2 . "\n";
    $atch1->SaveAsFile($file1);
    $atch2->SaveAsFile($file2);
}
现在的设置方式是,从最旧到最新,目的是查找文件,然后在找到较新的文件时替换它们(尽管我删除了该功能)。实际上,我可以找到最新的,然后停下来

我不知道如何反转$Folder->{Items}。我甚至不明白那是什么。当我做ref($Folder->{Items}时,它说它是一个Win32::OLE,这对我没有多大帮助,因为Win32::OLE的文档似乎只是显示它可以是任何数量的东西

你知道我怎样才能先找到更新的电子邮件吗?(反转$Folder->{Items}?Foreach以外的东西?将$Folder->{Items}转储到另一个可以反转的对象中?只需跳过数千封电子邮件,直到日期在最后两周之内?(我不喜欢这个)


谢谢。

试试这样的

foreach my $msg (reverse @{$Folder->{items}})

不要在perl中使用“in”

您从包
Win32::OLE
中导入了
in
子例程。这可能是一种可怕的“语法糖分”。而且非常不礼貌。我想它会从
Win32::OLE
对象
$文件夹中返回某种列表。请尝试以下操作:

foreach my $msg (reverse $Folder->{items}->in)


另外,确保在每个脚本中
使用严格的
使用警告
,以确保高质量的代码。如果您可以确保使用现代perl,您也可以
使用v5.10
并享受
say
功能–它的行为类似于
print
,但会自动在输出中添加新行。

表示否另外,如果没有in,数组引用也不起作用。不确定原因。谢谢你的回复!哇,谢谢。两个示例都很好地工作了。我还添加了use strict。我从来都不理解为什么存在strict/警告,但我一定会读到它们。再次感谢。
foreach my $msg (reverse in($Folder->{items}))