Отправка email на Swift: библиотеки и примеры для iOS/macOS

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

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

Начать курс

Email отправка на Swift (iOS/macOS): библиотеки и практические примеры

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

Основные подходы к отправке email на Swift

Существует три основных способа отправки писем из приложений на Swift:

  • Использование MFMailComposeViewController — встроенный системный интерфейс для отправки писем (только iOS). Позволяет пользователю отправить письмо через почтовый клиент, установленный на устройстве, но не подходит для автоматической (серверной) отправки.
  • Прямое подключение по SMTP — библиотеки, реализующие протокол SMTP на стороне клиента (например, SwiftSMTP). Подходит для отправки писем напрямую с устройства без промежуточного сервера.
  • Использование API сторонних сервисов — облачные решения (Mailgun, SendGrid, Amazon SES), которые предоставляют REST API. Это самый надёжный и масштабируемый способ для продакшн-приложений.

Библиотека SwiftSMTP для прямого SMTP-подключения

SwiftSMTP — популярная библиотека с открытым исходным кодом, реализующая SMTP-клиент на Swift. Она поддерживает:

  • Отправку текстовых и HTML-писем
  • Вложения (изображения, PDF, архивы)
  • Поддержку TLS/SSL
  • Авторизацию по логину/паролю

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

import SwiftSMTP

let smtp = SMTP(
    host: "smtp.gmail.com",     // SMTP-сервер
    port: 587,                  // порт для TLS
    username: "you@gmail.com",
    password: "your-app-password"
)

let mail = Mail(
    from: Mail.User(name: "Отправитель", email: "you@gmail.com"),
    to: [Mail.User(name: "Получатель", email: "recipient@example.com")],
    subject: "Привет из Swift!",
    text: "Это тестовое письмо, отправленное с помощью SwiftSMTP."
)

smtp.send(mail) { error in
    if let error = error {
        print("Ошибка отправки: \(error)")
    } else {
        print("Письмо успешно отправлено!")
    }
}

Для работы с Gmail потребуется пароль приложения (App Password), так как обычный пароль не подходит при включённой двухфакторной аутентификации.

Отправка email через Mailgun (API)

Mailgun — один из самых популярных сервисов для отправки транзакционных писем. Он предоставляет простой REST API и SDK для Swift. Основные преимущества:

  • Высокая доставляемость (за счёт репутации IP-адресов)
  • Отслеживание открытий и кликов
  • Поддержка шаблонов

Пример отправки письма через Mailgun API с использованием URLSession:

import Foundation

func sendEmailViaMailgun(to recipient: String, subject: String, body: String) {
    let apiKey = "YOUR_MAILGUN_API_KEY"
    let domain = "YOUR_DOMAIN.mailgun.org"
    let urlString = "https://api.mailgun.net/v3/\(domain)/messages"
    
    guard let url = URL(string: urlString) else { return }
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    
    let credentials = "api:\(apiKey)"
    let authData = credentials.data(using: .utf8)!.base64EncodedString()
    request.setValue("Basic \(authData)", forHTTPHeaderField: "Authorization")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    
    let parameters = [
        "from": "My App <noreply@\(domain)>",
        "to": recipient,
        "subject": subject,
        "text": body
    ]
    
    let bodyString = parameters
        .map { "\($0.key)=\($0.value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")" }
        .joined(separator: "&")
    request.httpBody = bodyString.data(using: .utf8)
    
    URLSession.shared.dataTask(with: request) { data, response, error in
        if let error = error {
            print("Ошибка: \(error.localizedDescription)")
            return
        }
        if let httpResponse = response as? HTTPURLResponse {
            print("Статус: \(httpResponse.statusCode)")
        }
        if let data = data {
            print("Ответ: \(String(data: data, encoding: .utf8) ?? "")")
        }
    }.resume()
}

// Вызов функции
sendEmailViaMailgun(
    to:                    

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