Nhà phát triển iOS — Gửi email

Nov 26 2022
Email là một trong những kênh giao tiếp tốt nhất trong thế kỷ 21. Thông tin có thể được gửi đến một nhóm người nhận trong vài giây.

Email là một trong những kênh giao tiếp tốt nhất trong thế kỷ 21. Thông tin có thể được gửi đến một nhóm người nhận trong vài giây. Bạn đã bao giờ nghĩ đến việc tích hợp chức năng email vào ứng dụng của mình chưa?

Apple đã cung cấp một khung dễ sử dụng — MessageUIdành cho các nhà phát triển. Chúng ta có thể cấu hình các thuộc tính sau:

  1. Danh sách người nhận
  2. Vấn đề
  3. Nội dung thư
  4. tệp đính kèm

Quy trình từng bước

Bước 1) Kiểm tra xem thiết bị có thể gửi email không

import MessageUI

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

1. Người dùng ứng dụng chưa thiết lập tài khoản email của mình trong ứng dụng gửi thư hệ thống

2. Cấu hình MDM của iOS đã tắt chức năng gửi thư, tham khảo câu trả lời StackOverflow này .

Bước 2) Định cấu hình phiên bản 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. Danh sách người nhận, bao gồm to, cc&bcc
  2. lĩnh vực chủ đề
  3. Nội dung thư ở dạng văn bản thuần túy hoặc thư HTML

Bước 3) Loại bỏ thủ công 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)
    }
}

Ngoài ra còn có một resultthuộc tính để hiển thị hành động của người dùng, bao gồm:

  1. cancelled— Người dùng đã nhấp vào nút “Hủy” và sau đó xóa bản nháp email
  2. saved— Người dùng đã nhấp vào nút “Hủy” và sau đó lưu bản nháp email
  3. sent— Người dùng đã *gửi* email đi
  4. fail— Có lỗi khi xếp hàng email đến ứng dụng thư

Thủ thuật — Email có THỰC SỰ được gửi đi khi kết quả `sent` được trả về không?

Bạn đã thử gửi email khi không có kết nối mạng, ví dụ như chế độ máy bay? Ồ KHÔNG ! Cuộc didFinishWithgọi lại của MFMailComposeViewControllerDelegatethực sự trả về một sentkết quả!!!

Điều đó nghĩa là gì?

Theo tài liệu dưới đây của Apple, việc MFMailComposeViewControllerduy nhất gửi yêu cầu đến chương trình thư hệ thống để xếp hàng email thay vì gửi đi !!!

Tài liệu chính thức của Apple — mailComposeController(_:didFinishWith:error:):

Nếu người dùng đã chọn gửi email được tạo bởi giao diện này, thì email đó sẽ được xếp hàng đợi trong chương trình Thư của người dùng vào thời điểm phương thức này được gọi . Nếu xảy ra lỗi trong khi xếp hàng thư email, errortham số chứa một đối tượng lỗi cho biết loại lỗi đã xảy ra.

Nói cách khác, ứng dụng KHÔNG BAO GIỜ biết được liệu email có được gửi đến người nhận thành công hay không.

Tính năng nâng cao - Thêm tệp đính kèm vào Email

Gửi tệp đính kèm là một chức năng hiếm gặp trong hầu hết các trường hợp sử dụng. Tuy nhiên, MFMailComposeViewControllercho phép chúng tôi đính kèm danh sách các tệp đính kèm ở bất kỳ định dạng tệp nào vào email đã soạn.

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

Tìm hiểu thêm

Có nhiều cách khác để gửi email ra ngoài. Firebase Extension Trigger Email cung cấp một công cụ dễ sử dụng để giúp các nhà phát triển gửi email bằng cách tạo tài liệu Firestore với các trường cụ thể được xác định trước. Dưới đây là blog khác của tôi về Tiện ích mở rộng email kích hoạt. Bạn có thể đọc nó nếu bạn muốn biết thêm về nó.

Tiện ích mở rộng Firebase — Email kích hoạt

Phần kết luận

Apple cung cấp một MessageUIkhuôn khổ dễ sử dụng để giúp các ứng dụng gửi email bằng cách ủy thác công việc cho ứng dụng gửi thư hệ thống. Ứng dụng có thể đặt danh sách người nhận, chủ đề, nội dung thư và danh sách tệp đính kèm. Khi người dùng có bất kỳ hành động nào, MFMailComposeViewControllerDelegatekết quả sẽ được kích hoạt trở lại và ứng dụng phải loại bỏ MFMailComposeViewControllerthủ công.

Hãy nhớ rằng sentkết quả từ MFMailComposeViewControllerDelegatekhông thực sự có nghĩa là email đã được gửi đi. Yêu cầu email chỉ được xếp hàng tại ứng dụng gửi thư hệ thống!

Hy vọng bạn sẽ thích blog này và có một ngày tốt đẹp!