Отправка Email на Swift: Полное руководство по SMTP и MailKit

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

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

Начать курс

Email отправка на Swift (iOS/macOS): Полное руководство

Отправка электронных писем — одна из ключевых функций современных мобильных и десктопных приложений. На платформах Apple (iOS, macOS, watchOS, tvOS) разработчики на Swift могут использовать несколько подходов: от встроенного MailComposeViewController до мощных сторонних библиотек, работающих напрямую с SMTP-серверами. В этой статье мы разберем основные способы реализации email-отправки на Swift, включая практические примеры кода, настройку SMTP и работу с вложениями.

Зачем нужна отправка email в приложении?

Email-функционал может быть полезен в самых разных сценариях:

  • Регистрация и подтверждение учетной записи
  • Отправка отчетов об ошибках и обратной связи
  • Рассылка уведомлений и новостей
  • Отправка чеков, инвойсов и документов
  • Восстановление пароля

Способы отправки email на Swift

Существует два основных подхода:

  • Встроенный Mail Compose (MFMailComposeViewController) — использует стандартное почтовое приложение iOS/macOS. Простой, но требует, чтобы пользователь был авторизован в почтовом клиенте.
  • Прямая отправка через SMTP — отправляет письма напрямую с сервера, без участия пользователя. Идеально для автоматических уведомлений.

Метод 1: Использование MFMailComposeViewController

Этот способ подходит, когда нужно дать пользователю возможность отправить письмо из приложения, используя его личный почтовый ящик.

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(["support@example.com"])
        mailComposer.setSubject("Обратная связь из приложения")
        mailComposer.setMessageBody("Здравствуйте! У меня есть вопрос...", isHTML: false)
        
        // Добавление вложения
        if let fileData = "Пример текста".data(using: .utf8) {
            mailComposer.addAttachmentData(fileData, mimeType: "text/plain", fileName: "file.txt")
        }
        
        present(mailComposer, animated: true, completion: nil)
    }
    
    // MARK: - MFMailComposeViewControllerDelegate
    func mailComposeController(_ controller: MFMailComposeViewController, 
                                didFinishWith result: MFMailComposeResult, 
                                error: Error?) {
        controller.dismiss(animated: true, completion: nil)
        switch result {
        case .sent:
            print("Письмо отправлено")
        case .saved:
            print("Письмо сохранено")
        case .cancelled:
            print("Отправка отменена")
        case .failed:
            print("Ошибка отправки: \(error?.localizedDescription ?? "")")
        @unknown default:
            break
        }
    }
}

Метод 2: Прямая отправка через SMTP (SwiftSMTP)

Для автоматической отправки писем без участия пользователя используется библиотека SwiftSMTP. Она позволяет подключаться к любому SMTP-серверу (Gmail, Yandex, Mail.ru, собственный сервер).

Установка через Swift Package Manager:

// В Package.swift или через Xcode: File → Add Packages
dependencies: [
    .package(url: "https://github.com/Kitura/Swift-SMTP.git", from: "2.0.0")
]

Пример отправки письма через SMTP:

import SwiftSMTP

func sendEmail() {
    let smtp = SMTP(
        hostname: "smtp.gmail.com",     // SMTP сервер
        email: "your_email@gmail.com",   // ваш email
        password: "your_app_password"    // пароль приложения (не обычный!)
    )
    
    let drLight = Mail.User(name: "Dr. Light", email: "dr.light@example.com")
    let megaman = Mail.User(name: "Megaman", email: "megaman@example.com")
    
    let mail = Mail(
        from: drLight,
        to: [megaman],
        subject: "Привет из Swift!",
        text: "Это тестовое письмо, отправленное с помощью SwiftSMTP."
    )
    
    // Отправка с замыканием
    smtp.send(mail) { (error) in
        if let error = error {
            print("Ошибка отправки: \(error)")
        } else {
            print("Письмо успешно отправлено!")
        }
    }
}

Настройка SMTP для популярных сервисов

  • Gmail: smtp.gmail.com, порт 587 (TLS) или 465 (SSL). Требуется пароль приложения.
  • Yandex

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