Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Verify DomainKey-Signature Headers in Downloaded Email

See more DKIM / DomainKey Examples

Downloads email from an IMAP server and verifies the DomainKey-Signature header(s) in each email, if present.

Note: DKIM-Signatures are much more common than DomainKey-Signatures. See the other Chilkat example for verifying DKIM-Signatures (link in the code below).

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.BinData,
  Chilkat.Imap,
  Chilkat.JsonObject,
  Chilkat.Dkim;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  imap: TImap;
  dkim: TDkim;
  bUid: Boolean;
  seqNum: Integer;
  j: Integer;
  n: Integer;
  json: TJsonObject;
  mimeData: TBinData;
  numSigs: Integer;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  imap := TImap.Create;

  //  Connect to an IMAP server, login, select mailbox..
  //  Use TLS 
  imap.Ssl := True;
  imap.Port := 993;
  success := imap.Connect('imap.example.com');
  if (success = True) then
    begin
      success := imap.Login('myLogin','myPassword');
      if (success = True) then
        begin
          success := imap.SelectMailbox('Inbox');
        end;
    end;
  if (success <> True) then
    begin
      WriteLn(imap.LastErrorText);
      Exit;
    end;

  //  Note: DKIM-Signatures are much more common than DomainKey-Signature
  //  See DKIM-Signature Verify Sample.

  dkim := TDkim.Create;

  //  Download a max of 10 emails and verify any DomainKey-Signature headers
  //  that are present.

  //  Download emails by sequence numbers (not UIDs).
  bUid := False;

  n := imap.NumMessages;
  if (n > 50) then
    begin
      n := 50;
    end;

  json := TJsonObject.Create;
  json.EmitCompact := False;

  //  To verify DomainKey-Signature headers, we need the exact unmodified MIME bytes of each email.
  mimeData := TBinData.Create;
  seqNum := 1;
  while seqNum <= n do
    begin
      //  The FetchSingleBd method was introduced in v9.5.0.76
      success := imap.FetchSingleBd(seqNum,bUid,mimeData);
      if (success <> True) then
        begin
          WriteLn(imap.LastErrorText);
          Exit;
        end;

      //  Note: DKIM-Signatures are much more common than DomainKey-Signature
      //  See DKIM-Signature Verify Sample.

      //  Get the number of DomainKey-Signature headers.
      numSigs := dkim.NumDomainKeySigs(mimeData);

      //  Verify each..
      j := 0;
      while j < numSigs do
        begin
          WriteLn('------ DomainKey Signature ' + j);

          success := dkim.DomainKeyVerify(j,mimeData);
          if (success <> True) then
            begin
              WriteLn('Not valid.');
              WriteLn(dkim.LastErrorText);
            end
          else
            begin
              WriteLn('valid.');
            end;

          //  Show the additional information about the signature verification
          json.Load(dkim.VerifyInfo);
          WriteLn(json.Emit());

          //  The JSON contains information such as this:

          //  	{
          //  	  "domain": "amazonses.com",
          //  	  "selector": "7v7vs6w47njt4pimodk5mmttbegzsi6n",
          //  	  "publicKey": "MIGfMA0GCSqG...v2GvWPqGHz6uqeQIDAQAB",
          //  	  "canonicalization": "relaxed/simple",
          //  	  "algorithm": "rsa-sha256",
          //  	  "signedHeaders": "Subject:From:To:Date:Mime-Version:Content-Type:References:Message-Id:Feedback-ID",
          //  	  "verified": "yes"
          //  	}

          j := j + 1;
        end;

      seqNum := seqNum + 1;
    end;

  success := imap.Disconnect();


  imap.Free;
  dkim.Free;
  json.Free;
  mimeData.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.