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: