我怎样才能从iPhone应用程序发送邮件

我想从我的iPhone应用程序发送电子邮件。 我听说iOS SDK没有电子邮件API。 我不想使用下面的代码,因为它会退出我的应用程序:

NSString *url = [NSString stringWithString: @"mailto:foo@example.com?cc=bar@example.com&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!"]; [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]]; 

那么我怎样才能从我的应用程序发送电子邮件?

在iOS 3.0及更高版本中,您应该使用MFMailComposeViewController类和放在MessageUI框架中的MFMailComposeViewControllerDelegate协议。

首先添加框架并导入:

 #import <MessageUI/MFMailComposeViewController.h> 

然后,发送消息:

 MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init]; controller.mailComposeDelegate = self; [controller setSubject:@"My Subject"]; [controller setMessageBody:@"Hello there." isHTML:NO]; if (controller) [self presentModalViewController:controller animated:YES]; [controller release]; 

然后用户完成工作,并及时获得委托callback:

 - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error; { if (result == MFMailComposeResultSent) { NSLog(@"It's away!"); } [self dismissModalViewControllerAnimated:YES]; } 

请记得检查设备是否configuration为发送电子邮件:

 if ([MFMailComposeViewController canSendMail]) { // Show the composer } else { // Handle the error } 

MFMailComposeViewController是iPhone OS 3.0软件发布之后的方式。 你可以看看示例代码或我写的教程 。

我想在这里添加几件事情:

  1. 在模拟器中使用mailto URL将不起作用,因为mail.app没有安装在模拟器上。 它确实在设备上工作。

  2. mailto URL的长度有一个限制。 如果URL大于4096个字符,mail.app将不会启动。

  3. 在OS 3.0中有一个新的类,让你不用离开你的应用程序就可以发送电子邮件。 请参阅MFMailComposeViewController类。

如果您想从您的应用程序发送电子邮件,上述代码是唯一的方法,除非您在您的应用程序中编写自己的邮件客户端(SMTP),或让服务器为您发送邮件。

例如,您可以编写您的应用程序来调用服务器上的URL,以便为您发送邮件。 然后你只需从你的代码中调用URL。

请注意,使用上面的代码,您不能附加任何东西到SMTP客户端方法允许您执行的电子邮件以及服务器端方法。

下面的代码是在我的应用程序中使用附件发送电子邮件在这里附件是一个图像。您可以发送任何types的文件只是要记住的是,你必须指定正确的'mimeType'

将此添加到您的.h文件

 #import <MessageUI/MFMailComposeViewController.h> 

MessageUI.framework添加到您的项目文件

 NSArray *paths = SSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *getImagePath = [documentsDirectory stringByAppendingPathComponent:@"myGreenCard.png"]; MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init]; controller.mailComposeDelegate = self; [controller setSubject:@"Green card application"]; [controller setMessageBody:@"Hi , <br/> This is my new latest designed green card." isHTML:YES]; [controller addAttachmentData:[NSData dataWithContentsOfFile:getImagePath] mimeType:@"png" fileName:@"My Green Card"]; if (controller) [self presentModalViewController:controller animated:YES]; [controller release]; 

代表方法如下所示

  -(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error; { if (result == MFMailComposeResultSent) { NSLog(@"It's away!"); } [self dismissModalViewControllerAnimated:YES]; } 

这是可以帮助你的代码,但不要忘记包含消息ui framewark并包含委托方法MFMailComposeViewControllerDelegate

 -(void)EmailButtonACtion{ if ([MFMailComposeViewController canSendMail]) { MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init]; controller.mailComposeDelegate = self; [controller.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigation_bg_iPhone.png"] forBarMetrics:UIBarMetricsDefault]; controller.navigationBar.tintColor = [UIColor colorWithRed:51.0/255.0 green:51.0/255.0 blue:51.0/255.0 alpha:1.0]; [controller setSubject:@""]; [controller setMessageBody:@" " isHTML:YES]; [controller setToRecipients:[NSArray arrayWithObjects:@"",nil]]; UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; UIImage *ui = resultimg.image; pasteboard.image = ui; NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(ui)]; [controller addAttachmentData:imageData mimeType:@"image/png" fileName:@" "]; [self presentViewController:controller animated:YES completion:NULL]; } else{ UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"alrt" message:nil delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil] ; [alert show]; } } -(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { [MailAlert show]; switch (result) { case MFMailComposeResultCancelled: MailAlert.message = @"Email Cancelled"; break; case MFMailComposeResultSaved: MailAlert.message = @"Email Saved"; break; case MFMailComposeResultSent: MailAlert.message = @"Email Sent"; break; case MFMailComposeResultFailed: MailAlert.message = @"Email Failed"; break; default: MailAlert.message = @"Email Not Sent"; break; } [self dismissViewControllerAnimated:YES completion:NULL]; [MailAlert show]; } 

要从iPhone应用程序发送电子邮件,你需要做下面的任务列表。

第1步: 导入#import <MessageUI/MessageUI.h>在您想要发送电子邮件的控制器类中。

第2步:将代理添加到您的控制器,如下所示

  @interface <yourControllerName> : UIViewController <MFMessageComposeViewControllerDelegate, MFMailComposeViewControllerDelegate> 

第3步:添加以下方法发送电子邮件。

  - (void) sendEmail { // Check if your app support the email. if ([MFMailComposeViewController canSendMail]) { // Create an object of mail composer. MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init]; // Add delegate to your self. mailComposer.mailComposeDelegate = self; // Add recipients to mail if you do not want to add default recipient then remove below line. [mailComposer setToRecipients:@[<add here your recipient objects>]]; // Write email subject. [mailComposer setSubject:@“<Your Subject Here>”]; // Set your email body and if body contains HTML then Pass “YES” in isHTML. [mailComposer setMessageBody:@“<Your Message Body>” isHTML:NO]; // Show your mail composer. [self presentViewController:mailComposer animated:YES completion:NULL]; } else { // Here you can show toast to user about not support to sending email. } } 

第4步:实现MFMailComposeViewController委托

 - (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(nullable NSError *)error { [controller dismissViewControllerAnimated:TRUE completion:nil]; switch (result) { case MFMailComposeResultSaved: { // Add code on save mail to draft. break; } case MFMailComposeResultSent: { // Add code on sent a mail. break; } case MFMailComposeResultCancelled: { // Add code on cancel a mail. break; } case MFMailComposeResultFailed: { // Add code on failed to send a mail. break; } default: break; } } 

Swift 2.0

 func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?){ if let error = error{ print("Error: \(error)") }else{ //NO Error //------------------------------------------------ var feedbackMsg = "" switch result.rawValue { case MFMailComposeResultCancelled.rawValue: feedbackMsg = "Mail Cancelled" case MFMailComposeResultSaved.rawValue: feedbackMsg = "Mail Saved" case MFMailComposeResultSent.rawValue: feedbackMsg = "Mail Sent" case MFMailComposeResultFailed.rawValue: feedbackMsg = "Mail Failed" default: feedbackMsg = "" } print("Mail: \(feedbackMsg)") //------------------------------------------------ } } 

Swift 2.2。 改编自Esq的回答

 import Foundation import MessageUI class MailSender: NSObject, MFMailComposeViewControllerDelegate { let parentVC: UIViewController init(parentVC: UIViewController) { self.parentVC = parentVC super.init() } func send(title: String, messageBody: String, toRecipients: [String]) { if MFMailComposeViewController.canSendMail() { let mc: MFMailComposeViewController = MFMailComposeViewController() mc.mailComposeDelegate = self mc.setSubject(title) mc.setMessageBody(messageBody, isHTML: false) mc.setToRecipients(toRecipients) parentVC.presentViewController(mc, animated: true, completion: nil) } else { print("No email account found.") } } func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) { switch result.rawValue { case MFMailComposeResultCancelled.rawValue: print("Mail Cancelled") case MFMailComposeResultSaved.rawValue: print("Mail Saved") case MFMailComposeResultSent.rawValue: print("Mail Sent") case MFMailComposeResultFailed.rawValue: print("Mail Failed") default: break } parentVC.dismissViewControllerAnimated(false, completion: nil) } } 

客户代码:

 var ms: MailSender? @IBAction func onSendPressed(sender: AnyObject) { ms = MailSender(parentVC: self) let title = "Title" let messageBody = "https://stackoverflow.com/questions/310946/how-can-i-send-mail-from-an-iphone-application this question." let toRecipents = ["foo@bar.com"] ms?.send(title, messageBody: messageBody, toRecipents: toRecipents) } 

下面是一个Swift版本:

 import MessageUI class YourVC: UIViewController { override func viewDidLoad() { super.viewDidLoad() if MFMailComposeViewController.canSendMail() { var emailTitle = "Vea Software Feedback" var messageBody = "Vea Software! :) " var toRecipents = ["pj@veasoftware.com"] var mc:MFMailComposeViewController = MFMailComposeViewController() mc.mailComposeDelegate = self mc.setSubject(emailTitle) mc.setMessageBody(messageBody, isHTML: false) mc.setToRecipients(toRecipents) self.presentViewController(mc, animated: true, completion: nil) } else { println("No email account found") } } } extension YourVC: MFMailComposeViewControllerDelegate { func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) { switch result.value { case MFMailComposeResultCancelled.value: println("Mail Cancelled") case MFMailComposeResultSaved.value: println("Mail Saved") case MFMailComposeResultSent.value: println("Mail Sent") case MFMailComposeResultFailed.value: println("Mail Failed") default: break } self.dismissViewControllerAnimated(false, completion: nil) } } 

资源

我写了一个名为KRNSendEmail的简单包装,简化了发送电子邮件到一个方法调用。

KRNSendEmaillogging良好,并添加到CocoaPods。

https://github.com/ulian-onua/KRNSendEmail