2011-07-30 8 views
0

私はperlに問題があります。私は電子メールオブジェクトを解析するか、ログやファイルを何でも作成したい。私はどこからメールが来るのかを知りたい。最初に "x-envelop-from"行をチェックしなければなりません。一致しなければ、 "from"行をチェックする必要があります。stringがperlの正規表現と一致するかどうかをチェックする方法は?

これは私のサンプルファイルの一部です:このファイルの

X-Envelope-From: 
    <[email protected]> 
From: "=?iso-8859-9?B?RXYgVGH+/W1hY/1s/fD9bmRhIsdfyhjdbmRRmltIFNlem9u?= 
    =?iso-8859-9?B?dQ==?=" <[email protected]> 

私のコードが印刷さ2行:

[email protected] 
[email protected] 

鍬があれば、両方の印刷行がで印刷されて可能とELSIFができますか?試合をチェックする際に問題がありますか?

while ($line = <FILE>) 
{ 
    my ($from, $to, $spam_id, $date, $tmp_date, $m_day, $m_mon, $m_year, $m_hour, $m_min, $pos_tmp); 
    my ($subject); 
# 
    if ($line =~ m/^(X-Envelope-From:).*/) { 
     if ($line =~ m/^X-Envelope-From:.*<(.*)>.*/) { 
      $from = $1; 
     } 
     else { 
      $line = <FILE>; 
      if ($line =~ m/.*<(.*)>.*/) { 
       $from = $1; 
      } 
     } 
     print $from . "\n"; 
    } 

    elsif ($line =~ m/^(From:).*/) { 
     if ($line =~ m/^From:.*<(.*)>.*/) { 
      $from = $1; 
     } 
     else { 
      $line = <FILE>; 
      if ($line =~ m/.*<(.*)>.*/) { 
       $from = $1; 
      } 
     } 
     print $from . "\n"; 
    } 
} 

ありがとうございました。

+2

あなたが入力の2行を持っているので、出力の2行があります。最初の行については、 'if'条件は真(電子メールアドレスを出力します)であり、2行目は' elsif'条件が真(これも電子メールアドレスを出力します)です。 – Gareth

+0

はい私の間違いは、正規表現についても何かがありました。ありがとうございました – kursat

答えて

6

は、ヘッダーを解析するためにこのようなEmail::MIMEのような特殊なモジュールを使用します。

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Email::MIME; 

my $em = Email::MIME->new(
    do { local $/; <DATA> } 
); 

my $from = $em->header('X-Envelope-From'); 
$from = $em->header('From') unless $from; 

$from =~ s{.*<|>.*}{}g; 
print $from; 

__DATA__ 
X-Envelope-From: 
    <[email protected]> 
From: "=?iso-8859-9?B?RXYgVGH+/W1hY/1s/fD9bmRhIsdfyhjdbmRRmltIFNlem9u?= 
    =?iso-8859-9?B?dQ==?=" <[email protected]> 
+0

おかげでアランは、まさに私が探していたものでした。 – kursat