Отправка электронной почты с использованием внешних приложений, кроме приложения Apple Mail
Есть ли способ отправить электронное письмо и обработать его всеми приложениями на устройстве, которые могут это сделать? Например, GMail, Yahoo, Outlook, или же для реализации такой функции требуется использование каждой собственной библиотеки?
Есть ли какой-то общий URL-адрес или схема, которую я могу использовать, чтобы предложить выбор всех доступных почтовых клиентов на устройстве?
В настоящее время для составления электронной почты я использую MFMailComposeViewController, но он не работает, если у пользователя нет настройки учетной записи в приложении "Почта", чего нет у многих.
1 ответ
Я столкнулся с той же самой проблемой несколько месяцев назад (особенно при тестировании на симуляторе, поскольку на нем не установлена учетная запись электронной почты и, следовательно, произошел сбой). Вам нужно проверить этот поток в вашем MFMailComposeViewControllerDelegate
let recipient = "whoever@youwant.com"
if MFMailComposeViewController.canSendMail() {
// Do your thing with native mail support
} else { // Otherwise, 3rd party to the rescue
guard let urlEMail = URL(string: "mailto:\(recipient)") else {
print("Invalid URL Scheme")
return
}
if UIApplication.shared.canOpenURL(urlEMail) {
UIApplication.shared.open(urlEMail, options: [:], completionHandler: {
_ in
})
} else {
print("Ups, no way for an email to be sent was found.")
}
}
Выше много проверок, но по причинам отладки. Если вы абсолютно уверены в этом адресе электронной почты (например, в предыдущем совпадении с регулярным выражением), то, конечно, просто принудительно разверните; в противном случае это сохранит ваш код в безопасности.
Надеюсь, поможет!
Есть хорошая библиотека ThirdPartyMailer, которая обрабатывает все сторонние URL. Вам нужно будет установить LSApplicationQueriesSchemes
для почтовых клиентов в вашем Info.plist
файл.
Вот реализация, которая поддерживает почтовое приложение по умолчанию и сторонние клиенты:
let supportMail = "support@example.app"
let subject = "App feedback"
guard MFMailComposeViewController.canSendMail() else {
var client : ThirdPartyMailClient?
for c in ThirdPartyMailClient.clients() {
if ThirdPartyMailer.application(UIApplication.shared, isMailClientAvailable: c) {
client = c
break
}
}
guard client != nil else {
self.showError("Please contact us via \(supportMail)")
return
}
ThirdPartyMailer.application(
UIApplication.shared,
openMailClient: client!,
recipient: supportMail,
subject: subject,
body: nil
)
return
}
// set up MFMailComposeViewController
mailVC = MFMailComposeViewController()
mailVC.mailComposeDelegate = vc
mailVC.setToRecipients([supportMail])
mailVC.setSubject(subject)