iOS Dev — Wyślij e-mail

Nov 26 2022
E-mail to jeden z najlepszych kanałów komunikacji w XXI wieku. Informacja może zostać dostarczona do grupy odbiorców w ciągu kilku sekund.

E-mail to jeden z najlepszych kanałów komunikacji w XXI wieku. Informacja może zostać dostarczona do grupy odbiorców w ciągu kilku sekund. Czy kiedykolwiek myślałeś o integracji funkcji e-mail w swojej aplikacji?

Firma Apple udostępniła prostą w obsłudze platformę — MessageUIdla programistów. Możemy skonfigurować następujące właściwości:

  1. Lista odbiorców
  2. Podmiot
  3. Treść wiadomości
  4. Załączniki

Procedura krok po kroku

Krok 1) Sprawdź, czy urządzenie może wysyłać wiadomości e-mail

import MessageUI

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

1. Użytkownik aplikacji nie założył jeszcze swojego konta pocztowego w systemowej aplikacji mailingowej

2. Profil iOS MDM wyłączył funkcję poczty, odnosząc się do tej odpowiedzi StackOverflow .

Krok 2) Skonfiguruj instancję 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. Lista odbiorców, w tym to, cc&bcc
  2. Pole tematu
  3. Treść wiadomości w postaci zwykłego tekstu lub wiadomości HTML

Krok 3) Zamknij ręcznie 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)
    }
}

Istnieje również resultwłaściwość pokazująca działanie użytkownika, w tym:

  1. cancelled— Użytkownik kliknął przycisk „Anuluj”, a następnie usunął wersję roboczą wiadomości e-mail
  2. saved— Użytkownik kliknął przycisk „Anuluj”, a następnie zapisał wersję roboczą wiadomości e-mail
  3. sent— Użytkownik *wysłał* wiadomość e-mail
  4. fail— Wystąpił błąd podczas kolejkowania wiadomości e-mail do aplikacji pocztowej

Sztuczka — czy wiadomość e-mail NAPRAWDĘ zostaje wysłana po zwróceniu wyniku „wysłane”?

Czy próbowałeś wysłać wiadomość e-mail, gdy nie ma połączenia sieciowego, np. w trybie samolotowym? O NIE ! Wywołanie didFinishWithzwrotne MFMailComposeViewControllerDelegatefaktycznie zwraca sentwynik!!!

Co to znaczy?

Zgodnie z poniższą dokumentacją Apple, MFMailComposeViewControllerjedyne wysłanie żądania do systemowego programu pocztowego w celu kolejkowania wiadomości e-mail zamiast jej wysyłania !!!

Oficjalna dokumentacja Apple — mailComposeController(_:didFinishWith:error:):

Jeśli użytkownik zdecydował się wysłać wiadomość e-mail utworzoną za pomocą tego interfejsu, ta wiadomość e-mail powinna zostać umieszczona w kolejce w programie pocztowym użytkownika do czasu wywołania tej metody . Jeśli podczas kolejkowania wiadomości e-mail wystąpił błąd, errorparametr zawiera obiekt błędu, który wskazuje typ błędu, który wystąpił.

Innymi słowy, aplikacja NIGDY nie może wiedzieć, czy wiadomość e-mail została pomyślnie wysłana do odbiorców.

Zaawansowana funkcja - Dodawanie załącznika do wiadomości e-mail

Wysyłanie załączników jest rzadką funkcją w większości przypadków użycia. Pozwala natomiast MFMailComposeViewControllerdołączyć do skomponowanej wiadomości e-mail listę załączników w dowolnym formacie pliku.

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

Ucz się więcej

Istnieje wiele innych sposobów wysyłania wiadomości e-mail. Firebase Extension Trigger Email zapewnia łatwe w użyciu narzędzie, które pomaga programistom w wysyłaniu wiadomości e-mail poprzez tworzenie dokumentu Firestore z określonymi wstępnie zdefiniowanymi polami. Poniżej znajduje się mój drugi blog o rozszerzeniu Trigger Email. Zapraszamy do lektury, jeśli chcesz dowiedzieć się więcej na ten temat.

Rozszerzenie Firebase — wyzwalacz wiadomości e-mail

Wniosek

Firma Apple zapewnia łatwą w użyciu MessageUIplatformę, która pomaga aplikacjom w wysyłaniu wiadomości e-mail, delegując zadanie do systemowej aplikacji pocztowej. Aplikacja może ustawić listę odbiorców, temat, treść wiadomości i listę załączników. Gdy użytkownik wykona jakąkolwiek akcję, odpala wynik z powrotem, a aplikacja musi ręcznie MFMailComposeViewControllerDelegateodrzucić .MFMailComposeViewController

Pamiętaj, że sentwynik z MFMailComposeViewControllerDelegatenie oznacza, że ​​e-mail został wysłany. Żądanie e-mail jest umieszczane w kolejce tylko w systemowej aplikacji pocztowej!

Mam nadzieję, że spodoba ci się ten blog i życzę miłego dnia!