iOS Dev — Enviar correo electrónico
El correo electrónico es uno de los mejores canales de comunicación del siglo XXI. La información se puede entregar a un grupo de destinatarios en unos pocos segundos. ¿Alguna vez has pensado en integrar la función de correo electrónico en tu aplicación?
Apple ha proporcionado un marco fácil de usar MessageUI
para desarrolladores. Podemos configurar las siguientes propiedades:
- Lista de recipientes
- Tema
- Cuerpo del mensaje
- Archivos adjuntos
Procedimiento paso a paso
Paso 1) Compruebe si el dispositivo puede enviar correos electrónicos
import MessageUI
// Confirm the user can send email
guard MFMailComposeViewController.canSendMail() else { return }
1. El usuario de la aplicación aún no ha configurado su cuenta de correo electrónico en la aplicación de correo del sistema
2. El perfil MDM de iOS ha deshabilitado la función de correo, en referencia a esta respuesta de StackOverflow .
Paso 2) Configurar la instancia de MFMailComposeViewController
// Construct the `MFMailComposeViewController` instance
let mfMailComposeViewController = MFMailComposeViewController()
// To set the recipients list, including the to, cc and bcc fields
mfMailComposeViewController.setToRecipients(["[email protected]"])
mfMailComposeViewController.setCcRecipients(["[email protected]"])
mfMailComposeViewController.setBccRecipients(["[email protected]"])
// To set the email subject
mfMailComposeViewController.setSubject("Example - Subject Text")
// To set the email message body; It can be either plain text or HTML message
mfMailComposeViewController.setMessageBody("<h1>Example - HTML message body </h1>", isHTML: true)
// Presenet the `MFMailComposeViewController` to the app user
present(mfMailComposeViewController, animated: true)
- La lista de destinatarios, incluidos
to
,cc
&bcc
- el campo de la materia
- El cuerpo del mensaje en texto sin formato o mensaje HTML

Paso 3) Descartar el MFMailComposeViewController manualmente
// We must implement the `MFMailComposeViewControllerDelegate` in order to handle the user's action on the mail compo
mfMailComposeViewController.mailComposeDelegate = self
extension DemoViewController: MFMailComposeViewControllerDelegate {
// This is the only callback from the Mail composer to notify the app that the user has carried out certain action
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
switch result {
case .cancelled:
print("The user has dismissed the mail composer and deleted the email draft.")
case .saved:
print("The user has dismissed the mail composer and saved the email draft.")
case .sent:
// The email request is queued in the user's mail app
// There is no guarantee that the email is actually sent out!!!
print("The user has \"sent\" the email out.")
case .failed:
print("The user cannot send out the email")
print("Error of sending out the email: \(error.debugDescription)")
}
controller.dismiss(animated: true)
}
}
También hay una result
propiedad para mostrar la acción del usuario, que incluye:
cancelled
— El usuario hizo clic en el botón "Cancelar" y luego eliminó el borrador del correo electrónicosaved
— El usuario hizo clic en el botón "Cancelar" y luego guardó el borrador del correo electrónicosent
— El usuario ha *enviado* el correo electrónicofail
— Hay un error al poner en cola el correo electrónico en la aplicación de correo

Truco: ¿el correo electrónico REALMENTE se envía cuando se devuelve el resultado `enviado`?
¿Intentó enviar el correo electrónico cuando no hay conexión de red, por ejemplo, en modo avión? ¡Ay , NO ! ¡¡¡ La didFinishWith
devolución de llamada de MFMailComposeViewControllerDelegate
devuelve un sent
resultado!!!
¿Que significa eso?
De acuerdo con la siguiente documentación de Apple, MFMailComposeViewController
¡solo envía una solicitud al programa de correo del sistema para poner en cola el correo electrónico en lugar de enviarlo!
Documentación oficial de Apple — mailComposeController(_:didFinishWith:error:):
Si el usuario ha optado por enviar el correo electrónico creado por esta interfaz, ese correo electrónico debe estar en cola en el programa de correo del usuario en el momento en que se llama a este método . Si se produjo un error al poner en cola el mensaje de correo electrónico, el error
parámetro contiene un objeto de error que indica el tipo de error que se produjo.
En otras palabras, la aplicación NUNCA puede saber si el correo electrónico se envía correctamente a los destinatarios.
Función avanzada: agregar un archivo adjunto al correo electrónico
El envío de archivos adjuntos es una función rara en la mayoría de los casos de uso. Sin embargo, MFMailComposeViewController
nos permite adjuntar una lista de archivos adjuntos en cualquier formato de archivo al correo electrónico redactado.
// Attach an image to the composed email
let attachmentImageData = UIImage(named: "example_image_name")!.pngData()!
mfMailComposeViewController.addAttachmentData(attachmentImageData, mimeType: "image/png", fileName: "example_file_name")

Aprende más

Hay muchas más formas de enviar correos electrónicos. Firebase Extension Trigger Email proporciona una herramienta fácil de usar para ayudar a los desarrolladores a enviar correos electrónicos mediante la creación de un documento de Firestore con campos predefinidos específicos. A continuación se muestra mi otro blog sobre la extensión Trigger Email. Le invitamos a leerlo si desea saber más al respecto.
Extensión de Firebase — Activar correo electrónicoConclusión
Apple proporciona un marco fácil de usar MessageUI
para ayudar a las aplicaciones a enviar correos electrónicos al delegar el trabajo a la aplicación de correo del sistema. La aplicación puede configurar la lista de destinatarios, el asunto, el cuerpo del mensaje y la lista de archivos adjuntos. Una vez que el usuario realiza alguna acción, MFMailComposeViewControllerDelegate
devuelve el resultado y la aplicación tiene que descartarlo MFMailComposeViewController
manualmente.
Tenga en cuenta que el sent
resultado de MFMailComposeViewControllerDelegate
no significa realmente que se haya enviado el correo electrónico. ¡La solicitud de correo electrónico solo se pone en cola en la aplicación de correo del sistema!
¡Espero que disfrutes de este blog y que tengas un buen día!