Отправка электронной почты с использованием внешних приложений, кроме приложения 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)
Другие вопросы по тегам