Sample code for 30+ languages & platforms
Delphi DLL

IMAP Download and Verify Signed MIME

See more IMAP Examples

Downloads the original MIME of a digitally signed email and saves the .p7s signature along with other MIME parts. It then imports the email into a Chilkat email object to unwrap the S/MIME and verify the signature, and subsequently saves the attachments if they haven't been saved already.

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, StringTable, Imap, Email, StringBuilder, Mime, Cert;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
imap: HCkImap;
sbMime: HCkStringBuilder;
mime: HCkMime;
alreadySavedParts: Boolean;
st: HCkStringTable;
numFiles: Integer;
i: Integer;
email: HCkEmail;
cert: HCkCert;

begin
success := False;

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

imap := CkImap_Create();

// Connect to an IMAP server.
// Use TLS
CkImap_putSsl(imap,True);
CkImap_putPort(imap,993);
success := CkImap_Connect(imap,'imap.example.com');
if (success = False) then
  begin
    Memo1.Lines.Add(CkImap__lastErrorText(imap));
    Exit;
  end;

success := CkImap_Login(imap,'myLogin','myPassword');
if (success = False) then
  begin
    Memo1.Lines.Add(CkImap__lastErrorText(imap));
    Exit;
  end;

// Select an IMAP mailbox
success := CkImap_SelectMailbox(imap,'Inbox');
if (success = False) then
  begin
    Memo1.Lines.Add(CkImap__lastErrorText(imap));
    Exit;
  end;

// Download the 1st email (as MIME) in the Inbox by sequence number.
sbMime := CkStringBuilder_Create();
success := CkImap_FetchSingleAsMimeSb(imap,1,False,sbMime);
if (success = False) then
  begin
    Memo1.Lines.Add(CkImap__lastErrorText(imap));
    Exit;
  end;

// Load it into a MIME object and check to see if it is signed
mime := CkMime_Create();
CkMime_LoadMimeSb(mime,sbMime);
alreadySavedParts := False;
if (CkMime_ContainsSignedParts(mime) = True) then
  begin

    // This will save the .p7s and other parts...
    st := CkStringTable_Create();
    success := CkMime_PartsToFiles(mime,'c:/temp/qa_output',st);
    if (success = True) then
      begin
        numFiles := CkStringTable_getCount(st);
        i := 0;
        while i < numFiles do
          begin
            Memo1.Lines.Add('Created: ' + CkStringTable__stringAt(st,i));
            i := i + 1;
          end;

        alreadySavedParts := True;
      end;
  end;

// Load the MIME into an Email object.  This unwraps the security layers and verifies signatures.
email := CkEmail_Create();
CkEmail_SetFromMimeSb(email,sbMime);

if (CkEmail_getReceivedSigned(email) = True) then
  begin

    Memo1.Lines.Add('This email was signed.');

    // Check to see if the signatures were verified.
    if (CkEmail_getSignaturesValid(email) = True) then
      begin
        Memo1.Lines.Add('Digital signature(s) verified.');

        Memo1.Lines.Add('Signer: ' + CkEmail__signedBy(email));

        // The certificate used for signing may be obtained
        // by calling email.GetSignedByCert.
        cert := CkCert_Create();
        success := CkEmail_LastSignerCert(email,i,cert);
        if (success = False) then
          begin
            Memo1.Lines.Add('Failed to get signing certificate object.');
          end
        else
          begin
            Memo1.Lines.Add('Signing cert: ' + CkCert__subjectCN(cert));
          end;
      end;

  end
else
  begin
    Memo1.Lines.Add('Digital signature verification failed.');
  end;

if (alreadySavedParts <> True) then
  begin
    CkEmail_SaveAllAttachments(email,'c:/temp/qa_output');
  end;

CkImap_Dispose(imap);
CkStringBuilder_Dispose(sbMime);
CkMime_Dispose(mime);
    CkStringTable_Dispose(st);
CkEmail_Dispose(email);
        CkCert_Dispose(cert);

end;