Открытие электронной почты из приложения с предопределенным текстом в iOS


Здравствуйте я хочу открыть почтовую программу из моего приложения, и тело уже должно быть определено. Я могу открыть письмо, но не знаю, как определить тело письма в качестве заданного параметра для отображения заданного стандартного текста. Кто-нибудь может помочь? Вот код, который я использую для открытия электронной почты:

//EMAIL
let email = "foo@bar.com"
let urlEMail = NSURL(string: "mailto:(email)")

if UIApplication.sharedApplication().canOpenURL(urlEMail!) {
                UIApplication.sharedApplication().openURL(urlEMail!)
} else {
print("Ups")
}
6 6

6 ответов:

Вы можете сделать это с помощью MFMailComposeViewController:

let mailComposerVC = MFMailComposeViewController()
mailComposerVC.mailComposeDelegate = self
mailComposerVC.setToRecipients(["email@email.com"])
mailComposerVC.setSubject("Subject")
mailComposerVC.setMessageBody("Body", isHTML: false)
self.presentViewController(mailComposerVC, animated: true, completion: nil)

Кроме того, вам нужно реализовать mailComposeController:didFinishWithResult:error: из MFMailComposeViewControllerDelegate , где вы должны отклонить MFMailComposeViewController

Если вы хотите открыть встроенное приложение электронной почты, а не показывать MFMailComposeViewController , как было упомянуто другими, вы можете построить ссылку mailto: следующим образом:

let subject = "My subject"
let body = "The awesome body of my email."
let encodedParams = "subject=\(subject)&body=\(body)".stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet())
let url = "mailto:foo@bar.com?\(encodedParams)"

if let emailURL = NSURL(url) {
    if UIApplication.sharedApplication().canOpenURL(emailURL) {
        UIApplication.sharedApplication().openURL(emailURL)
    }
}

Просто для того, чтобы сохранить любой ввод текста, в 2016 году синтаксис немного изменился:

let subject = "Some subject"
let body = "Plenty of email body."
let coded = "mailto:blah@blah.com?subject=\(subject)&body=\(body)".stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet())

if let emailURL:NSURL = NSURL(string: coded!)
    {
    if UIApplication.sharedApplication().canOpenURL(emailURL)
        {
        UIApplication.sharedApplication().openURL(emailURL)
        }

Swift 3 Версия

let subject = "Some subject"
let body = "Plenty of email body."
let coded = "mailto:blah@blah.com?subject=\(subject)&body=\(body)".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

if let emailURL: NSURL = NSURL(string: coded!) {
    if UIApplication.shared.canOpenURL(emailURL as URL) {
        UIApplication.shared.openURL(emailURL as URL)
    }
}

Используйте MFMailComposeViewController следующим образом:

  1. Импорт сообщения

    import MessageUI
    
  2. Добавьте делегата в свой класс:

    class myClass: UIViewController, MFMailComposeViewControllerDelegate {}
    
  3. Настройте предустановку электронной почты, которую вы хотите иметь

    let mail = MFMailComposeViewController()
    mail.mailComposeDelegate = self
    mail.setSubject("Subject")
    mail.setMessageBody("Body", isHTML: true)
    mail.setToRecipients(["my@email.com"])
    presentViewController(mail, animated: true, completion: nil)
    
  4. Поместите этот метод в свой код:

    func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) {
        dismissViewControllerAnimated(true, completion: nil)
    }
    

Ну вот, теперь работает.

Swift 4.0

    let email = "feedback@company.com"
    let subject = "subject"
    let bodyText = "Please provide information that will help us to serve you better"
    if MFMailComposeViewController.canSendMail() {
        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.mailComposeDelegate = self
        mailComposerVC.setToRecipients([email])
        mailComposerVC.setSubject(subject)
        mailComposerVC.setMessageBody(bodyText, isHTML: true)
        self.present(mailComposerVC, animated: true, completion: nil)
    } else {
        let coded = "mailto:\(email)?subject=\(subject)&body=\(bodyText)".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        if let emailURL = URL(string: coded!)
        {
            if UIApplication.shared.canOpenURL(emailURL)
            {
                UIApplication.shared.open(emailURL, options: [:], completionHandler: { (result) in
                    if !result {
                        // show some Toast or error alert
                        //("Your device is not currently configured to send mail.")
                    }
                })
            }
        }
    }

Я предлагаю использовать способ Apple, который вы можете найти в официальной документации о MFMailComposeViewController. Он открывает контроллер модального вида с электронной почтой, которая отклоняется после отправки. Таким образом, пользователь остается в вашем приложении.