Sample code for 30+ languages & platforms
DataFlex Requires Chilkat v11.0.0+

POP3 Read S/MIME Encrypted Email

Read S/MIME encrypted email.

Chilkat DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoMailman
    Variant vBundle
    Handle hoBundle
    Boolean iKeepOnServer
    Boolean iHeadersOnly
    Integer iNumBodyLines
    Variant vEmail
    Handle hoEmail
    Integer i
    String sTemp1
    Boolean bTemp1

    Move False To iSuccess

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

    //  The mailman object is used for receiving (POP3) 
    //  and sending (SMTP) email.
    Get Create (RefClass(cComChilkatMailMan)) To hoMailman
    If (Not(IsComObjectCreated(hoMailman))) Begin
        Send CreateComObject of hoMailman
    End

    //  Set the POP3 server's hostname
    Set ComMailHost Of hoMailman To "pop.example.com"

    //  Set the POP3 login/password.
    Set ComPopUsername Of hoMailman To "myLogin"
    Set ComPopPassword Of hoMailman To "myPassword"

    //  If running on Microsoft Windows, the Chilkat mailman
    //  will automatically search the registry-based certificate stores
    //  for matching certificates and private keys required for
    //  decryption.  However, on Linux, MAX OS X, and other
    //  operating systems, no such thing exists.  Therefore, you'll 
    //  need to specify one or more PFX (.p12 / .pfx) files as
    //  sources for locating the certs required for decyrption.
    Get ComAddPfxSourceFile Of hoMailman "/pfxFiles/certs_and_keys_1.pfx" "pfxPassword1" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoMailman To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComAddPfxSourceFile Of hoMailman "/pfxFiles/certs_and_keys_2.pfx" "pfxPassword2" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoMailman To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  ...
    //  Note: On MS Windows, it is not required to provide PFX sources
    //  if the needed certs and private keys are already installed
    //  on the system (in the registry-based certificate stores).

    //  Copy the all email from the user's POP3 mailbox 
    //  into a bundle object.  The email remains on the server.
    Get Create (RefClass(cComChilkatEmailBundle)) To hoBundle
    If (Not(IsComObjectCreated(hoBundle))) Begin
        Send CreateComObject of hoBundle
    End
    Move True To iKeepOnServer
    Move False To iHeadersOnly
    //  Irrelevent because we are NOT downloading headers-only
    Move 0 To iNumBodyLines
    Get pvComObject of hoBundle to vBundle
    Get ComFetchAll Of hoMailman iKeepOnServer iHeadersOnly iNumBodyLines vBundle To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoMailman To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  S/MIME security envelopes are automatically "unwrapped" 
    //  when a message is retrieved from the server. Signed emails are automatically verified, and 
    //  encrypted emails are automatically decrypted, restoring the email to the original state before 
    //  signing and/or encrypting. Information about the signing and encrypting certificates can be 
    //  retrieved from the Email object (methods: GetSignedByCert, GetEncryptedByCert; 
    //  properties: SignedBy, EncryptedBy, SignaturesValid, Decrypted, ReceivedSigned, 
    //  ReceivedEncrypted).

    //  Loop over the bundle
    Get Create (RefClass(cComChilkatEmail)) To hoEmail
    If (Not(IsComObjectCreated(hoEmail))) Begin
        Send CreateComObject of hoEmail
    End
    Move 0 To i
    While (i < (ComMessageCount(hoBundle)))

        Get pvComObject of hoEmail to vEmail
        Get ComEmailAt Of hoBundle i vEmail To iSuccess

        Get ComFrom Of hoEmail To sTemp1
        Showln sTemp1
        Get ComSubject Of hoEmail To sTemp1
        Showln sTemp1

        //  At this point, if the email was signed and/or encrypted, it is already "unwrapped", i.e.
        //  the email is already decrypted and in a state as if it were never signed or encrypted.
        //  You may check to see if the email was received encrypted or signed, and if so,
        //  whether it was successfully unwrapped and who signed or encrypted it:
        Get ComReceivedEncrypted Of hoEmail To bTemp1
        If (bTemp1 = True) Begin

            Showln "This email was encrypted when received."
            Get ComDecrypted Of hoEmail To bTemp1
            If (bTemp1 = True) Begin
                Showln "This email was successfully decrypted.  It was encrypted by:"
                Get ComEncryptedBy Of hoEmail To sTemp1
                Showln sTemp1
            End
            Else Begin
                Showln "This email was not decrypted."
            End

        End

        Get ComReceivedSigned Of hoEmail To bTemp1
        If (bTemp1 = True) Begin

            Showln "This email was signed when received."
            Get ComSignaturesValid Of hoEmail To bTemp1
            If (bTemp1 = True) Begin
                Showln "The signature was verified.  It was signed by:"
                Get ComSignedBy Of hoEmail To sTemp1
                Showln sTemp1
            End
            Else Begin
                Showln "The signature verification failed."
            End

        End

        //  The email's body, HTML body, attachments, etc.
        //  are decrypted and available just like any non-encrypted email.

        Showln "--"

        Move (i + 1) To i
    Loop



End_Procedure