2016-06-20 6 views
0

Ich bin auf der Suche nach der letzten IP-Adresse in E-Mail-Header, unter Verwendung der Received: from-Header. Ich suche den zuletzt empfangenen: aus dem Header und identifiziere jede IP. Mein Code unten scheint nicht zu funktionieren, da es viele Sonderzeichen in einem empfangenen von "{}, etc" gibt. Ich renne auch zu Problemen, in denen die IP möglicherweise nicht in der gleichen Zeile ist. Gibt es eine Möglichkeit, die letzte sendende IP im Header einer E-Mail leicht zu identifizieren, wo sie sich möglicherweise in einer separaten Zeile befindet?Parsing E-Mail-sending IP über zuletzt Empfangen: von Header

Dies ist, was ich arbeite zunächst mit:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Text.RegularExpressions; 
using System.Net; 
using System.IO; 

namespace IP 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int counter = 0; 
      string line; 
      System.IO.StreamReader file = 
       new System.IO.StreamReader("C:\\ip.txt"); 

      while ((line = file.ReadLine()) != null) 
      { 
       const string x_orig_ip = "Received: from"; 
       line = line.Trim(); 
       if (line.StartsWith(x_orig_ip, StringComparison.OrdinalIgnoreCase)) 
       { 
        string sIpAddress = line.Substring(x_orig_ip.Length, line.Length - x_orig_ip.Length).Trim(new char[] { ' ', '\t', '[', ']', '(', ')' }); 
        var ipAddress = System.Net.IPAddress.Parse(sIpAddress); 
        Console.WriteLine(ipAddress); 
        counter++; 
       } 
      } 

      Console.ReadLine(); 
     } 
    } 
} 

Also von den Headern unten würde ich 101.123.148.12 bekommen über die letzten erhalten: vom Eintritt:

Received: from test (subdomain.domain.com [192.168.0.1]) 
    Mon, 20 Jun 2016 10:46:57 -0400 (EDT) 
Received: from test123 ([192.168.0.1]) 
    by test.test; Mon, 20 Jun 2016 10:46:57 -0400 
Received: from test.engine.com (localhost [127.0.0.1]) 
    by test.testty.com (Postfix) with ESMTP id ABCDEF 
    for <[email protected]>; Sun, 19 Jun 2016 09:06:35 -0400 (EDT) 
Received: from test.message.com (localhost [127.0.0.1]) 
    by from test.message.com (Authentication) with ESMTP 
    Sun, 19 Jun 2016 09:06:35 -0400 
Authentication-Results: 
    spf=none smtp.mailfrom= smtp.helo 
Received-SPF: none 
    (192.168.0.1: No applicable sender policy available) 
Received: from 192.168.0.1 (unknown [192.168.0.1]) 
    by with SMTP 
Received: from unknown (HELO localhost) 
    by 101.123.148.12 with ESMTPA; Sun, 19 Jun 2016 10:00:20 -0300 
X-Originating-IP: 101.123.148.12 
From: [email protected] 
To: [email protected] 
Subject: Test 
Date: Sun, 19 Jun 2016 09:56:41 -0300 
+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/1669797/are-there-net-framework-methods-to-parse-an-email-mime Alte Frage, nicht sicher, ob die genannten Bibliotheken noch gepflegt werden . –

Antwort

1

Sie können diese regex versuchen:

var re = new RegEx(@"Received: (.|\n )*([^\d](\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))+", RegExOptions.Multiline); 
var matches = re.Matches(headers); 
if(matches.Count>0) 
{ 
    var group = matches[matches.Count-1].Groups[3]; 
    string ip = group.Captures[group.Captures.Count-1].Value; 
    // do something with ip... 
} 

wo Header ist Die String-Variable, die alle Header enthält (nicht nur eine einzelne Zeile).

Es wird alle IP-Adressen in Received-Header in Capture-Gruppe 3 extrahieren. Nehmen Sie die letzte Erfassung der letzten Übereinstimmung, um zu bekommen, was Sie wollen.

Beachten Sie, dass Sie würden normalerweise nicht 101.123.148.12 betrachten, da es keine Header anzeigt, dass die Nachricht von 101.123.148.12 empfangen wurde, sondern die Nachricht von empfangen wurde, die ganz anders ist.