Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17


Parsing an Email header

Posted on 2003-11-02
Medium Priority
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: <>
Received: from ( [])
      by (8.12.8/8.12.8) with ESMTP id h9OFOduM018338
      for <>; Fri, 24 Oct 2003 17:24:39 +0200
Received: from (localhost.localdomain [])
      by (8.12.8/8.12.8) with ESMTP id h9OFOcag028455
      for <>; Fri, 24 Oct 2003 17:24:38 +0200
Received: from ([])
      by (MailMonitor for SMTP v1.2.2 ) ;
      Fri, 24 Oct 2003 17:24:38 +0200 (CEST)
Received: from ( [])
      by (8.12.8/8.12.8) with ESMTP id h9OFOcAO010270
      (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO)
      for <>; Fri, 24 Oct 2003 17:24:38 +0200
Received: (from wwwrun@localhost)
      by (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: <>
Subject: test
Content-Type: text/html; charset=windows-1254
From: "Arash Mahini" <>
X-Mailer: System33r
X-Spam-Status: No, hits=4.2 required=5.0 tests=FORGED_YAHOO_RCVD,HTML_MESSAGE,
      autolearn=no version=2.60
X-Spam-Level: ****
X-Spam-Checker-Version: SpamAssassin 2.60 (1.212-2003-09-23-exp) on
In-Reply-To: test
I want to get "Fri, 24 Oct 2003 17:24:39 +0200" in a String (Or TDateTime).

Question by:k4hvd66
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
LVL 17

Accepted Solution

Wim ten Brink earned 452 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.

Expert Comment

ID: 9669160
My problem is the TIdMessage, I cannot get the right Date of message with TIdmessage, it changes the date to "Now"!!
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.
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

LVL 26

Assisted Solution

EddieShipman earned 448 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
          for x := 0 to msg.Headers.Count-1 do
            s := msg.Headers.Names[x];
            if s = 'Received' then
              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

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.

LVL 26

Expert Comment

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

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


Author Comment

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

 If L.Count > 0 Then
    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]))));


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



Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Question has a verified solution.

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

Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
This is my first video review of Microsoft Bookings, I will be doing a part two with a bit more information, but wanted to get this out to you folks.
In this video, Percona Solutions Engineer Barrett Chambers discusses some of the basic syntax differences between MySQL and MongoDB. To learn more check out our webinar on MongoDB administration for MySQL DBA:…
Suggested Courses

722 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