Développeur iOS — Envoyer un e-mail

Nov 26 2022
Le courrier électronique est l'un des meilleurs canaux de communication du 21e siècle. Les informations peuvent être délivrées à un groupe de destinataires en quelques secondes.

Le courrier électronique est l'un des meilleurs canaux de communication du 21e siècle. Les informations peuvent être délivrées à un groupe de destinataires en quelques secondes. Avez-vous déjà pensé à intégrer la fonction e-mail dans votre application ?

Apple a fourni un cadre simple à utiliser - MessageUIpour les développeurs. Nous pouvons configurer les propriétés suivantes :

  1. Liste des destinataires
  2. Sujet
  3. Corps du message
  4. Pièces jointes

Procédure étape par étape

Étape 1) Vérifiez si l'appareil peut envoyer des e-mails

import MessageUI

// Confirm the user can send email
guard MFMailComposeViewController.canSendMail() else { return }

1. L'utilisateur de l'application n'a pas encore configuré son compte de messagerie dans l'application de messagerie du système

2. Le profil iOS MDM a désactivé la fonction de messagerie, en se référant à cette réponse StackOverflow .

Étape 2) Configurer l'instance MFMailComposeViewController

// Construct the `MFMailComposeViewController` instance
let mfMailComposeViewController = MFMailComposeViewController()

// To set the recipients list, including the to, cc and bcc fields
mfMailComposeViewController.setToRecipients(["to@example.com"])
mfMailComposeViewController.setCcRecipients(["cc@example.com"])
mfMailComposeViewController.setBccRecipients(["bcc@example.com"])

// 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)

  1. La liste des destinataires, y compris le to, cc&bcc
  2. Le domaine du sujet
  3. Le corps du message en texte brut ou en message HTML

Étape 3) Fermez manuellement le 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)
    }
}

Il existe également une resultpropriété pour afficher l'action de l'utilisateur, notamment :

  1. cancelled— L'utilisateur a cliqué sur le bouton "Annuler", puis a supprimé le brouillon de l'e-mail
  2. saved— L'utilisateur a cliqué sur le bouton "Annuler", puis a enregistré le brouillon de l'e-mail
  3. sent— L'utilisateur a *envoyé* l'e-mail
  4. fail— Une erreur s'est produite lors de la mise en file d'attente de l'e-mail dans l'application de messagerie

Astuce — L'e-mail est-il VRAIMENT envoyé lorsque le résultat "envoyé" est renvoyé ?

Avez-vous essayé d'envoyer l'e-mail alors qu'il n'y a pas de connexion réseau, par exemple en mode avion ? Ah NON ! Le didFinishWithrappel de MFMailComposeViewControllerDelegaterenvoie en fait un sentrésultat !!!

Qu'est-ce que ça veut dire?

Selon la documentation Apple ci-dessous, le MFMailComposeViewControllerseul envoi d'une demande au programme de messagerie du système pour mettre l'e-mail en file d'attente au lieu de l'envoyer !!!

Documentation officielle Apple — mailComposeController(_:didFinishWith:error:):

Si l'utilisateur a choisi d'envoyer l'e-mail créé par cette interface, cet e-mail doit être mis en file d'attente dans le programme Mail de l'utilisateur au moment où cette méthode est appelée . Si une erreur s'est produite lors de la mise en file d'attente du message électronique, le errorparamètre contient un objet d'erreur qui indique le type d'échec qui s'est produit.

En d'autres termes, l'application ne peut JAMAIS savoir si l'e-mail est envoyé avec succès aux destinataires.

Fonctionnalité avancée - Ajout d'une pièce jointe à l'e-mail

L'envoi de pièces jointes est une fonction rare dans la plupart des cas d'utilisation. Cependant, MFMailComposeViewControllernous permet de joindre une liste de pièces jointes dans n'importe quel format de fichier à l'e-mail composé.

// 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")

Apprendre encore plus

Il existe de nombreuses autres façons d'envoyer des e-mails. Firebase Extension Trigger Email fournit un outil facile à utiliser pour aider les développeurs à envoyer des e-mails en créant un document Firestore avec des champs prédéfinis spécifiques. Vous trouverez ci-dessous mon autre blog sur l'extension Trigger Email. Vous êtes invités à le lire si vous voulez en savoir plus à ce sujet.

Extension Firebase – Déclencher un e-mail

Conclusion

Apple fournit un cadre facile à utiliser MessageUIpour aider les applications à envoyer des e-mails en déléguant le travail à l'application de messagerie du système. L'application peut définir la liste des destinataires, l'objet, le corps du message et la liste des pièces jointes. Une fois que l'utilisateur a effectué une action, MFMailComposeViewControllerDelegateil renvoie le résultat et l'application doit le supprimer MFMailComposeViewControllermanuellement.

Gardez à l'esprit que le sentrésultat du MFMailComposeViewControllerDelegatene signifie pas vraiment que l'e-mail est envoyé. La demande d'e-mail n'est mise en file d'attente que sur l'application de messagerie du système !

J'espère que ce blog vous plaira et que vous passerez une bonne journée !