[iOS] envoyer un email avec fichier joint

mercredi 15 juillet 2015
Voici une méthode pour envoyer un email avec MFMailCompose. Tout d’abord dans le .h, on va utilisé les fonctions Delegate de MFMailComposeViewControllerDelegate pour gérer l’envoi du mail.
#import <MessageUI/MessageUI.h>
@interface ViewController : UIViewController <MFMailComposeViewControllerDelegate>
Et dans le .m, la fonction qui se charge de composer le mail
- (void)send:(id)sender {
    Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
    if (mailClass != nil) {
        NSString *emailTitle = @"Email title";
        NSString *messageBody = @"Body Message";
        NSArray *toRecipents = [NSArray arrayWithObject:@"email@email.be"];
 
        MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
        mc.mailComposeDelegate = self;
        [mc setSubject:emailTitle];
        [mc setMessageBody:messageBody isHTML:NO];
        [mc setToRecipients:toRecipents];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *newpath = [documentsDirectory stringByAppendingPathComponent:@"file.csv"];
        NSData *fileData = [NSData dataWithContentsOfFile:newpath];
    
        // Determine the MIME type
        NSString *mimeType = @"text/csv";
    
        // Add attachment
        [mc addAttachmentData:fileData mimeType:mimeType fileName:@"filename_display_in_mail.csv"];
        if([mailClass canSendMail])
            [self presentViewController:mc animated:YES completion:NULL];
    }
}
Le test mailClass != nil permet de vérifier si un compte mail a bien été correctement configurer sur le device pour pouvoir envoyer un email. Sans quoi Xcode risque de vous retourner une erreur. Enfin, il peut aussi être utile d’utiliser la fonction suivante pour gérer le cas ou l’utilisateur clique sur le bouton cancel par exemple:
#pragma mark - MFMailComposeViewController delegate
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
    [self dismissViewControllerAnimated:YES completion:nil];
    [self.navigationController popToRootViewControllerAnimated:NO];
}

Tags: attachment , mail , MFMailComposeViewControllerDelegate , Xcode