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 <CkImap.h>
#include <CkMessageSet.h>
#include <CkEmail.h>
#include <CkStringBuilder.h>
#include <CkMime.h>
#include <CkBinData.h>
#include <CkCrypt2.h>
#include <CkXml.h>

void ChilkatSample(void)
    {
    bool success = false;

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

    CkImap imap;

    //  Connect using TLS.
    imap.put_Ssl(true);
    imap.put_Port(993);
    success = imap.Connect("imap.example.com");
    if (success == false) {
        std::cout << imap.lastErrorText() << "\r\n";
        return;
    }

    //  Authenticate
    success = imap.Login("email_account_login","email_account_password");
    if (success == false) {
        std::cout << imap.lastErrorText() << "\r\n";
        return;
    }

    //  Select an IMAP mailbox
    success = imap.SelectMailbox("Inbox/postacert");
    if (success == false) {
        std::cout << imap.lastErrorText() << "\r\n";
        return;
    }

    //  Search for messages having "POSTA CERTIFICATA: Invio File" in the subject.
    bool fetchUids = true;
    CkMessageSet messageSet;
    success = imap.QueryMbx("SUBJECT \"POSTA CERTIFICATA: Invio File\"",fetchUids,messageSet);
    if (success == false) {
        std::cout << imap.lastErrorText() << "\r\n";
        return;
    }

    if (messageSet.get_Count() < 1) {
        std::cout << "No messages found." << "\r\n";
        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.
    CkEmail email;
    success = imap.FetchEmail(false,messageSet.GetId(0),messageSet.get_HasUids(),email);
    if (success == false) {
        std::cout << imap.lastErrorText() << "\r\n";
        return;
    }

    //  The email should contain an attached email.
    //  The Invoice XML is contained within the attached email.
    CkEmail attachedEmail;
    success = email.GetAttachedEmail(0,attachedEmail);
    if (success == false) {
        std::cout << email.lastErrorText() << "\r\n";
        return;
    }

    //  Get the MIME of the attached email..
    CkStringBuilder sbMime;
    success = attachedEmail.GetMimeSb(sbMime);

    //  Load it into a Chilkat MIME object.
    CkMime mime;
    success = mime.LoadMimeSb(sbMime);

    //  Examine the structure of the MIME.
    std::cout << mime.getStructure("text") << "\r\n";

    //  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
    CkBinData bdP7m;
    //  Get the 2nd sub-part, at index 1 because index 0 is the 1st sub-part.

    CkMime mimeP7m;
    success = mime.PartAt(1,mimeP7m);
    if (success == false) {
        std::cout << mime.lastErrorText() << "\r\n";
        return;
    }

    if (mime.get_LastMethodSuccess() != true) {
        std::cout << "Failed to get 2nd sub-part. Perhaps the MIME does not have a 2nd sub-part?" << "\r\n";
        return;
    }

    success = mimeP7m.GetBodyBd(bdP7m);

    //  Verify the signature, which also extracts the content contained within the opaque signature.
    CkCrypt2 crypt;
    success = crypt.OpaqueVerifyBd(bdP7m);
    if (success == false) {
        std::cout << crypt.lastErrorText() << "\r\n";
        return;
    }

    //  The bdP7m now contains the Invoice XML.
    //  Load it into an XML object.
    CkXml xml;
    success = xml.LoadBd(bdP7m,true);

    std::cout << xml.getXml() << "\r\n";

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

    std::cout << "success." << "\r\n";
    }