2015-03-31 75 views
0

一個簡單的過濾器我有一個包含了一堆郵件,看起來像這樣一個文件:創建在Perl

From: [email protected] 
Date: 10 Nov 2014 09:19:59 +0100 (MET) 
To: [email protected] 
Subject: Let's go have a beer 
Hey Jonny, let's have a drink tonight. See ya, Tommy 


From: [email protected] 
Date: 11 Dec 2014 19:16:49 +0100 (MET) 
To: [email protected] 
Subject: Meeting 
Dear Martha, 
Note that our Monday meeting will take place at 10:00 instead of 13:00. 
Best regards, 
Alice 

我寫一個Perl腳本,允許用戶從給輸入標題並給他回覆一條消息。例如,
,用戶可能鍵入from alice subject meeting並且會得到電子郵件。

到目前爲止,我有這個代碼,我不知道如何着手

open(IN, "<emails.txt") or die "Can't open the file"; 
    print "Enter the search elements from the header:\n"; 
    chomp($input=<STDIN>); 
    # example input from alice subject meeting 

    ($from, $who, $where, $what)=split/ /, $input; 


while (<IN>) 
{ 
    if(/$from(.)+$who/i){ 
    while (<IN>){ 
      if(/$where(.)+$what/i){ 
      while ($line = <IN>){ 
       print $line; 
      } 
      } 

     } 

    } 
} 
+0

恐怕「不確定如何繼續」意味着您的問題可能對於堆棧溢出而言過於寬泛。如果你有一個特定的事情,你有問題,那麼它可以有意義的回答。 – Sobrique 2015-03-31 11:36:39

+0

@Sobique謝謝你的評論。我希望有人能找到邏輯上的缺陷,並給我正確的方向。 – Nat 2015-03-31 11:40:42

回答

0

我會在這裏建議您的第一個停靠港,實際上是解析郵件標題。

電子郵件有一個定義的格式,基本上說,電子郵件的第一行是Headername: header_value\n形式的標題。標題末尾標有\n\n。 (例如兩個換行符),這就是您如何知道自己在「body」部分中的方式。

雖然您的示例沒有顯示 - 你確定這就是你一直在使用?

無論如何 - 電子郵件也結束用空行。不幸的是,沒有簡單的方法來區分某人在他們的電子郵件中輸入From: me,從它是一個標題 - 電子郵件是純粹的純文本。

我建議先從一個模塊開始爲你做這個。 Email::Simple看起來很有希望。

失敗 - 您可以使用按標題行分割,並使用:的分隔符。

my %headers; 
while (<$input>) { 
    if (m/\w+\:/) { 
     my ($header, $value) = split (/:/); 
     $headers{$header} = $value; 
    } 
} 

但是,如果你這樣做,你可以提供一個參數,如:From=janet並將它正則表達式您From場相匹配。

+0

謝謝你,Sobrique!我將嘗試Email :: Simple模塊。 – Nat 2015-03-31 11:58:21