1

perl 有什么方法可以获取电子邮件 Received 标头信息并将其服务器和 IP 地址从字符串中取出?这是一个例子:

Received: from example.web.site.net (example.web.site.net [1.1.1.1])  (using example     filler text (256/256 bits))  (No client certificate requested)  by example.example.com     (Postfix) with ESMTPS id 123456

当最终发送到 SQL 数据库时,这 2 个项目需要转到各自的字段。

这也使用了 qpsmtp 插件。

4

2 回答 2

0

尝试正则表达式:

my $str = "Received: from example.web.site.net (example.web.site.net [1.1.1.1])  (using example     filler text (256/256 bits))  (No client certificate requested)  by example.example.com     (Postfix) with ESMTPS id 123456";    
$str =~ s/[^\(]*\(([^ ]+) \[([^\]]+)\]\).*/$1|$2/; 

my @parts = split /\|/, $str;

$parts[0]有服务器,$parts[1]有IP

于 2013-08-02T04:48:07.367 回答
0

如果我理解正确:

  • example.web.site.net是服务器名称;和
  • 1.1.1.1是IP

最好的方法是使用正则表达式捕获。Perl 捕获与括号中的某个表达式匹配的任何字符串。当您尝试将字符串与某个正则表达式 (m//) 匹配时,它会返回一个数组。

这是我的代码:

use strict;
use warnings;

my $str = "Received: from example.web.site.net (example.web.site.net [1.1.1.1])  (using example     filler text (256/256 bits))  (No client certificate requested)  by example.example.com     (Postfix) with ESMTPS id 123456";

my ($server, $ip) = $str =~ m/\((.+)\[(.+?)\]\)/sg;
chop($server);

print "'$server' - '$ip'";

好吧,我使用正则表达式来匹配字符串“ (example.web.site.net [1.1.1.1]) ”的这一部分,并且我只是用括号括住了我想捕获的字符串部分。由于我想获得 2 个字符串,因此分配:

my ($server, $ip) = $str =~ m/\((.+)\[(.+?)\]\)/sg;

希望有帮助!

于 2013-08-02T07:52:41.633 回答