Sample code for 30+ languages & platforms
C

IMAP Read PEC Email of Aruba and Extract the Invoice XML Files

See more Email Object Examples

IMAP Read PEC Email of Aruba and Extract the Invoice XML Files.

Chilkat C Downloads

C
#include <C_CkImap.h>
#include <C_CkMessageSet.h>
#include <C_CkEmail.h>
#include <C_CkStringBuilder.h>
#include <C_CkMime.h>
#include <C_CkBinData.h>
#include <C_CkCrypt2.h>
#include <C_CkXml.h>

void ChilkatSample(void)
    {
    BOOL success;
    HCkImap imap;
    BOOL fetchUids;
    HCkMessageSet messageSet;
    HCkEmail email;
    HCkEmail attachedEmail;
    HCkStringBuilder sbMime;
    HCkMime mime;
    HCkBinData bdP7m;
    HCkMime mimeP7m;
    HCkCrypt2 crypt;
    HCkXml xml;

    success = FALSE;

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

    imap = CkImap_Create();

    // Connect using TLS.
    CkImap_putSsl(imap,TRUE);
    CkImap_putPort(imap,993);
    success = CkImap_Connect(imap,"imap.example.com");
    if (success == FALSE) {
        printf("%s\n",CkImap_lastErrorText(imap));
        CkImap_Dispose(imap);
        return;
    }

    // Authenticate
    success = CkImap_Login(imap,"email_account_login","email_account_password");
    if (success == FALSE) {
        printf("%s\n",CkImap_lastErrorText(imap));
        CkImap_Dispose(imap);
        return;
    }

    // Select an IMAP mailbox
    success = CkImap_SelectMailbox(imap,"Inbox/postacert");
    if (success == FALSE) {
        printf("%s\n",CkImap_lastErrorText(imap));
        CkImap_Dispose(imap);
        return;
    }

    // Search for messages having "POSTA CERTIFICATA: Invio File" in the subject.
    fetchUids = TRUE;
    messageSet = CkMessageSet_Create();
    success = CkImap_QueryMbx(imap,"SUBJECT \"POSTA CERTIFICATA: Invio File\"",fetchUids,messageSet);
    if (success == FALSE) {
        printf("%s\n",CkImap_lastErrorText(imap));
        CkImap_Dispose(imap);
        CkMessageSet_Dispose(messageSet);
        return;
    }

    if (CkMessageSet_getCount(messageSet) < 1) {
        printf("No messages found.\n");
        CkImap_Dispose(imap);
        CkMessageSet_Dispose(messageSet);
        return;
    }

    // For our example, we'll process only the 1st email in the messageSet.
    // Download the MIME source of the email into a StringBuilder object.
    email = CkEmail_Create();
    success = CkImap_FetchEmail(imap,FALSE,CkMessageSet_GetId(messageSet,0),CkMessageSet_getHasUids(messageSet),email);
    if (success == FALSE) {
        printf("%s\n",CkImap_lastErrorText(imap));
        CkImap_Dispose(imap);
        CkMessageSet_Dispose(messageSet);
        CkEmail_Dispose(email);
        return;
    }

    // The email should contain an attached email.
    // The Invoice XML is contained within the attached email.
    attachedEmail = CkEmail_Create();
    success = CkEmail_GetAttachedEmail(email,0,attachedEmail);
    if (success == FALSE) {
        printf("%s\n",CkEmail_lastErrorText(email));
        CkImap_Dispose(imap);
        CkMessageSet_Dispose(messageSet);
        CkEmail_Dispose(email);
        CkEmail_Dispose(attachedEmail);
        return;
    }

    // Get the MIME of the attached email..
    sbMime = CkStringBuilder_Create();
    success = CkEmail_GetMimeSb(attachedEmail,sbMime);

    // Load it into a Chilkat MIME object.
    mime = CkMime_Create();
    success = CkMime_LoadMimeSb(mime,sbMime);

    // Examine the structure of the MIME.
    printf("%s\n",CkMime_getStructure(mime,"text"));

    // The MIME has this structure:
    // multipart/mixed
    //     application/octet-stream
    //     application/octet-stream     <-- This is where the XML is contained.   It is within an opaque signature.
    //     text/plain

    // The 2nd application/octet-stream MIME header looks like this:

    // ------=_Part_329673_-1348225228.1579889273592
    // Content-Type: application/octet-stream; name="SM99999_99aaa.xml.p7m"
    // Content-Transfer-Encoding: base64
    // Content-Disposition: attachment; filename="SM99999_99aaa.xml.p7m"

    // Let's get the binary content of the .p7m
    bdP7m = CkBinData_Create();
    // Get the 2nd sub-part, at index 1 because index 0 is the 1st sub-part.

    mimeP7m = CkMime_Create();
    success = CkMime_PartAt(mime,1,mimeP7m);
    if (success == FALSE) {
        printf("%s\n",CkMime_lastErrorText(mime));
        CkImap_Dispose(imap);
        CkMessageSet_Dispose(messageSet);
        CkEmail_Dispose(email);
        CkEmail_Dispose(attachedEmail);
        CkStringBuilder_Dispose(sbMime);
        CkMime_Dispose(mime);
        CkBinData_Dispose(bdP7m);
        CkMime_Dispose(mimeP7m);
        return;
    }

    if (CkMime_getLastMethodSuccess(mime) != TRUE) {
        printf("Failed to get 2nd sub-part. Perhaps the MIME does not have a 2nd sub-part?\n");
        CkImap_Dispose(imap);
        CkMessageSet_Dispose(messageSet);
        CkEmail_Dispose(email);
        CkEmail_Dispose(attachedEmail);
        CkStringBuilder_Dispose(sbMime);
        CkMime_Dispose(mime);
        CkBinData_Dispose(bdP7m);
        CkMime_Dispose(mimeP7m);
        return;
    }

    success = CkMime_GetBodyBd(mimeP7m,bdP7m);

    // Verify the signature, which also extracts the content contained within the opaque signature.
    crypt = CkCrypt2_Create();
    success = CkCrypt2_OpaqueVerifyBd(crypt,bdP7m);
    if (success == FALSE) {
        printf("%s\n",CkCrypt2_lastErrorText(crypt));
        CkImap_Dispose(imap);
        CkMessageSet_Dispose(messageSet);
        CkEmail_Dispose(email);
        CkEmail_Dispose(attachedEmail);
        CkStringBuilder_Dispose(sbMime);
        CkMime_Dispose(mime);
        CkBinData_Dispose(bdP7m);
        CkMime_Dispose(mimeP7m);
        CkCrypt2_Dispose(crypt);
        return;
    }

    // The bdP7m now contains the Invoice XML.
    // Load it into an XML object.
    xml = CkXml_Create();
    success = CkXml_LoadBd(xml,bdP7m,TRUE);

    printf("%s\n",CkXml_getXml(xml));

    // We have XML such as the following:
    // 
    // <?xml version="1.0" encoding="windows-1252"?>
    // <?xml-stylesheet type="text/xsl" href="fatturapa_v1.2.xsl"?>
    // <p:FatturaElettronica versione="FPR12" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
    //     xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" 
    //     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    //     <FatturaElettronicaHeader>
    // 	...
    //     </FatturaElettronicaHeader>
    //     <FatturaElettronicaBody>
    // 	...
    //     </FatturaElettronicaBody>
    // </p:FatturaElettronica>

    // Use this online tool to generate parsing code from sample XML: 
    // Generate Parsing Code from XML

    printf("success.\n");


    CkImap_Dispose(imap);
    CkMessageSet_Dispose(messageSet);
    CkEmail_Dispose(email);
    CkEmail_Dispose(attachedEmail);
    CkStringBuilder_Dispose(sbMime);
    CkMime_Dispose(mime);
    CkBinData_Dispose(bdP7m);
    CkMime_Dispose(mimeP7m);
    CkCrypt2_Dispose(crypt);
    CkXml_Dispose(xml);

    }