Objective-C
Objective-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 Objective-C Downloads
#import <CkoImap.h>
#import <CkoMessageSet.h>
#import <CkoEmail.h>
#import <CkoStringBuilder.h>
#import <CkoMime.h>
#import <CkoBinData.h>
#import <CkoCrypt2.h>
#import <CkoXml.h>
BOOL success = NO;
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
CkoImap *imap = [[CkoImap alloc] init];
// Connect using TLS.
imap.Ssl = YES;
imap.Port = [NSNumber numberWithInt:993];
success = [imap Connect: @"imap.example.com"];
if (success == NO) {
NSLog(@"%@",imap.LastErrorText);
return;
}
// Authenticate
success = [imap Login: @"email_account_login" password: @"email_account_password"];
if (success == NO) {
NSLog(@"%@",imap.LastErrorText);
return;
}
// Select an IMAP mailbox
success = [imap SelectMailbox: @"Inbox/postacert"];
if (success == NO) {
NSLog(@"%@",imap.LastErrorText);
return;
}
// Search for messages having "POSTA CERTIFICATA: Invio File" in the subject.
BOOL fetchUids = YES;
CkoMessageSet *messageSet = [[CkoMessageSet alloc] init];
success = [imap QueryMbx: @"SUBJECT \"POSTA CERTIFICATA: Invio File\"" bUid: fetchUids msgSet: messageSet];
if (success == NO) {
NSLog(@"%@",imap.LastErrorText);
return;
}
if ([messageSet.Count intValue] < 1) {
NSLog(@"%@",@"No messages found.");
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.
CkoEmail *email = [[CkoEmail alloc] init];
success = [imap FetchEmail: NO msgId: [messageSet GetId: [NSNumber numberWithInt: 0]] bUid: messageSet.HasUids email: email];
if (success == NO) {
NSLog(@"%@",imap.LastErrorText);
return;
}
// The email should contain an attached email.
// The Invoice XML is contained within the attached email.
CkoEmail *attachedEmail = [[CkoEmail alloc] init];
success = [email GetAttachedEmail: [NSNumber numberWithInt: 0] email: attachedEmail];
if (success == NO) {
NSLog(@"%@",email.LastErrorText);
return;
}
// Get the MIME of the attached email..
CkoStringBuilder *sbMime = [[CkoStringBuilder alloc] init];
success = [attachedEmail GetMimeSb: sbMime];
// Load it into a Chilkat MIME object.
CkoMime *mime = [[CkoMime alloc] init];
success = [mime LoadMimeSb: sbMime];
// Examine the structure of the MIME.
NSLog(@"%@",[mime 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
CkoBinData *bdP7m = [[CkoBinData alloc] init];
// Get the 2nd sub-part, at index 1 because index 0 is the 1st sub-part.
CkoMime *mimeP7m = [[CkoMime alloc] init];
success = [mime PartAt: [NSNumber numberWithInt: 1] subPart: mimeP7m];
if (success == NO) {
NSLog(@"%@",mime.LastErrorText);
return;
}
if (mime.LastMethodSuccess != YES) {
NSLog(@"%@",@"Failed to get 2nd sub-part. Perhaps the MIME does not have a 2nd sub-part?");
return;
}
success = [mimeP7m GetBodyBd: bdP7m];
// Verify the signature, which also extracts the content contained within the opaque signature.
CkoCrypt2 *crypt = [[CkoCrypt2 alloc] init];
success = [crypt OpaqueVerifyBd: bdP7m];
if (success == NO) {
NSLog(@"%@",crypt.LastErrorText);
return;
}
// The bdP7m now contains the Invoice XML.
// Load it into an XML object.
CkoXml *xml = [[CkoXml alloc] init];
success = [xml LoadBd: bdP7m autoTrim: YES];
NSLog(@"%@",[xml 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
NSLog(@"%@",@"success.");