Unicode C
Unicode 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 Unicode C Downloads
#include <C_CkImapW.h>
#include <C_CkMessageSetW.h>
#include <C_CkEmailW.h>
#include <C_CkStringBuilderW.h>
#include <C_CkMimeW.h>
#include <C_CkBinDataW.h>
#include <C_CkCrypt2W.h>
#include <C_CkXmlW.h>
void ChilkatSample(void)
{
BOOL success;
HCkImapW imap;
BOOL fetchUids;
HCkMessageSetW messageSet;
HCkEmailW email;
HCkEmailW attachedEmail;
HCkStringBuilderW sbMime;
HCkMimeW mime;
HCkBinDataW bdP7m;
HCkMimeW mimeP7m;
HCkCrypt2W crypt;
HCkXmlW xml;
success = FALSE;
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
imap = CkImapW_Create();
// Connect using TLS.
CkImapW_putSsl(imap,TRUE);
CkImapW_putPort(imap,993);
success = CkImapW_Connect(imap,L"imap.example.com");
if (success == FALSE) {
wprintf(L"%s\n",CkImapW_lastErrorText(imap));
CkImapW_Dispose(imap);
return;
}
// Authenticate
success = CkImapW_Login(imap,L"email_account_login",L"email_account_password");
if (success == FALSE) {
wprintf(L"%s\n",CkImapW_lastErrorText(imap));
CkImapW_Dispose(imap);
return;
}
// Select an IMAP mailbox
success = CkImapW_SelectMailbox(imap,L"Inbox/postacert");
if (success == FALSE) {
wprintf(L"%s\n",CkImapW_lastErrorText(imap));
CkImapW_Dispose(imap);
return;
}
// Search for messages having "POSTA CERTIFICATA: Invio File" in the subject.
fetchUids = TRUE;
messageSet = CkMessageSetW_Create();
success = CkImapW_QueryMbx(imap,L"SUBJECT \"POSTA CERTIFICATA: Invio File\"",fetchUids,messageSet);
if (success == FALSE) {
wprintf(L"%s\n",CkImapW_lastErrorText(imap));
CkImapW_Dispose(imap);
CkMessageSetW_Dispose(messageSet);
return;
}
if (CkMessageSetW_getCount(messageSet) < 1) {
wprintf(L"No messages found.\n");
CkImapW_Dispose(imap);
CkMessageSetW_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 = CkEmailW_Create();
success = CkImapW_FetchEmail(imap,FALSE,CkMessageSetW_GetId(messageSet,0),CkMessageSetW_getHasUids(messageSet),email);
if (success == FALSE) {
wprintf(L"%s\n",CkImapW_lastErrorText(imap));
CkImapW_Dispose(imap);
CkMessageSetW_Dispose(messageSet);
CkEmailW_Dispose(email);
return;
}
// The email should contain an attached email.
// The Invoice XML is contained within the attached email.
attachedEmail = CkEmailW_Create();
success = CkEmailW_GetAttachedEmail(email,0,attachedEmail);
if (success == FALSE) {
wprintf(L"%s\n",CkEmailW_lastErrorText(email));
CkImapW_Dispose(imap);
CkMessageSetW_Dispose(messageSet);
CkEmailW_Dispose(email);
CkEmailW_Dispose(attachedEmail);
return;
}
// Get the MIME of the attached email..
sbMime = CkStringBuilderW_Create();
success = CkEmailW_GetMimeSb(attachedEmail,sbMime);
// Load it into a Chilkat MIME object.
mime = CkMimeW_Create();
success = CkMimeW_LoadMimeSb(mime,sbMime);
// Examine the structure of the MIME.
wprintf(L"%s\n",CkMimeW_getStructure(mime,L"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 = CkBinDataW_Create();
// Get the 2nd sub-part, at index 1 because index 0 is the 1st sub-part.
mimeP7m = CkMimeW_Create();
success = CkMimeW_PartAt(mime,1,mimeP7m);
if (success == FALSE) {
wprintf(L"%s\n",CkMimeW_lastErrorText(mime));
CkImapW_Dispose(imap);
CkMessageSetW_Dispose(messageSet);
CkEmailW_Dispose(email);
CkEmailW_Dispose(attachedEmail);
CkStringBuilderW_Dispose(sbMime);
CkMimeW_Dispose(mime);
CkBinDataW_Dispose(bdP7m);
CkMimeW_Dispose(mimeP7m);
return;
}
if (CkMimeW_getLastMethodSuccess(mime) != TRUE) {
wprintf(L"Failed to get 2nd sub-part. Perhaps the MIME does not have a 2nd sub-part?\n");
CkImapW_Dispose(imap);
CkMessageSetW_Dispose(messageSet);
CkEmailW_Dispose(email);
CkEmailW_Dispose(attachedEmail);
CkStringBuilderW_Dispose(sbMime);
CkMimeW_Dispose(mime);
CkBinDataW_Dispose(bdP7m);
CkMimeW_Dispose(mimeP7m);
return;
}
success = CkMimeW_GetBodyBd(mimeP7m,bdP7m);
// Verify the signature, which also extracts the content contained within the opaque signature.
crypt = CkCrypt2W_Create();
success = CkCrypt2W_OpaqueVerifyBd(crypt,bdP7m);
if (success == FALSE) {
wprintf(L"%s\n",CkCrypt2W_lastErrorText(crypt));
CkImapW_Dispose(imap);
CkMessageSetW_Dispose(messageSet);
CkEmailW_Dispose(email);
CkEmailW_Dispose(attachedEmail);
CkStringBuilderW_Dispose(sbMime);
CkMimeW_Dispose(mime);
CkBinDataW_Dispose(bdP7m);
CkMimeW_Dispose(mimeP7m);
CkCrypt2W_Dispose(crypt);
return;
}
// The bdP7m now contains the Invoice XML.
// Load it into an XML object.
xml = CkXmlW_Create();
success = CkXmlW_LoadBd(xml,bdP7m,TRUE);
wprintf(L"%s\n",CkXmlW_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
wprintf(L"success.\n");
CkImapW_Dispose(imap);
CkMessageSetW_Dispose(messageSet);
CkEmailW_Dispose(email);
CkEmailW_Dispose(attachedEmail);
CkStringBuilderW_Dispose(sbMime);
CkMimeW_Dispose(mime);
CkBinDataW_Dispose(bdP7m);
CkMimeW_Dispose(mimeP7m);
CkCrypt2W_Dispose(crypt);
CkXmlW_Dispose(xml);
}