Desenvolvedor iOS — Enviar e-mail
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:
- Lista de destinatários
- Sujeito
- Corpo da mensagem
- 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)
- A lista de destinatários, incluindo o
to
,cc
&bcc
- O campo de assunto
- 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 result
propriedade para mostrar a ação do usuário, incluindo:
cancelled
— O usuário clicou no botão “Cancelar” e excluiu o rascunho do e-mailsaved
— O usuário clicou no botão “Cancelar” e salvou o rascunho do e-mailsent
— O usuário *enviou* o e-mailfail
— 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 didFinishWith
retorno de chamada de MFMailComposeViewControllerDelegate
realmente retorna um sent
resultado!!!
O que isso significa?
De acordo com a documentação da Apple abaixo, MFMailComposeViewController
basta 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 error
parâ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, MFMailComposeViewController
nos 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-mailConclusão
A Apple fornece uma estrutura fácil de usar MessageUI
para 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 MFMailComposeViewControllerDelegate
aciona o resultado de volta e o aplicativo precisa descartar MFMailComposeViewController
manualmente.
Tenha em mente que o sent
resultado do MFMailComposeViewControllerDelegate
nã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!