Search code examples
iosios8mfmailcomposeviewcontrollermfmailcomposer

Sending email from the iOS sdk


I am trying to send email from within my iOS app.

The idea is to have one class SendMessage which all classes use to send email from within the app. It is a subclass of NSObject and is a MFMailComposeViewControllerDelegate

This is what the SendMessage class looks like

@implementation SendMessage

- (void) sendEmailFromViewController : (UIViewController *)viewController withSubject : (NSString *) subject withRecipient : (NSString *)recipient withMessage : (NSString *)message withCompletionBlock : (void(^)(void))completionBlock withFailure : (void(^)(void))failure {

    self.viewController = viewController;

    if (![MFMailComposeViewController canSendMail]){
        if (failure)
            failure();
    }
    else {
        MFMailComposeViewController *messageController = [[MFMailComposeViewController alloc] init];
        messageController.mailComposeDelegate = self.viewController;
        [messageController setSubject:subject];
        [messageController setToRecipients:[NSArray arrayWithObject:recipient]];
        [messageController setMessageBody:message isHTML:NO];

        [self.viewController presentModalViewController:messageController animated:YES];

    }
}

-(void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    [self.viewController dismissViewControllerAnimated:YES completion:nil];
}

@end

I am trying to call the class using:

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 3) {
        SendMessage *sendFeedback = [[SendMessage alloc] init];
        [sendFeedback sendEmailFromViewController:self withSubject:@"App Feedback" withRecipient:@"[email protected]" withMessage:@"This is app feedback" withCompletionBlock:nil withFailure:nil];
    }
}

The problem is that although I am able to send the email, the delegate method is not being called. How do I fix it ?


Solution

  • Your delegate is the UIViewController, so implement the mailComposeController:didFinishWithResult:error delegate method there.