Отправка email на Swift (iOS/macOS): MFMailComposeViewController и SMTP

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка 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 и других сервисов требуется использовать пароль приложения, а не основной пароль учётной записи.
  • Убедитесь, что разрешён

Рекомендаций