我有一个包含大量电子邮件的文件,看起来像这样:
From: tommy@gmail.com
Date: 10 Nov 2014 09:19:59 +0100 (MET)
To: jonny@jonrocks.com
Subject: Let's go have a beer
Hey Jonny, let's have a drink tonight. See ya, Tommy
From: alice@gmail.com
Date: 11 Dec 2014 19:16:49 +0100 (MET)
To: martha@hotmail.com
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 :(得分:0)
我建议您在这里使用第一个端口,实际上是解析邮件头。
电子邮件具有已定义的格式,基本上表示电子邮件的第一行是Headername: header_value\n
格式的标题。标题末尾标有\n\n
。 (例如,两个换行符),这就是你知道你在“身体”部分的方式。
你的样品虽然没有显示 - 你确定这是你必须使用的吗?
无论如何 - 电子邮件也结束并带有一个空行。不幸的是,没有简单的方法来区分在电子邮件中输入From: me
的人,因为它是标题 - 电子邮件是纯文本。
我建议从一个模块开始为你做这个。 Email::Simple
看起来很有希望。
失败 - 您可以使用每个标题行拆分,以及:
的分隔符。
my %headers;
while ( <$input> ) {
if ( m/\w+\:/ ) {
my ( $header, $value ) = split ( /:/ );
$headers{$header} = $value;
}
}
但是如果你这样做,你可以提供一个类似的参数:From=janet
并让正则表达式与你的From
字段匹配。