5

私はインターンで、これに非常に慣れていません...

私の上司は毎週月曜日に 2 つの添付ファイルを含むメールを受け取り、それを wiki コードに変換して社内 Web サイトに配置する必要があります。転送する情報量が多いため、このプロセスには毎週月曜日に約 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} を元に戻すことができる別のオブジェクトにダンプする? 日付が過去 2 週間以内になるまで、何千ものメールをスキップするだけですか? (私はでもそれは好きです))

ありがとう。

4

2 に答える 2

4

inパッケージからサブルーチンを インポートしましたWin32::OLE。それはおそらく、ひどい「構文糖衣」です。そして深く不滅です。Win32::OLEobjectからある種のリストを返すと思います$Folder。だからこれを試してください:

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

また

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

また、高品質のコードを確保するために、すべてのスクリプトでuse strict必ず実行してください。use warnings最新の perl が使用されることが確実な場合はuse v5.10、関数を楽しむこともできます。sayこれは のように動作printしますが、自動的に改行を出力に追加します。

于 2012-07-25T20:28:33.450 に答える
0

このようなことを試してください

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

perl で "in" を使用しないでください

于 2012-07-25T17:09:11.283 に答える