2011-07-30 89 views
0

我有一个问题与Perl。我想解析一个电子邮件对象或记录或文件。我想找到邮件来自哪里。首先我必须检查“x-envelope-from”行,如果不匹配,那么我必须检查“from”行。如何检查字符串是否与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

有两行输出,因为你必须输入的两行。对于第一行,“if”条件是真的(打印一个电子邮件地址),对于第二行,“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

相关问题