2013-08-02 26 views
1

有沒有什麼方法可以讓電子郵件收到標題信息,並將其服務器和IP地址從字符串中取出?這裏有一個例子:從perl中的字符串解析出IP地址和RDNS服務器

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數據庫時,這兩個項目需要到各自的字段。

這也是使用qpsmtp插件。

回答

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; 

希望幫助!

+0

非常感謝!這幫了很多。 當服務器位於IP之前時,它可以很好地工作。 在某些情況下,我們收到IP位於服務器之前的電子郵件,該服務器返回空值。 你知道這個解決方法嗎? – cpound

+0

你可以做的是修改正則表達式,使其匹配新的模式。首先檢查它是否返回null,如果是,則對提供的字符串執行正則表達式捕獲(使用新的正則表達式)。 –

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