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
#import
@interface inAppMailViewController : UIViewController {
}
-(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];
;
;
}
}
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).












15 Responses to “T#012 – Inviamo e-mail dalle nostre Applicazioni”
30 Novembre 2009
LuigiUna domanda….se volessi aggiungere alla mail un allegato che è contenuto nel bundle della mia applicazione? Grazieeeee
2 Dicembre 2009
Staff devAPPHo aggiunto la soluzione alla tua richiesta nel tutorial (alla fine della pagina)
Se hai altre domande usa il forum così le richieste hanno maggior visibilità e anche altri programmatori possono dare una mano 😉
Alla prossima ^^
16 Gennaio 2010
ByterosOttima guida.
2 Febbraio 2010
rOKIMa se volessi accedere alla rubrica per gli indirizzi?
2 Febbraio 2010
Staff devAPPOttima domanda 🙂 Faremo prestissimo un tutorial sull’accesso alla rubrica 😉
17 Febbraio 2010
DavideSe 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];
}
9 Giugno 2010
Giovambattista FazioliNelle 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/
26 Agosto 2010
Thomasciao.
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
18 Ottobre 2010
mesalve volevo sapere come è possibile sempre che lo sia.. cambiare layout al form email, lo vorrei in italiano.. quindi al posto di send, invia.. e cosi via…
2 Marzo 2011
ValerioSito incredibile complimenti..ma non esiste nulla di simile cheinvece di trattare le mail tratti gli sms?
9 Marzo 2011
DarioCiao a tutti,
ottimo tutorial.
L’unica cosa che non capisco è che quando la eseguo sul dispositivo visualizzo le descrizioni in inglese.
C’è qualcosa di sbagliato nel mio progetto?
O è possible impostare la lingua per l’oggetto?
grazie mille
ciao
25 Gennaio 2012
luigicome fare se volessi settare il mittente della mail?
21 Maggio 2012
AlbertoCiao a tutti. Il tutorial è perfetto.
Ho solo una domanda: ho creato un’app con una tab bar con i vari pulsanti e in uno di questi ho fatto in modo che cliccandoci sopra venisse richiamato il file .xib “inappemailViewController.xib”.
Quando vado a testarla mi fa vedere il pulsante “Clicca qui per inviare l’email” però se ci clicco sopra mi da errore sigbart: ” int retVal = UIApplicationMain(argc, argv, nil, nil); sigbart”
Devo per caso modificare qualcosa nel IBAction del file inAppEmailViewController.m?
Fatemi sapere.
Grazie!
27 Settembre 2012
MosesAnche io…dove sbaglio? Delete Draft invece di elimina bozza!
7 Ottobre 2012
iLucasragazzi mi da errore… potete aiutarmi? -> http://d.pr/i/NLSe