Sviluppatore iOS — Invia e-mail

Nov 26 2022
L'e-mail è uno dei migliori canali di comunicazione del 21° secolo. Le informazioni possono essere consegnate a un gruppo di destinatari in pochi secondi.

L'e-mail è uno dei migliori canali di comunicazione del 21° secolo. Le informazioni possono essere consegnate a un gruppo di destinatari in pochi secondi. Hai mai pensato di integrare la funzione email nella tua app?

Apple ha fornito un framework semplice da usare MessageUIper gli sviluppatori. Possiamo configurare le seguenti proprietà:

  1. Elenco destinatari
  2. Argomento
  3. Corpo del messaggio
  4. Allegati

Procedura passo dopo passo

Passaggio 1) Verificare se il dispositivo può inviare e-mail

import MessageUI

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

1. L'utente dell'app non ha ancora configurato il proprio account e-mail nell'app di posta del sistema

2. Il profilo MDM iOS ha disabilitato la funzione di invio, facendo riferimento a questa risposta StackOverflow .

Passaggio 2) Configurare l'istanza MFMailComposeViewController

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

  1. L'elenco dei destinatari, inclusi to, cc&bcc
  2. Il campo tematico
  3. Il corpo del messaggio in testo normale o messaggio HTML

Passaggio 3) Chiudere manualmente 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)
    }
}

C'è anche una resultproprietà per mostrare l'azione dell'utente, tra cui:

  1. cancelled— L'utente ha fatto clic sul pulsante "Annulla" e quindi ha eliminato la bozza dell'e-mail
  2. saved— L'utente ha fatto clic sul pulsante "Annulla" e quindi ha salvato la bozza dell'e-mail
  3. sent— L'utente ha *inviato* l'e-mail
  4. fail— Si è verificato un errore nell'accodare l'e-mail all'app di posta

Trucco: l'e-mail VERAMENTE inviata quando viene restituito il risultato "inviato"?

Hai provato a inviare l'e-mail quando non c'è connessione di rete, ad esempio in modalità aereo? Ah NO ! Il didFinishWithcallback di MFMailComposeViewControllerDelegaterestituisce effettivamente un sentrisultato!!!

Cosa significa?

Secondo la documentazione Apple di seguito, MFMailComposeViewControllerinvia solo una richiesta al programma di posta di sistema per mettere in coda l'e-mail invece di inviarla !!!

Documentazione ufficiale Apple — mailComposeController(_:didFinishWith:error:):

Se l'utente ha scelto di inviare l'e-mail creata da questa interfaccia, quell'e-mail dovrebbe essere accodata nel programma di posta dell'utente quando questo metodo viene chiamato . Se si è verificato un errore durante l'accodamento del messaggio di posta elettronica, il errorparametro contiene un oggetto errore che indica il tipo di errore che si è verificato.

In altre parole, l'app non può MAI sapere se l'e-mail è stata inviata correttamente ai destinatari.

Funzionalità avanzata: aggiunta di un allegato all'e-mail

L'invio di allegati è una funzione rara nella maggior parte dei casi d'uso. Tuttavia, MFMailComposeViewControllerci consente di allegare un elenco di allegati in qualsiasi formato di file all'e-mail composta.

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

Per saperne di più

Esistono molti altri modi per inviare e-mail. Firebase Extension Trigger Email fornisce uno strumento di facile utilizzo per aiutare gli sviluppatori a inviare e-mail creando un documento Firestore con specifici campi predefiniti. Di seguito è riportato il mio altro blog sull'estensione Trigger Email. Siete invitati a leggerlo se volete saperne di più.

Estensione Firebase: attiva l'e-mail

Conclusione

Apple fornisce un framework facile da usare MessageUIper aiutare le app a inviare e-mail delegando il lavoro all'app di mailing del sistema. L'app può impostare l'elenco dei destinatari, l'oggetto, il corpo del messaggio e l'elenco degli allegati. Una volta che l'utente ha un'azione, MFMailComposeViewControllerDelegaterestituisce il risultato e l'app deve chiuderlo MFMailComposeViewControllermanualmente.

Tieni presente che il sentrisultato di MFMailComposeViewControllerDelegatenon significa realmente che l'e-mail è stata inviata. La richiesta di posta elettronica viene messa in coda solo nell'app di posta del sistema!

Spero che questo blog ti piaccia e ti auguro una buona giornata!