T#012 – Inviamo e-mail dalle nostre Applicazioni




(Nessun voto)
Nel tutorial “T#004 – Inviare una e-mail” avevamo visto come inviare una mail da iPhone, passando destinatari, oggetto e corpo del messaggio dalla nostra applicazione a quella nativa, Mail, di iPhone. Ovviamente questo metodo è un po’ scomodo, in quanto porta alla chiusura del nostro programma in esecuzione per poter aprire Mail ed inviare così il messaggio di posta. Sta di fatto che questa è comunque l’unica soluzione per chi ha ancora un iPhone con firmware precedente alla versione 3.0. E’ infatti da questa versione del firmware che è stata aggiunta la possibilità di implementare l’invio diretto delle e-mail dalle nostre Applicazioni. Grazie al framework “MessageUI.framework” e poche righe di codice potremo quindi inviare e-mail direttamente dalle nostre applicazioni senza uscire dal programma.
Partiamo quindi con il nostro tutorial:
- Apriamo Xcode e creiamo un nuovo progetto
- Dall’elenco dei template disponibili scegliamo “View-based Application” e proseguiamo
- Date un nome all’applicazione, ad esempio “inAppMail”
- Scegliete dove salvare il programma e proseguite
Prima di iniziare a scrivere codice dovremo inserire il framework “MessageUI.framework”. Per farlo seguite questi semplici passi:
- Cliccate con il pulsante destro del mouse su “Frameworks” in “Groups & Files”
- Cliccate su “Add”, quindi su “Existing Frameworks…”
- Dalla nuova finestra cercate e selezionate “MessageUI.framework” e cliccate infine su “Add”
Apriamo ora il file “inAppMailViewController.h” e inseriamo il seguente codice:
#import <UIKit/UIKit.h> #import <MessageUI/MessageUI.h> @interface inAppMailViewController : UIViewController <MFMailComposeViewControllerDelegate, UINavigationControllerDelegate> { } -(IBAction)inviaMail; @end
Non abbiamo fatto altro che importare “MessageUI/MessageUI.h” per poter utilizzare ciò che ci offre il nuovo framework, abbiamo aggiunto i protocolli “MFMailComposeViewControllerDelegate” e “UINavigationControllerDelegate” e abbiamo dichiarato infine un metodo di tipo IBAction, che collegheremo ad un oggetto UIButton creato più avanti con Interface Builder, di nome “inviaMail”.
Apriamo ora il file “inAppMailViewController.m” e inseriamo il seguente codice:
-(IBAction)inviaMail{ MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init]; mail.mailComposeDelegate = self; if([MFMailComposeViewController canSendMail]){ [mail setToRecipients:[NSArray arrayWithObjects:@"info@devapp.it", nil]]; [mail setSubject:@"Oggetto della mail"]; [mail setMessageBody:@"Corpo del messaggio della nostra e-mail" isHTML:NO]; [self presentModalViewController:mail animated:YES]; } [mail release]; } - (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{ [self dismissModalViewControllerAnimated:YES]; if (result == MFMailComposeResultFailed){ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Messaggio non inviato!" message:@"Non è stato possibile inviare la tua e-mail" delegate:self cancelButtonTitle:@"Annulla" otherButtonTitles:nil]; [alert show]; [alert release]; } }
Con il primo metodo, “inviaMail”, creiamo un oggetto di tipo “MFMailComposeViewController” di nome “mail”, settiamo il suo delegato a self e verifichiamo se la mail può essere inviata. In caso affermativo settiamo destinatari, oggetto e corpo del messaggio via codice (anche se potremmo tranquillamente creare un’interfaccia grafica e lasciare all’utente il compito di compilare questi campi) e apriamo tramite una semplice animazione la ModalViewController che conterrà il nostro messaggio pronto per l’invio.
Il secondo metodo serve semplicemente a farci tornare alla nostra applicazione una volta inviato il messaggio e in caso di errore durante l’invio, a restituirci un messaggio di alert che ci indica quanto appena accaduto. Per quanto riguarda il codice è tutto.
Apriamo ora Interface Builder facendo doppio click sul file “inAppMailViewController.xib”. Trasciniamo quindi nella view un oggetto UIButton, modifichiamo la sua proprietà “Title” in “INVIA E-MAIL” e clicchiamo su “File’s Owner”. Colleghiamo quindi il metodo “inviaMail” con il pulsante appena creato facendo attenzione a scegliere “Touch up inside” dall’elenco che ci appare rilasciando il mouse sull’UIButton. Il risultato, “abbellimenti estetici” a parte, è una semplice vista con un pulsante al suo interno:

Salviamo e chiudiamo Interface Builder. Da Xcode clicchiamo su “Build and Run” e testiamo la nostra applicazione. L’invio vero e proprio della mail sarà possibile solo se l’applicazione viene testata da un dispositivo, tramite iPhone Simulator dovremo accontentarci di vedere la mail pronta per l’invio al click del pulsante. Di seguito due immagine dell’applicazione durante l’esecuzione:


Se voleste inserire un allegato, ad esempio un’immagine contenuta nel vostro progetto, dovrete inserire prima dell’istruzione [self presentModalViewController:mail animated:YES]; il seguente codice:
UIImage *img = [UIImage imageNamed:@"background.png"]; NSData *myData = UIImageJPEGRepresentation(img ,1.0); [mail addAttachmentData:myData mimeType:@"image/png" fileName:@"image.jpeg"];
Dove in imageNamed dovete mettere il nome della vostra immagine, nel nostro esempio background.png e in fileName il nome che avrà il file allegato alla mail (dovrebbe essere lo stesso, ma volendo si può cambiare).
Questo articolo è stato inserito da Rino Picardi il 26 novembre 2009 alle 23:14, ed è archiviato in Tutorial Pratici. Puoi seguire le risposte con i feeds RSS 2.0. Oppure scrivere un commento o anche segnalare un trackback dal tuo sito.
-
#6 Pubblicato da Davide 1 un anno fa
Se si vuole provare l’applicazione sul simulatore senza configurare MAIL (nel caso non lo si abbia configurato) basta commentare il metodo inviaMail come segue:
-(IBAction)inviaMail{
MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init];
mail.mailComposeDelegate = self;
//#1 if([MFMailComposeViewController canSendMail]){
[mail setToRecipients:[NSArray arrayWithObjects:@"info@devapp.it", nil]];
[mail setSubject:@"Oggetto della mail"];
[mail setMessageBody:@"Corpo del messaggio della nostra e-mail" isHTML:NO];
[self presentModalViewController:mail animated:YES];
//#2 }[mail release];
} -
Nelle ultime righe di codice c’è un “errore”: il mime-type corretto è “image/jpeg” e non “image/png”. Li serve il mime-type del file attachment non dell’originale che è, effettivamente, PNG.
Per una lista completa si veda:
http://www.iana.org/assignments/media-types/ -
ciao.
premetto di essere un novizio per quello che è il mondo apple in termini di sviluppo ecc…
ho seguito passo per passo quanto spiegato.
nel momento in cui devo collegare il metodo inviaMail al button, questo non mi compare tra gli outlets.
Ho settato male qualcosa?
Complimenti per i tutorial.
Grazie -
- Segui i commenti di questo articolo
- 3. Objective-C: Le basi – parte 2
- 2. Objective-C: Le basi – parte 1
- L#015 – Programmazione “block-based”: i blocchi in Objective-C
- 1. Cocoa e Cocoa Touch
- T#084 – Differenti tipi di View Controller per le nostre TabBar
- L#014 – Un contratto tra la gli oggetti: il protocol
- XCode e SVN: Prendiamo controllo dei nostri progetti
- PhoneGap: Creare applicazioni per iPhone ed iPad senza Objective-C
- Xcode 3.2.4 e iOS SDK 4.1 disponibili per il download
- T#069 – Localizzare applicazioni iPhone tramite NSLocalizedString
















Una domanda….se volessi aggiungere alla mail un allegato che è contenuto nel bundle della mia applicazione? Grazieeeee