How to open mail app from Swift

前端 未结 15 1272
被撕碎了的回忆
被撕碎了的回忆 2020-11-30 20:18

Im working on a simple swift app where the user inputs an email address and presses a button which opens the mail app, with the entered address in the address bar. I know ho

相关标签:
15条回答
  • 2020-11-30 20:39
    @IBAction func launchEmail(sender: AnyObject) {
     if if MFMailComposeViewController.canSendMail() {
       var emailTitle = "Feedback"
       var messageBody = "Feature request or bug report?"
       var toRecipents = ["friend@stackoverflow.com"]
       var mc: MFMailComposeViewController = MFMailComposeViewController()
       mc.mailComposeDelegate = self
       mc.setSubject(emailTitle)
       mc.setMessageBody(messageBody, isHTML: false)
       mc.setToRecipients(toRecipents)
    
       self.present(mc, animated: true, completion: nil)
     } else {
       // show failure alert
     }
    }
    
    func mailComposeController(controller:MFMailComposeViewController, didFinishWithResult result:MFMailComposeResult, error:NSError) {
        switch result {
        case .cancelled:
            print("Mail cancelled")
        case .saved:
            print("Mail saved")
        case .sent:
            print("Mail sent")
        case .failed:
            print("Mail sent failure: \(error?.localizedDescription)")
        default:
            break
        }
        self.dismiss(animated: true, completion: nil)
    }
    

    Note that not all users have their device configure to send emails, which is why we need to check the result of canSendMail() before trying to send. Note also that you need to catch the didFinishWith callback in order to dismiss the mail window.

    0 讨论(0)
  • 2020-11-30 20:40

    Swift 2, with availability check:

    import MessageUI
    
    if MFMailComposeViewController.canSendMail() {
        let mail = MFMailComposeViewController()
        mail.mailComposeDelegate = self
        mail.setToRecipients(["test@test.test"])
        mail.setSubject("Bla")
        mail.setMessageBody("<b>Blabla</b>", isHTML: true)
        presentViewController(mail, animated: true, completion: nil)
    } else {
        print("Cannot send mail")
        // give feedback to the user
    }
    
    
    // MARK: - MFMailComposeViewControllerDelegate
    
    func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
        switch result.rawValue {
        case MFMailComposeResultCancelled.rawValue:
            print("Cancelled")
        case MFMailComposeResultSaved.rawValue:
            print("Saved")
        case MFMailComposeResultSent.rawValue:
            print("Sent")
        case MFMailComposeResultFailed.rawValue:
            print("Error: \(error?.localizedDescription)")
        default:
            break
        }
        controller.dismissViewControllerAnimated(true, completion: nil)
    }
    
    0 讨论(0)
  • 2020-11-30 20:40

    In the view controller from where you want your mail-app to open on the tap.

    • At the top of the file do, import MessageUI.
    • Put this function inside your Controller.

      func showMailComposer(){
      
        guard MFMailComposeViewController.canSendMail() else {
             return
        }
        let composer = MFMailComposeViewController()
        composer.mailComposeDelegate = self
        composer.setToRecipients(["abc@gmail.com"]) // email id of the recipient
        composer.setSubject("testing!!!")
        composer.setMessageBody("this is a test mail.", isHTML: false)
        present(composer, animated: true, completion: nil)
       }
      
    • Extend your View Controller and conform to the MFMailComposeViewControllerDelegate.

    • Put this method and handle the failure, sending of your mails.

      func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        if let _ = error {
            controller.dismiss(animated: true, completion: nil)
            return
        }
        controller.dismiss(animated: true, completion: nil)
      }
      
    0 讨论(0)
  • 2020-11-30 20:46

    Here's an update for Swift 4 if you're simply looking to open up the mail client via a URL:

    let email = "foo@bar.com"
    if let url = URL(string: "mailto:\(email)") {
       UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
    

    This worked perfectly fine for me :)

    0 讨论(0)
  • 2020-11-30 20:48

    For Swift 4.2+ and iOS 9+

    let appURL = URL(string: "mailto:TEST@EXAMPLE.COM")!
    
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(appURL, options: [:], completionHandler: nil)
    } else {
        UIApplication.shared.openURL(appURL)
    }
    

    Replace TEST@EXAMPLE.COM with your desired email address.

    0 讨论(0)
  • 2020-11-30 20:51

    I'm not sure if you want to switch to the mail app itself or just open and send an email. For the latter option linked to a button IBAction:

        import UIKit
        import MessageUI
    
        class ViewController: UIViewController, MFMailComposeViewControllerDelegate {
    
        @IBAction func launchEmail(sender: AnyObject) {
    
        var emailTitle = "Feedback"
        var messageBody = "Feature request or bug report?"
        var toRecipents = ["friend@stackoverflow.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)
        }
    
        func mailComposeController(controller:MFMailComposeViewController, didFinishWithResult result:MFMailComposeResult, error:NSError) {
            switch result {
            case MFMailComposeResultCancelled:
                print("Mail cancelled")
            case MFMailComposeResultSaved:
                print("Mail saved")
            case MFMailComposeResultSent:
                print("Mail sent")
            case MFMailComposeResultFailed:
                print("Mail sent failure: \(error?.localizedDescription)")
            default:
                break
            }
            self.dismissViewControllerAnimated(true, completion: nil)
        }
    
        }
    
    0 讨论(0)
提交回复
热议问题