Xbase++ Requires Chilkat v11.0.0+
Xbase++
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 Xbase++ Downloads
LOCAL nSuccess
LOCAL oImap
LOCAL nFetchUids
LOCAL oMessageSet
LOCAL oEmail
LOCAL oAttachedEmail
LOCAL oSbMime
LOCAL oMime
LOCAL oBdP7m
LOCAL oMimeP7m
LOCAL oCrypt
LOCAL oXml
nSuccess := 0
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
oImap := CreateObject("Chilkat.Imap")
// Connect using TLS.
oImap:Ssl := 1
oImap:Port := 993
nSuccess := oImap:Connect("imap.example.com")
IF (nSuccess == 0)
? oImap:LastErrorText
oImap:destroy()
RETURN
ENDIF
// Authenticate
nSuccess := oImap:Login("email_account_login", "email_account_password")
IF (nSuccess == 0)
? oImap:LastErrorText
oImap:destroy()
RETURN
ENDIF
// Select an IMAP mailbox
nSuccess := oImap:SelectMailbox("Inbox/postacert")
IF (nSuccess == 0)
? oImap:LastErrorText
oImap:destroy()
RETURN
ENDIF
// Search for messages having "POSTA CERTIFICATA: Invio File" in the subject.
nFetchUids := 1
oMessageSet := CreateObject("Chilkat.MessageSet")
nSuccess := oImap:QueryMbx('SUBJECT "POSTA CERTIFICATA: Invio File"', nFetchUids, oMessageSet)
IF (nSuccess == 0)
? oImap:LastErrorText
oImap:destroy()
oMessageSet:destroy()
RETURN
ENDIF
IF (oMessageSet:Count < 1)
? "No messages found."
oImap:destroy()
oMessageSet:destroy()
RETURN
ENDIF
// For our example, we'll process only the 1st email in the messageSet.
// Download the MIME source of the email into a StringBuilder object.
oEmail := CreateObject("Chilkat.Email")
nSuccess := oImap:FetchEmail(0, oMessageSet:GetId(0), oMessageSet:HasUids, oEmail)
IF (nSuccess == 0)
? oImap:LastErrorText
oImap:destroy()
oMessageSet:destroy()
oEmail:destroy()
RETURN
ENDIF
// The email should contain an attached email.
// The Invoice XML is contained within the attached email.
oAttachedEmail := CreateObject("Chilkat.Email")
nSuccess := oEmail:GetAttachedEmail(0, oAttachedEmail)
IF (nSuccess == 0)
? oEmail:LastErrorText
oImap:destroy()
oMessageSet:destroy()
oEmail:destroy()
oAttachedEmail:destroy()
RETURN
ENDIF
// Get the MIME of the attached email..
oSbMime := CreateObject("Chilkat.StringBuilder")
nSuccess := oAttachedEmail:GetMimeSb(oSbMime)
// Load it into a Chilkat MIME object.
oMime := CreateObject("Chilkat.Mime")
nSuccess := oMime:LoadMimeSb(oSbMime)
// Examine the structure of the MIME.
? oMime:GetStructure("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
oBdP7m := CreateObject("Chilkat.BinData")
// Get the 2nd sub-part, at index 1 because index 0 is the 1st sub-part.
oMimeP7m := CreateObject("Chilkat.Mime")
nSuccess := oMime:PartAt(1, oMimeP7m)
IF (nSuccess == 0)
? oMime:LastErrorText
oImap:destroy()
oMessageSet:destroy()
oEmail:destroy()
oAttachedEmail:destroy()
oSbMime:destroy()
oMime:destroy()
oBdP7m:destroy()
oMimeP7m:destroy()
RETURN
ENDIF
IF (oMime:LastMethodSuccess != 1)
? "Failed to get 2nd sub-part. Perhaps the MIME does not have a 2nd sub-part?"
oImap:destroy()
oMessageSet:destroy()
oEmail:destroy()
oAttachedEmail:destroy()
oSbMime:destroy()
oMime:destroy()
oBdP7m:destroy()
oMimeP7m:destroy()
RETURN
ENDIF
nSuccess := oMimeP7m:GetBodyBd(oBdP7m)
// Verify the signature, which also extracts the content contained within the opaque signature.
oCrypt := CreateObject("Chilkat.Crypt2")
nSuccess := oCrypt:OpaqueVerifyBd(oBdP7m)
IF (nSuccess == 0)
? oCrypt:LastErrorText
oImap:destroy()
oMessageSet:destroy()
oEmail:destroy()
oAttachedEmail:destroy()
oSbMime:destroy()
oMime:destroy()
oBdP7m:destroy()
oMimeP7m:destroy()
oCrypt:destroy()
RETURN
ENDIF
// The bdP7m now contains the Invoice XML.
// Load it into an XML object.
oXml := CreateObject("Chilkat.Xml")
nSuccess := oXml:LoadBd(oBdP7m, 1)
? oXml:GetXml()
// 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
? "success."
oImap:destroy()
oMessageSet:destroy()
oEmail:destroy()
oAttachedEmail:destroy()
oSbMime:destroy()
oMime:destroy()
oBdP7m:destroy()
oMimeP7m:destroy()
oCrypt:destroy()
oXml:destroy()