Sample code for 30+ languages & platforms
AutoIt

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

AutoIt
Local $bSuccess = False

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

$oImap = ObjCreate("Chilkat.Imap")

; Connect to an IMAP server, login, select mailbox..
; Use TLS 
$oImap.Ssl = True
$oImap.Port = 993
$bSuccess = $oImap.Connect("imap.example.com")
If ($bSuccess = True) Then
    $bSuccess = $oImap.Login("myLogin","myPassword")
    If ($bSuccess = True) Then
        $bSuccess = $oImap.SelectMailbox("Inbox")
    EndIf

EndIf

If ($bSuccess <> True) Then
    ConsoleWrite($oImap.LastErrorText & @CRLF)
    Exit
EndIf

$oDkim = ObjCreate("Chilkat.Dkim")

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

; Download emails by sequence numbers (not UIDs).
Local $bUid = False
Local $iSeqNum
Local $iJ
Local $iN = $oImap.NumMessages
If ($iN > 10) Then
    $iN = 10
EndIf

$oJson = ObjCreate("Chilkat.JsonObject")
$oJson.EmitCompact = False

; To verify DKIM-Signature headers, we need the exact unmodified MIME bytes of each email.
$oMimeData = ObjCreate("Chilkat.BinData")
$iSeqNum = 1
While $iSeqNum <= $iN
    ; The FetchSingleBd method was introduced in v9.5.0.76
    $bSuccess = $oImap.FetchSingleBd($iSeqNum,$bUid,$oMimeData)
    If ($bSuccess <> True) Then
        ConsoleWrite($oImap.LastErrorText & @CRLF)
        Exit
    EndIf

    ; Get the number of DKIM-Signature headers.
Local $iNumDkim = $oDkim.NumDkimSigs($oMimeData)

    ; Verify each..
    $iJ = 0
    While $iJ < $iNumDkim
        ConsoleWrite("------ DKIM Signature " & $iJ & @CRLF)

        $bSuccess = $oDkim.DkimVerify($iJ,$oMimeData)
        If ($bSuccess <> True) Then
            ConsoleWrite("Not valid." & @CRLF)
        Else
            ConsoleWrite("valid." & @CRLF)
        EndIf

        ; Show the additional information about the signature verification
        $oJson.Load($oDkim.VerifyInfo)
        ConsoleWrite($oJson.Emit() & @CRLF)

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

        $iJ = $iJ + 1
    Wend
    $iSeqNum = $iSeqNum + 1
Wend

$bSuccess = $oImap.Disconnect()