Sample code for 30+ languages & platforms
Delphi DLL

Using Client Certificate w/ IMAP SSL

Demonstrates how to use a client-side certificate with an IMAP SSL connection. The SetSslClientCert method is called to specify a certificate to be used for the SSL connection.

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, MessageSet, Imap, EmailBundle, Email, CertStore, JsonObject, Cert;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
imap: HCkImap;
certStore: HCkCertStore;
jsonCN: HCkJsonObject;
cert: HCkCert;
cert2: HCkCert;
fetchUids: Boolean;
messageSet: HCkMessageSet;
bundle: HCkEmailBundle;
headersOnly: Boolean;
email: HCkEmail;
i: Integer;
numEmails: Integer;

begin
success := False;

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

imap := CkImap_Create();

// To use a secure SSL connection, set SSL and the port:
CkImap_putSsl(imap,True);
// The typical port for IMAP SSL is 993
CkImap_putPort(imap,993);

// Load a certificate from a PFX file and use it.
// Note: Other methods are available to load pre-installed
// certificates from registry-based certificate stores.

// Create an instance of a certificate store object, load a PFX file,
// locate the certificate we need, and use it for signing.
// (a PFX file may contain more than one certificate.)
certStore := CkCertStore_Create();
// The 1st argument is the filename, the 2nd arg is the 
// PFX file's password:
success := CkCertStore_LoadPfxFile(certStore,'myCertWithPrivateKey.pfx','secret');
if (success = False) then
  begin
    Memo1.Lines.Add(CkCertStore__lastErrorText(certStore));
    Exit;
  end;

// Find the certificate by the subject common name:
jsonCN := CkJsonObject_Create();
CkJsonObject_UpdateString(jsonCN,'CN','cert common name');

cert := CkCert_Create();
success := CkCertStore_FindCert(certStore,jsonCN,cert);
if (success = False) then
  begin
    Memo1.Lines.Add(CkCertStore__lastErrorText(certStore));
    Exit;
  end;

// If a PFX file is known to contain a single certificate,
// you may load it directly into a Chilkat certificate object.
// This snippet of source code shows how:
cert2 := CkCert_Create();
// The 1st argument is the filename, the 2nd arg is the 
// PFX file's password:
success := CkCert_LoadPfxFile(cert2,'myClientCert.pfx','secret');
if (success = False) then
  begin
    Memo1.Lines.Add(CkCert__lastErrorText(cert));
    Exit;
  end;

// Use the cert:
success := CkImap_SetSslClientCert(imap,cert);

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

// Login
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;

// Get the message IDs of all the emails in the mailbox
fetchUids := True;
messageSet := CkMessageSet_Create();
success := CkImap_QueryMbx(imap,'ALL',fetchUids,messageSet);
if (success = False) then
  begin
    Memo1.Lines.Add(CkImap__lastErrorText(imap));
    Exit;
  end;

// Fetch the emails into a bundle object:
bundle := CkEmailBundle_Create();
headersOnly := False;
success := CkImap_FetchMsgSet(imap,headersOnly,messageSet,bundle);
if (success = False) then
  begin
    Memo1.Lines.Add(CkImap__lastErrorText(imap));
    Exit;
  end;

// Loop over the bundle and display the FROM and SUBJECT of each.
email := CkEmail_Create();
i := 0;
numEmails := CkEmailBundle_getMessageCount(bundle);
while i < numEmails do
  begin
    CkEmailBundle_EmailAt(bundle,i,email);

    Memo1.Lines.Add(CkEmail__from(email));
    Memo1.Lines.Add(CkEmail__subject(email));
    Memo1.Lines.Add('--');
    i := i + 1;
  end;

// Disconnect from the IMAP server.
success := CkImap_Disconnect(imap);

CkImap_Dispose(imap);
CkCertStore_Dispose(certStore);
CkJsonObject_Dispose(jsonCN);
CkCert_Dispose(cert);
CkCert_Dispose(cert2);
CkMessageSet_Dispose(messageSet);
CkEmailBundle_Dispose(bundle);
CkEmail_Dispose(email);

end;