Envío de correo electrónico en Swift (iOS/macOS): guía completa
El envío de correos electrónicos es una de las funciones clave de las aplicaciones móviles y de escritorio modernas. En el ecosistema de Apple para Swift (iOS/macOS), existen dos enfoques principales: usar el controlador integrado MFMailComposeViewController para un envío sencillo a través del cliente de correo del dispositivo y trabajar con el protocolo SMTP mediante bibliotecas de terceros, como SwiftSMTP. En este artículo, analizaremos en detalle ambos métodos, sus ventajas, limitaciones y proporcionaremos ejemplos prácticos de código.
1. Envío de correo electrónico a través de MFMailComposeViewController
MFMailComposeViewController es un componente del framework MessageUI.framework que proporciona una interfaz lista para crear y enviar un correo. Este método es ideal cuando se necesita implementar rápidamente el envío sin configurar un servidor SMTP.
Ventajas y limitaciones
- Ventajas: no requiere configuración SMTP, admite contenido HTML, archivos adjuntos, y utiliza automáticamente la cuenta de correo configurada en el dispositivo.
- Limitaciones: solo funciona en dispositivos reales (no en el simulador), requiere una cuenta de correo configurada, no es adecuado para envío en segundo plano sin interfaz de usuario.
Ejemplo de implementación
Para empezar, importe el framework e implemente el delegado:
import UIKitimport MessageUI
class ViewController: UIViewController, MFMailComposeViewControllerDelegate {
@IBAction func sendEmailTapped(_ sender: UIButton) { guard MFMailComposeViewController.canSendMail() else { print("El correo no está configurado en el dispositivo") return }
let mailComposer = MFMailComposeViewController() mailComposer.mailComposeDelegate = self mailComposer.setToRecipients(["recipient@example.com"]) mailComposer.setSubject("¡Hola desde Swift!") mailComposer.setMessageBody("<h1>Correo de prueba</h1><p>Este es contenido HTML.</p>", isHTML: true)
// Agregar archivo adjunto if let fileData = "Archivo de texto".data(using: .utf8) { mailComposer.addAttachmentData(fileData, mimeType: "text/plain", fileName: "example.txt") }
present(mailComposer, animated: true, completion: nil) }
// Delegado para manejar el resultado func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { switch result { case .cancelled: print("Envío cancelado") case .saved: print("Correo guardado como borrador") case .sent: print("Correo enviado") case .failed: print("Error al enviar: \\(error?.localizedDescription ?? "desconocido")") @unknown default: break } controller.dismiss(animated: true, completion: nil) }}2. Envío de correo electrónico a través de SMTP con la biblioteca SwiftSMTP
Si necesita enviar correos electrónicos mediante programación, sin intervención del usuario (por ejemplo, para correos de registro o notificaciones), utilice el protocolo SMTP. Una de las bibliotecas populares para Swift es SwiftSMTP. Admite TLS/SSL, autenticación y trabajo con archivos adjuntos.
Instalación a través de Swift Package Manager
Agregue la dependencia en Package.swift:
dependencies: [ .package(url: "https://github.com/Kitura/Swift-SMTP.git", from: "2.0.0")]Ejemplo de envío a través del servidor SMTP de Gmail
import SwiftSMTP
func sendEmailViaSMTP() { let smtp = SMTP( hostname: "smtp.gmail.com", // Servidor SMTP email: "your-email@gmail.com", password: "your-app-passwo