Solved

Parsing an Email header

Posted on 2003-11-02
8
355 Views
Last Modified: 2010-04-03
Hello, I want to Parse the Date from a header, so I need a parser which looks for ";" in the header and Save the Value after ";" as a String.

Here is a header;:
---------------------------------------------------------------------------------------------
Return-Path: <wwwrun@server5.rhs-it.de>
Received: from smtpsrv1.hrz.uni-oldenburg.de (smtpsrv1.hrz.uni-oldenburg.de [134.106.87.8])
      by mailsrv1.hrz.uni-oldenburg.de (8.12.8/8.12.8) with ESMTP id h9OFOduM018338
      for <gbitest@uni-oldenburg.de>; Fri, 24 Oct 2003 17:24:39 +0200
Received: from smtpsrv1.hrz.uni-oldenburg.de (localhost.localdomain [127.0.0.1])
      by smtpsrv1.hrz.uni-oldenburg.de (8.12.8/8.12.8) with ESMTP id h9OFOcag028455
      for <gbitest@uni-oldenburg.de>; Fri, 24 Oct 2003 17:24:38 +0200
Received: from loadb02.uni-oldenburg.de ([134.106.87.17])
      by smtpsrv1.hrz.uni-oldenburg.de (MailMonitor for SMTP v1.2.2 ) ;
      Fri, 24 Oct 2003 17:24:38 +0200 (CEST)
Received: from server5.rhs-it.de (server5.rhs-it.de [217.172.182.111])
      by mailgate.uni-oldenburg.de (8.12.8/8.12.8) with ESMTP id h9OFOcAO010270
      (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO)
      for <gbitest@uni-oldenburg.de>; Fri, 24 Oct 2003 17:24:38 +0200
Received: (from wwwrun@localhost)
      by server5.rhs-it.de (8.11.3/8.11.3/SuSE Linux 8.11.1-0.5) id h9OFOce24381;
      Fri, 24 Oct 2003 17:24:38 +0200
Date: Sat, 30 Dec 1899 01:00:00 +0100
Message-Id: <200310241524.h9OFOce24381@server5.rhs-it.de>
To: gbitest@uni-oldenburg.de
Subject: test
Content-Type: text/html; charset=windows-1254
From: "Arash Mahini" <Hallo@yahoo.com>
X-Mailer: System33r
X-Spam-Status: No, hits=4.2 required=5.0 tests=FORGED_YAHOO_RCVD,HTML_MESSAGE,
      HTML_MIME_NO_HTML_TAG,MIME_HEADER_CTYPE_ONLY,MIME_HTML_ONLY
      autolearn=no version=2.60
X-Spam-Level: ****
X-Spam-Checker-Version: SpamAssassin 2.60 (1.212-2003-09-23-exp) on
      smtpsrv1.hrz.uni-oldenburg.de
In-Reply-To: test
-------------------------------------------------------------------------------------
I want to get "Fri, 24 Oct 2003 17:24:39 +0200" in a String (Or TDateTime).


0
Comment
Question by:k4hvd66
8 Comments
 
LVL 17

Accepted Solution

by:
Wim ten Brink earned 113 total points
ID: 9667200
The Indy components have a component called TidMessage. If you load this source into such a component then the properties allow you access to most of these fields.
0
 
LVL 4

Expert Comment

by:k4hvd77
ID: 9669160
My problem is the TIdMessage, I cannot get the right Date of message with TIdmessage, it changes the date to "Now"!!
0
 
LVL 17

Expert Comment

by:Wim ten Brink
ID: 9669928
And what if you use TIdMessage.Headers.Values['Date'] instead of the Date property? The Date property is not the same as the Date value in the header.
0
Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

 
LVL 26

Assisted Solution

by:EddieShipman
EddieShipman earned 112 total points
ID: 9673937
The problem with the appraach you are taking in searching for a ';' is that other headers may and do have that character in them.

What you are trying to parse, from what I can see, is the Received headers.

Even TidMessage doesn't parse the headers of an email like we would like. It just places them into a stringlist.

What you can do is to write a handler to take the headers, look for the word "Received:" . Something a little like this using
the NameValue Pairs on the headers:

        idPop31.Retrieve(i, msg);
        msg.Headers.NameValueSeparator := ':';
        if Length(msg.Headers.Text) > 0 then
        begin
          for x := 0 to msg.Headers.Count-1 do
          begin
            s := msg.Headers.Names[x];
            if s = 'Received' then
            begin
              s := msg.Headers.Values[s];
              iPos := Pos(';', s);
              s := Trim(Copy(s, iPos+1, Length(s)));
               // s now contains the date from the received header
            end;
          end;


Its too bad that there isn't a standard that these haders should be formatted. That is one beef I have with W3C because it makes
fighting spam a lot more difficult.

0
 
LVL 26

Expert Comment

by:EddieShipman
ID: 9673959
But, your header may have multiple Received haeders and you would get a date for each one.
If you really are looking for just the Date header, then Workshop_Alex had the right answer
above.

But then again, you asked to get the "Fri, 24 Oct 2003 17:24:39 +0200" datetime and it is in
your Received header....


0
 

Author Comment

by:k4hvd66
ID: 9673967
what do you mean to this:
----------------------------------------------------------------------------------------
procedure TForm1.Parse(S : String; var List : TStringList);
VAR
L : TstringList;
I : Integer;
begin
 L := TstringList.Create; // use another TStringList to parse source string on subelements
 L.Text :=S;

 If L.Count > 0 Then
  Begin
    If List = Nil Then List := TStringList.Create Else List.Clear;
    For I := 0 To L.Count-1 Do
      List.Values[Copy(Trim(L[I]),1,Pos(';',Trim(L[I]))-1)] := Trim(Copy(Trim(L[I]),Pos(';',Trim(L[I]))+1,Length(Trim(L[I]))));
  End;

 L.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
VAR S:STring; L1:TStringList;
begin
L1 :=TStringList.Create;
Parse (Memo1.Lines.Text, L1);
ShowMessage('Date: '+L1.Values['k4hvd@web.de']);

end;
----------------------------------------------------------------------------------------

0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question