open compose swift swift3 messageui

compose - Enviando un correo electrónico de swift 3



send email swift 4 ios (4)

Estoy tratando de configurar una aplicación con la opción de enviar correo electrónico.

Tengo este código:

import Foundation import MessageUI import UIKit class emailClass: UIViewController, MFMailComposeViewControllerDelegate { override func viewDidLoad() { super.viewDidLoad() if !MFMailComposeViewController.canSendMail() { print("Mail services are not available") return } sendEmail() } func sendEmail() { let composeVC = MFMailComposeViewController() composeVC.mailComposeDelegate = self // Configure the fields of the interface. composeVC.setToRecipients(["[email protected]"]) composeVC.setSubject("Hello!") composeVC.setMessageBody("Hello this is my message body!", isHTML: false) // Present the view controller modally. self.present(composeVC, animated: true, completion: nil) } func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) { // Check the result or perform other tasks. // Dismiss the mail compose view controller. controller.dismiss(animated: true, completion: nil) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

Entonces recibo este mensaje: "Los servicios de correo no están disponibles". Ahora he iniciado sesión en el dispositivo simulador en iCloud ... Así que creo que debería hacerlo, pero no es así. ¿Por qué no está funcionando? ¿Me puede decir qué está mal y cómo puedo avanzar?


Así es como lo hice. Parece que seguiste la documentación muy bien, pensé que agregaría mi variación en caso de que ayudara a alguien más. Además, esta es un poco más actualizada a la sintaxis actual (agosto de 2017).

Cumpla con el protocolo MFMailComposeViewControllerDelegate y verifique si el dispositivo puede enviar correo.

import Foundation import UIKit import MessageUI class WelcomeViewController: UIViewController, MFMailComposeViewControllerDelegate { override func viewDidLoad() { super.viewDidLoad() if !MFMailComposeViewController.canSendMail() { print("Mail services are not available") return } }

Mi aplicación utiliza un IBAction para iniciar la composición del correo.

@IBAction func sendFeedbackButtonTapped(_ sender: Any) { let composeVC = MFMailComposeViewController() composeVC.mailComposeDelegate = self // Configure the fields of the interface. composeVC.setToRecipients(["[email protected]"]) composeVC.setSubject("Message Subject") composeVC.setMessageBody("Message content.", isHTML: false) // Present the view controller modally. self.present(composeVC, animated: true, completion: nil) }

Acerca de la siguiente función mailComposeController, la documentación dice

El controlador de vista de redacción de correo no se cierra automáticamente. Cuando el usuario toca los botones para enviar el correo electrónico o cancelar la interfaz, el controlador de vista de redacción llama al método mailComposeController (_: didFinishWith: error :) de su delegado. La implementación de ese método debe descartar el controlador de vista explícitamente, como se muestra en el Listado 3. También puede usar este método para verificar el resultado de la operación.

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { // Check the result or perform other tasks. // Dismiss the mail compose view controller. controller.dismiss(animated: true, completion: nil) } }

Fuente Documentación de Apple: MFMailComposeViewController


El código parece ser bueno y funciona bien si la aplicación se ejecuta en un dispositivo real

MFMailComposeViewController.canSendMail() // returns false for simulators.

No puede probarlo en el simulador, podrá probar cosas básicas como la IU, cómo están sucediendo las cosas en los clics del botón Cancelar / Enviar.

Para probar, debe usar un dispositivo. La aplicación de correo en el dispositivo se debe configurar con algún correo (ej .: [email protected]).

Espero que ayude.


El problema con su código es que el

// Presente el controlador de vista de forma modal. self.present (composeVC, animated: true, completion: nil)

se presenta en sí mismo ;-)

Si no conoce el controlador de vista actual, simplemente visualícelo en RootViewController, es decir,

UIApplication.shared.keyWindow? .RootViewController? .Present (...