Отправка email на Swift (iOS/macOS): полное руководство
Отправка электронных писем — одна из ключевых функций современных мобильных и десктопных приложений. В экосистеме Apple для Swift (iOS/macOS) существует два основных подхода: использование встроенного контроллера MFMailComposeViewController для простой отправки через почтовый клиент устройства и работа по протоколу SMTP через сторонние библиотеки, такие как SwiftSMTP. В этой статье мы подробно разберём оба метода, их преимущества, ограничения и приведём практические примеры кода.
1. Отправка email через MFMailComposeViewController
MFMailComposeViewController — это компонент из фреймворка MessageUI.framework, который предоставляет готовый интерфейс для создания и отправки письма. Этот способ идеален, когда нужно быстро реализовать отправку без настройки SMTP-сервера.
Преимущества и ограничения
- Преимущества: не требует настройки SMTP, поддерживает HTML-контент, вложения, автоматически использует учётную запись почты, настроенную на устройстве.
- Ограничения: работает только на реальных устройствах (не в симуляторе), требует наличия настроенной почтовой учётной записи, не подходит для фоновой отправки без UI.
Пример реализации
Для начала подключите фреймворк и реализуйте делегат:
import UIKit
import MessageUI
class ViewController: UIViewController, MFMailComposeViewControllerDelegate {
@IBAction func sendEmailTapped(_ sender: UIButton) {
guard MFMailComposeViewController.canSendMail() else {
print("Почта не настроена на устройстве")
return
}
let mailComposer = MFMailComposeViewController()
mailComposer.mailComposeDelegate = self
mailComposer.setToRecipients(["recipient@example.com"])
mailComposer.setSubject("Привет из Swift!")
mailComposer.setMessageBody("<h1>Тестовое письмо</h1><p>Это HTML-содержимое.</p>", isHTML: true)
// Добавление вложения
if let fileData = "Текстовый файл".data(using: .utf8) {
mailComposer.addAttachmentData(fileData, mimeType: "text/plain", fileName: "example.txt")
}
present(mailComposer, animated: true, completion: nil)
}
// Делегат для обработки результата
func mailComposeController(_ controller: MFMailComposeViewController,
didFinishWith result: MFMailComposeResult,
error: Error?) {
switch result {
case .cancelled:
print("Отправка отменена")
case .saved:
print("Письмо сохранено как черновик")
case .sent:
print("Письмо отправлено")
case .failed:
print("Ошибка отправки: \(error?.localizedDescription ?? "неизвестная")")
@unknown default:
break
}
controller.dismiss(animated: true, completion: nil)
}
}
2. Отправка email через SMTP с библиотекой SwiftSMTP
Если требуется отправлять письма программно, без участия пользователя (например, для регистрационных писем или уведомлений), используйте протокол SMTP. Одна из популярных библиотек для Swift — SwiftSMTP. Она поддерживает TLS/SSL, авторизацию и работу с вложениями.
Установка через Swift Package Manager
Добавьте зависимость в Package.swift:
dependencies: [
.package(url: "https://github.com/Kitura/Swift-SMTP.git", from: "2.0.0")
]
Пример отправки через SMTP-сервер Gmail
import SwiftSMTP
func sendEmailViaSMTP() {
let smtp = SMTP(
hostname: "smtp.gmail.com", // SMTP-сервер
email: "your-email@gmail.com",
password: "your-app-password" // Пароль приложения (не основной)
)
let sender = Mail.User(name: "Ваше Имя", email: "your-email@gmail.com")
let recipient = Mail.User(name: "Получатель", email: "recipient@example.com")
let mail = Mail(
from: sender,
to: [recipient],
subject: "SMTP-письмо из Swift",
text: "Это текст письма, отправленного через SMTP."
)
// Добавление вложения
if let attachmentPath = Bundle.main.path(forResource: "document", ofType: "pdf") {
mail.attachments = [Attachment(filePath: attachmentPath)]
}
smtp.send(mail) { error in
if let error = error {
print("Ошибка отправки: \(error.localizedDescription)")
} else {
print("Письмо успешно отправлено!")
}
}
}
Важные замечания по SMTP
- Для Gmail и других сервисов требуется использовать пароль приложения, а не основной пароль учётной записи.
- Убедитесь, что разрешён