Sample code for 30+ languages & platforms
Dart

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 Dart Downloads

Dart
import 'package:chilkat/chilkat.dart';

void main() {
  var success = false;

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

  final imap = CkImap();

  // Connect to an IMAP server, login, select mailbox..
  // Use TLS 
  imap.ssl = true;
  imap.port = 993;
  success = true;
  try {
    imap.connect('imap.example.com');
  } on ChilkatException {
    success = false;
  }
  if (success) {
    success = true;
    try {
      imap.login('myLogin', 'myPassword');
    } on ChilkatException {
      success = false;
    }
    if (success) {
      success = true;
      try {
        imap.selectMailbox('Inbox');
      } on ChilkatException {
        success = false;
      }
    }
  }

  if (!success) {
    print(imap.lastErrorText);
    return;
  }

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

  final dkim = CkDkim();

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

  // Download emails by sequence numbers (not UIDs).
  final bUid = false;
  var seqNum = 0;
  var j = 0;
  var n = imap.numMessages;
  if (n > 50) {
    n = 50;
  }

  final json = CkJsonObject();
  json.emitCompact = false;

  // To verify DomainKey-Signature headers, we need the exact unmodified MIME bytes of each email.
  final mimeData = CkBinData();
  seqNum = 1;
  while (seqNum <= n) {
    // The FetchSingleBd method was introduced in v9.5.0.76
    success = true;
    try {
      imap.fetchSingleBd(seqNum, bUid, mimeData);
    } on ChilkatException {
      success = false;
    }
    if (!success) {
      print(imap.lastErrorText);
      return;
    }

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

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

    // Verify each..
    j = 0;
    while (j < numSigs) {
      print('------ DomainKey Signature $j');

      success = true;
      try {
        dkim.domainKeyVerify(j, mimeData);
      } on ChilkatException {
        success = false;
      }
      if (!success) {
        print('Not valid.');
        print(dkim.lastErrorText);
      } else {
        print('valid.');
      }

      // Show the additional information about the signature verification
      json.load(dkim.verifyInfo);
      print(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++;
    }

    seqNum++;
  }

  success = true;
  try {
    imap.disconnect();
  } on ChilkatException {
    success = false;
  }
}