Während andere Antworten alle richtig sind, können Sie nie wissen, ob auf dem iPhone / iPad, auf dem Ihre Anwendung ausgeführt wird, die Mail-App von Apple installiert ist oder nicht, da sie vom Benutzer gelöscht werden kann.
Es ist besser, mehrere E-Mail-Clients zu unterstützen. Der folgende Code behandelt das Senden von E-Mails auf elegantere Weise. Der Ablauf des Codes ist:
- Wenn die Mail-App installiert ist, öffnen Sie den Mail-Composer, der mit den bereitgestellten Daten gefüllt ist
- Versuchen Sie andernfalls, die Google Mail-App, dann Outlook, dann Yahoo Mail und dann Spark in dieser Reihenfolge zu öffnen
- Wenn keiner dieser Clients installiert ist, wird auf den Standard zurückgegriffen
mailto:..
, der den Benutzer auffordert, die Mail-App von Apple zu installieren.
Code ist in Swift 5 geschrieben :
import MessageUI
import UIKit
class SendEmailViewController: UIViewController, MFMailComposeViewControllerDelegate {
@IBAction func sendEmail(_ sender: UIButton) {
// Modify following variables with your text / recipient
let recipientEmail = "test@email.com"
let subject = "Multi client email support"
let body = "This code supports sending email via multiple different email apps on iOS! :)"
// Show default mail composer
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setToRecipients([recipientEmail])
mail.setSubject(subject)
mail.setMessageBody(body, isHTML: false)
present(mail, animated: true)
// Show third party email composer if default Mail app is not present
} else if let emailUrl = createEmailUrl(to: recipientEmail, subject: subject, body: body) {
UIApplication.shared.open(emailUrl)
}
}
private func createEmailUrl(to: String, subject: String, body: String) -> URL? {
let subjectEncoded = subject.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
let bodyEncoded = body.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
let gmailUrl = URL(string: "googlegmail://co?to=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")
let outlookUrl = URL(string: "ms-outlook://compose?to=\(to)&subject=\(subjectEncoded)")
let yahooMail = URL(string: "ymail://mail/compose?to=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")
let sparkUrl = URL(string: "readdle-spark://compose?recipient=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")
let defaultUrl = URL(string: "mailto:\(to)?subject=\(subjectEncoded)&body=\(bodyEncoded)")
if let gmailUrl = gmailUrl, UIApplication.shared.canOpenURL(gmailUrl) {
return gmailUrl
} else if let outlookUrl = outlookUrl, UIApplication.shared.canOpenURL(outlookUrl) {
return outlookUrl
} else if let yahooMail = yahooMail, UIApplication.shared.canOpenURL(yahooMail) {
return yahooMail
} else if let sparkUrl = sparkUrl, UIApplication.shared.canOpenURL(sparkUrl) {
return sparkUrl
}
return defaultUrl
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true)
}
}
Bitte beachten Sie, dass ich den Textkörper für die Outlook-App absichtlich verpasst habe, da er nicht analysiert werden kann.
Sie müssen der Info.plist
Datei außerdem folgenden Code hinzufügen , der die verwendeten URl-Abfrageschemata auf die Whitelist setzt.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>googlegmail</string>
<string>ms-outlook</string>
<string>readdle-spark</string>
<string>ymail</string>
</array>