Sample code for 30+ languages & platforms
DataFlex

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