Xcode 4 / iOS - Send an email using SMTP from inside my app

Solution 1:

You can easily send emails from your iOS device. No need to implement SMTP and all. Best thing about using inbuilt emailing facilities in iOS is it gives you access to the address book! So it auto-completes names, email addresses. Yaaiiii!!

Include, AddressBook,AddressBookUI and MessageUI frameworks and code something like this. Note you can even choose to send content as HTML too!

#import <MessageUI/MessageUI.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>

MFMailComposeViewController *mailComposer; 
mailComposer  = [[MFMailComposeViewController alloc] init];
mailComposer.mailComposeDelegate = self;
[mailComposer setModalPresentationStyle:UIModalPresentationFormSheet];
[mailComposer setSubject:@"your custom subject"];
[mailComposer setMessageBody:@"your custom body content" isHTML:NO];
[self presentModalViewController:mailComposer animated:YES];
[mailComposer release];

For the sake of completeness, I have to write this selector to dismiss the email window if the user presses cancel or send -

- (void)mailComposeController:(MFMailComposeViewController*)controller 
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError*)error 
{ 
    if(error) NSLog(@"ERROR - mailComposeController: %@", [error localizedDescription]);
    [self dismissModalViewControllerAnimated:YES];
    return;
}

Happy coding...

Solution 2:

It should be noted that MFMailComposeViewController has a method called canSendMail. If you don't check this before presenting a MFMailComposeViewController on a device that doesn't have an email account, you'll get a SIGABRT.

It's easy to miss this when testing on the device or the simulator since you'll probably have an email account on your Mac and your iPad.

Solution 3:

SKPSMTPMessage still works fine for sending emails without the need for a UI .

Make sure you add a reference to the CFNetwork.framework in your project. Otherwise you will get build errors.

Solution 4:

I would imagine the Apple Approved way of doing this would be to send the data to a server via HTTP Post, and have the server generate the mail for you. I've seen others asking similar questions to this, and the answer is that if you send it from the device, you really need to prompt the user.

I can even tell you why this is: Imagine an application that could send itself to everyone in your address book without the your confirmation, telling them that you just installed application X, and they should too. Even if well intentioned, this could quickly create a huge SMTP storm, and in essence this would be the "I love you" virus.

That was enough of a strain on the public internet, but on wireless carriers, could quickly cause enough overload to block cel service.

Conclusion: Either use the ComposeViewController as @Srikar suggests, or else POST the data to your server, and send it from there.