Sample code for 30+ languages & platforms
PHP

Verify DKIM-Signature Headers in Downloaded Email

See more DKIM / DomainKey Examples

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

Chilkat PHP Downloads

Chilkat2 PHP
<?php

use Chilkat2\BinData;
use Chilkat2\Dkim;
use Chilkat2\Imap;
use Chilkat2\JsonObject;

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

$imap = new Imap();

// Connect to an IMAP server, login, select mailbox..
// Use TLS
$imap->Ssl = true;
$imap->Port = 993;
try {
    $imap->Connect('imap.example.com');
    $imap->Login('myLogin', 'myPassword');
    $imap->SelectMailbox('Inbox');
} catch (\Chilkat2\Exception $e) {
    echo $e->getMessage(), "\n";
    exit;
}

$dkim = new Dkim();

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

// Download emails by sequence numbers (not UIDs).
$bUid = false;
$j = 0;
$n = $imap->NumMessages;
if ($n > 10) {
    $n = 10;
}

$json = new JsonObject();
$json->EmitCompact = false;

// To verify DKIM-Signature headers, we need the exact unmodified MIME bytes of each email.
$mimeData = new BinData();
$seqNum = 1;
while ($seqNum <= $n) {
    // The FetchSingleBd method was introduced in v9.5.0.76
    try {
        $imap->FetchSingleBd($seqNum, $bUid, $mimeData);
    } catch (\Chilkat2\Exception $e) {
        echo $e->getMessage(), "\n";
        exit;
    }

    // Get the number of DKIM-Signature headers.
    $numDkim = $dkim->NumDkimSigs($mimeData);

    // Verify each..
    $j = 0;
    while ($j < $numDkim) {
        echo '------ DKIM Signature ', $j, "\n";

        try {
            $dkim->DkimVerify($j, $mimeData);
            echo "valid.\n";
        } catch (\Chilkat2\Exception $e) {
            echo "Not valid.\n";
        }

        // Show the additional information about the signature verification
        $json->Load($dkim->VerifyInfo);
        echo $json->Emit(), "\n";

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

    $seqNum = $seqNum + 1;
}

$imap->Disconnect();