Desenvolvedor iOS — Enviar e-mail

Nov 26 2022
O e-mail é um dos melhores canais de comunicação do século XXI. As informações podem ser entregues a um grupo de destinatários em poucos segundos.

O e-mail é um dos melhores canais de comunicação do século XXI. As informações podem ser entregues a um grupo de destinatários em poucos segundos. Você já pensou em integrar a função de e-mail em seu aplicativo?

A Apple forneceu uma estrutura simples de usar — MessageUI​​para desenvolvedores. Podemos configurar as seguintes propriedades:

  1. Lista de destinatários
  2. Sujeito
  3. Corpo da mensagem
  4. Anexos

Procedimento passo a passo

Etapa 1) Verifique se o dispositivo pode enviar e-mail

import MessageUI

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

1. O usuário do aplicativo ainda não configurou sua conta de e-mail no aplicativo de correspondência do sistema

2. O perfil iOS MDM desativou a função de correspondência, referindo-se a esta resposta do StackOverflow .

Etapa 2) Configurar a instância MMFailComposeViewController

// 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. A lista de destinatários, incluindo o to, cc&bcc
  2. O campo de assunto
  3. O corpo da mensagem em texto simples ou mensagem HTML

Etapa 3) Dispensar o MMFailComposeViewController manualmente

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

Há também uma resultpropriedade para mostrar a ação do usuário, incluindo:

  1. cancelled— O usuário clicou no botão “Cancelar” e excluiu o rascunho do e-mail
  2. saved— O usuário clicou no botão “Cancelar” e salvou o rascunho do e-mail
  3. sent— O usuário *enviou* o e-mail
  4. fail— Ocorreu um erro ao enfileirar o e-mail no aplicativo de e-mail

Truque — O e-mail REALMENTE foi enviado quando o resultado 'enviado' é retornado?

Você tentou enviar o e-mail quando não havia conexão de rede, por exemplo, no modo avião? Ah NÃO ! O didFinishWithretorno de chamada de MFMailComposeViewControllerDelegaterealmente retorna um sentresultado!!!

O que isso significa?

De acordo com a documentação da Apple abaixo, MFMailComposeViewControllerbasta enviar uma solicitação ao programa de correio do sistema para enfileirar o e-mail em vez de enviá-lo !!!

Documentação oficial da Apple — mailComposeController(_:didFinishWith:error:):

Caso o usuário tenha optado por enviar o e-mail criado por esta interface, este e-mail deverá ser colocado na fila do programa Mail do usuário no momento em que este método for chamado . Se ocorreu um erro ao enfileirar a mensagem de e-mail, o errorparâmetro contém um objeto de erro que indica o tipo de falha que ocorreu.

Em outras palavras, o aplicativo NUNCA pode saber se o e-mail foi enviado aos destinatários com sucesso.

Recurso Avançado - Adicionando um anexo ao e-mail

O envio de anexos é uma função rara na maioria dos casos de uso. No entanto, MFMailComposeViewControllernos permite anexar uma lista de anexos em qualquer formato de arquivo ao e-mail composto.

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

Saber mais

Existem muitas outras maneiras de enviar e-mails. Firebase Extension Trigger Email fornece uma ferramenta fácil de usar para ajudar os desenvolvedores a enviar e-mails criando um documento do Firestore com campos predefinidos específicos. Abaixo está meu outro blog sobre a Extensão de E-mail Trigger. Você está convidado a lê-lo se quiser saber mais sobre ele.

Extensão do Firebase — acionar e-mail

Conclusão

A Apple fornece uma estrutura fácil de usar MessageUIpara ajudar os aplicativos a enviar e-mails delegando o trabalho ao aplicativo de correspondência do sistema. O aplicativo pode definir a lista de destinatários, assunto, corpo da mensagem e lista de anexos. Depois que o usuário realiza qualquer ação, ele MFMailComposeViewControllerDelegateaciona o resultado de volta e o aplicativo precisa descartar MFMailComposeViewControllermanualmente.

Tenha em mente que o sentresultado do MFMailComposeViewControllerDelegatenão significa realmente que o e-mail foi enviado. A solicitação de e-mail é enfileirada apenas no aplicativo de correspondência do sistema!

Espero que você goste deste blog e tenha um bom dia!