iOS Dev — Отправить письмо
Электронная почта — один из лучших каналов связи в 21 веке. Информация может быть доставлена группе получателей за несколько секунд. Вы когда-нибудь думали об интеграции функции электронной почты в свое приложение?
Apple предоставила простую в использовании платформу MessageUI
для разработчиков. Мы можем настроить следующие свойства:
- Список получателей
- Предмет
- Тело сообщения
- Вложения
Пошаговая процедура
Шаг 1) Проверьте, может ли устройство отправлять электронную почту
import MessageUI
// Confirm the user can send email
guard MFMailComposeViewController.canSendMail() else { return }
1. Пользователь приложения еще не настроил свою учетную запись электронной почты в системном почтовом приложении.
2. Профиль iOS MDM отключил функцию рассылки, ссылаясь на этот ответ StackOverflow .
Шаг 2) Настройте экземпляр MFMailComposeViewController
// Construct the `MFMailComposeViewController` instance
let mfMailComposeViewController = MFMailComposeViewController()
// To set the recipients list, including the to, cc and bcc fields
mfMailComposeViewController.setToRecipients(["[email protected]"])
mfMailComposeViewController.setCcRecipients(["[email protected]"])
mfMailComposeViewController.setBccRecipients(["[email protected]"])
// To set the email subject
mfMailComposeViewController.setSubject("Example - Subject Text")
// To set the email message body; It can be either plain text or HTML message
mfMailComposeViewController.setMessageBody("<h1>Example - HTML message body </h1>", isHTML: true)
// Presenet the `MFMailComposeViewController` to the app user
present(mfMailComposeViewController, animated: true)
- Список получателей, включая
to
,cc
&bcc
- Тематическое поле
- Тело сообщения в виде простого текста или HTML-сообщения .

Шаг 3) Закройте MFMailComposeViewController вручную
// We must implement the `MFMailComposeViewControllerDelegate` in order to handle the user's action on the mail compo
mfMailComposeViewController.mailComposeDelegate = self
extension DemoViewController: MFMailComposeViewControllerDelegate {
// This is the only callback from the Mail composer to notify the app that the user has carried out certain action
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
switch result {
case .cancelled:
print("The user has dismissed the mail composer and deleted the email draft.")
case .saved:
print("The user has dismissed the mail composer and saved the email draft.")
case .sent:
// The email request is queued in the user's mail app
// There is no guarantee that the email is actually sent out!!!
print("The user has \"sent\" the email out.")
case .failed:
print("The user cannot send out the email")
print("Error of sending out the email: \(error.debugDescription)")
}
controller.dismiss(animated: true)
}
}
Существует также result
свойство для отображения действий пользователя, в том числе:
cancelled
— Пользователь нажал кнопку «Отмена», а затем удалил черновик письма.saved
— Пользователь нажал кнопку «Отмена», а затем сохранил черновик письма.sent
— Пользователь *отправил* электронное письмоfail
— Произошла ошибка в очереди письма в почтовое приложение

Уловка — ДЕЙСТВИТЕЛЬНО ли отправлено электронное письмо, когда возвращается результат «отправлено»?
Вы пытались отправить электронное письмо, когда нет подключения к сети, например, в режиме полета? О НЕТ ! Обратный didFinishWith
вызов MFMailComposeViewControllerDelegate
фактически возвращает sent
результат!!!
Что это обозначает?
В соответствии с приведенной ниже документацией Apple, MFMailComposeViewController
нужно только отправить запрос в системную почтовую программу, чтобы поставить электронное письмо в очередь, а не отправлять его !!!
Официальная документация Apple — mailComposeController(_:didFinishWith:error:):
Если пользователь решил отправить электронное письмо, созданное этим интерфейсом, это электронное письмо должно быть поставлено в очередь в почтовой программе пользователя к моменту вызова этого метода . Если при постановке сообщения электронной почты в очередь произошла ошибка, error
параметр содержит объект ошибки, указывающий тип возникшей ошибки.
Другими словами, приложение НИКОГДА не может знать, успешно ли отправлено электронное письмо получателям.
Расширенная функция - добавление вложения в электронное письмо
Отправка вложений — редкая функция в большинстве случаев использования. Тем не менее, MFMailComposeViewController
позволяет нам прикрепить список вложений в любом формате файла к составленному письму.
// Attach an image to the composed email
let attachmentImageData = UIImage(named: "example_image_name")!.pngData()!
mfMailComposeViewController.addAttachmentData(attachmentImageData, mimeType: "image/png", fileName: "example_file_name")

Учить больше

Есть много других способов отправки электронных писем. Firebase Extension Trigger Email предоставляет простой в использовании инструмент, помогающий разработчикам отправлять электронные письма путем создания документа Firestore с определенными предопределенными полями. Ниже мой другой блог о расширении триггерной электронной почты. Вы можете прочитать его, если хотите узнать о нем больше.
Расширение Firebase — триггерная электронная почтаЗаключение
Apple предоставляет простую в использовании MessageUI
структуру, помогающую приложениям отправлять электронные письма, делегируя задание системному почтовому приложению. Приложение может установить список получателей, тему, тело сообщения и список вложений. Как только пользователь выполняет какие-либо действия, MFMailComposeViewControllerDelegate
результат возвращается обратно, и приложение должно закрыть его MFMailComposeViewController
вручную.
Имейте в виду, что sent
результат на MFMailComposeViewControllerDelegate
самом деле не означает, что электронное письмо отправлено. Запрос по электронной почте ставится в очередь только в системном почтовом приложении!
Надеюсь, вам понравится этот блог и хорошего дня!