iOS-Entwickler – E-Mail senden
E-Mail ist einer der besten Kommunikationskanäle des 21. Jahrhunderts. Informationen können innerhalb weniger Sekunden an eine Gruppe von Empfängern übermittelt werden. Haben Sie schon einmal daran gedacht, die E-Mail-Funktion in Ihre App zu integrieren?
Apple hat ein benutzerfreundliches Framework bereitgestellt – MessageUI
für Entwickler. Wir können die folgenden Eigenschaften konfigurieren:
- Empfängerliste
- Thema
- Nachrichtentext
- Anhänge
Schritt-für-Schritt-Verfahren
Schritt 1) Überprüfen Sie, ob das Gerät E-Mails senden kann
import MessageUI
// Confirm the user can send email
guard MFMailComposeViewController.canSendMail() else { return }
1. Der App-Benutzer hat sein E-Mail-Konto noch nicht in der System-Mailing-App eingerichtet
2. Das iOS-MDM-Profil hat die Mailing-Funktion deaktiviert und verweist auf diese StackOverflow - Antwort.
Schritt 2) Konfigurieren Sie die MFMailComposeViewController-Instanz
// 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)
- Die Empfängerliste, einschließlich der
to
,cc
&bcc
- Das Themenfeld
- Der Nachrichtentext in einfacher Text- oder HTML-Nachricht

Schritt 3) Schließen Sie den MFMailComposeViewController manuell
// 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)
}
}
Es gibt auch eine result
Eigenschaft, um die Aktion des Benutzers anzuzeigen, einschließlich:
cancelled
— Der Benutzer klickte auf die Schaltfläche „Abbrechen“ und löschte dann den E-Mail-Entwurfsaved
— Der Benutzer klickte auf die Schaltfläche „Abbrechen“ und speicherte dann den E-Mail-Entwurfsent
— Der Benutzer hat die E-Mail *versendet*fail
— Beim Einreihen der E-Mail in die Mail-App ist ein Fehler aufgetreten

Trick – Wird die E-Mail WIRKLICH verschickt, wenn das Ergebnis „Gesendet“ zurückgegeben wird?
Haben Sie versucht, die E-Mail zu versenden, wenn keine Netzwerkverbindung besteht, z. B. im Flugzeugmodus? Ach NEIN ! Der didFinishWith
Rückruf von MFMailComposeViewControllerDelegate
gibt tatsächlich ein sent
Ergebnis zurück!!!
Was bedeutet das?
Laut der folgenden Apple-Dokumentation MFMailComposeViewController
senden Sie nur eine Anfrage an das System-E-Mail-Programm, um die E-Mail in die Warteschlange zu stellen, anstatt sie zu versenden !!!
Offizielle Apple-Dokumentation – mailComposeController(_:didFinishWith:error:):
Wenn der Benutzer sich dafür entschieden hat, die von dieser Schnittstelle erstellte E-Mail zu senden, sollte diese E-Mail zum Zeitpunkt des Aufrufs dieser Methode im Mail-Programm des Benutzers in die Warteschlange gestellt werden . Wenn beim Einreihen der E-Mail-Nachricht ein Fehler aufgetreten ist, error
enthält der Parameter ein Fehlerobjekt, das die Art des aufgetretenen Fehlers angibt.
Mit anderen Worten, die App kann NIE wissen, ob die E-Mail erfolgreich an die Empfänger gesendet wurde.
Erweiterte Funktion - Hinzufügen eines Anhangs zur E-Mail
Das Senden von Anhängen ist in den meisten Anwendungsfällen eine seltene Funktion. Ermöglicht es uns jedoch MFMailComposeViewController
, eine Liste von Anhängen in einem beliebigen Dateiformat an die verfasste E-Mail anzuhängen.
// 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")

Mehr erfahren

Es gibt viele weitere Möglichkeiten, E-Mails zu versenden. Firebase Extension Trigger Email bietet ein benutzerfreundliches Tool, mit dem Entwickler E-Mails versenden können, indem ein Firestore-Dokument mit bestimmten vordefinierten Feldern erstellt wird. Unten ist mein anderer Blog über die Trigger-E-Mail-Erweiterung. Sie können es gerne lesen, wenn Sie mehr darüber erfahren möchten.
Firebase-Erweiterung – Trigger-E-MailFazit
Apple bietet ein benutzerfreundliches MessageUI
Framework, um Apps beim Versenden von E-Mails zu unterstützen, indem der Auftrag an die Mailing-App des Systems delegiert wird. Die App kann die Empfängerliste, den Betreff, den Nachrichtentext und die Anhangsliste festlegen. Sobald der Benutzer eine Aktion MFMailComposeViewControllerDelegate
ausführt, gibt er das Ergebnis zurück und die App muss die MFMailComposeViewController
manuell verwerfen.
Beachten Sie, dass das sent
Ergebnis von MFMailComposeViewControllerDelegate
nicht wirklich bedeutet, dass die E-Mail versendet wird. Die E-Mail-Anfrage wird nur bei der System-Mailing-App in die Warteschlange gestellt!
Ich hoffe, Sie würden diesen Blog genießen und einen schönen Tag haben!