【问题标题】:How can I send mail from an iPhone application如何从 iPhone 应用程序发送邮件
【发布时间】:2010-09-23 13:57:12
【问题描述】:

我想从我的 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 iphone email cocoa-touch


    【解决方案1】:

    在 iOS 3.0 及更高版本上,您应该使用 MFMailComposeViewController 类和 MFMailComposeViewControllerDelegate 协议,它们隐藏在 MessageUI 框架中。

    首先添加framework并导入:

    #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];
    

    然后用户做工作,你及时得到委托回调:

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

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

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

    【讨论】:

    • +1。这里提到了需要导入的框架(mobileorchard.com/…)。
    • 为了节省你的跳跃,你需要#import
    • 请注意,由于编写了此答案,UIViewController 的方法 presentModalViewController:animated:dismissModalViewControllerAnimated: 已被标记为已弃用 - 而应使用基于块的替换方法 presentViewController:animated:completion:dismissViewControllerAnimated:completion:
    • 别忘了在.h中设置委托@interface viewController : UIViewController &lt;MFMailComposeViewControllerDelegate&gt;
    • 在 IOS 6 [self presentModalViewController:controller animated:YES]; 替换为 [self presentViewController:controller animated:YES completion:nil]; [self dismissModalViewControllerAnimated:YES]; 替换为 [self dismissViewControllerAnimated:YES completion:nil];
    【解决方案2】:

    MFMailComposeViewController 是 iPhone OS 3.0 软件发布后要走的路。您可以查看sample codetutorial I wrote

    【讨论】:

    • Mugunth 的精彩帖子。好兄弟!
    • 它真的很棒。谢谢。我专门设计了一个视图来接受用户的电子邮件和主题。通过实现相同的代码,它再次显示出一些相似的视图。我可以从视图控制器类中的按钮按下事件中调用委托方法吗谢谢你的帮助,Shibin
    • 我已经下载了相同的示例代码,但它没有发送任何邮件。它只提示邮件发送成功,但没有收到邮件。我尝试添加默认显示为红色的 MessageUI 框架,但应用程序仍然没有发送邮件。在这方面的任何帮助将不胜感激。我正在模拟器中测试应用程序。
    • 无法从模拟器发送电子邮件。
    【解决方案3】:

    我想在这里补充几点:

    1. 在模拟器中无法使用 mailto URL,因为模拟器上没有安装 mail.app。不过它确实可以在设备上运行。

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

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

    【讨论】:

      【解决方案4】:

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

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

      请注意,使用上面的代码,您不能将任何内容附加到电子邮件中,SMTP 客户端方法以及服务器端方法都允许您这样做。

      【讨论】:

        【解决方案5】:

        下面的代码在我的应用程序中用于发送带有附件的电子邮件,附件是图像。您可以发送任何类型的文件,唯一要记住的是您必须指定正确的 '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];
        }
        

        【讨论】:

          【解决方案6】:

          这是可以帮助你但不要忘记包含消息 ui 框架并包含委托方法 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];
              }
          

          【讨论】:

          • 非常感谢!非常有用的 HTML 正文示例。
          【解决方案7】:

          斯威夫特 2.2。改编自Esq's answer

          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)
          }
          

          【讨论】:

            【解决方案8】:

            要从 iPhone 应用程序发送电子邮件,您需要执行以下任务列表。

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

            第 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;
            }
            }
            

            【讨论】:

            • 此答案是否提供了现有答案之一中尚未包含的任何新信息?
            【解决方案9】:

            斯威夫特 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)")
            
                    //------------------------------------------------
                }
            }
            

            【讨论】:

              【解决方案10】:

              这是一个 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)
                  }
              }
              

              Source

              【讨论】:

                【解决方案11】:

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

                KRNSendEmail 有很好的文档记录并添加到 CocoaPods。

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

                【讨论】:

                  猜你喜欢
                  • 2011-04-21
                  • 2011-08-24
                  • 2011-05-08
                  • 2010-12-02
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多