Nhà phát triển iOS — Gửi email
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 — MessageUI
dà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:
- Danh sách người nhận
- Vấn đề
- Nội dung thư
- 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)
- Danh sách người nhận, bao gồm
to
,cc
&bcc
- lĩnh vực chủ đề
- Nội dung thư ở dạng văn bản thuần túy hoặc thư HTML
![](https://post.nghiatu.com/assets/images/m/max/724/1*Pi9_X7kZbG04dYRHUcIrnw.png)
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 result
thuộc tính để hiển thị hành động của người dùng, bao gồm:
cancelled
— Người dùng đã nhấp vào nút “Hủy” và sau đó xóa bản nháp emailsaved
— Người dùng đã nhấp vào nút “Hủy” và sau đó lưu bản nháp emailsent
— Người dùng đã *gửi* email đifail
— Có lỗi khi xếp hàng email đến ứng dụng thư
![](https://post.nghiatu.com/assets/images/m/max/724/1*a53B-LIZjKUE8SwBKx2utA.png)
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 didFinishWith
gọi lại của MFMailComposeViewControllerDelegate
thực sự trả về một sent
kết quả!!!
Điều đó nghĩa là gì?
Theo tài liệu dưới đây của Apple, việc MFMailComposeViewController
duy 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, error
tham 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, MFMailComposeViewController
cho 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")
![](https://post.nghiatu.com/assets/images/m/max/724/1*wrnY-Ff3c7dDR899w4fsnA.png)
Tìm hiểu thêm
![](https://post.nghiatu.com/assets/images/m/max/724/0*UzlNICYCl7JaIvZW.png)
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ạtPhần kết luận
Apple cung cấp một MessageUI
khuô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, MFMailComposeViewControllerDelegate
kết quả sẽ được kích hoạt trở lại và ứng dụng phải loại bỏ MFMailComposeViewController
thủ công.
Hãy nhớ rằng sent
kết quả từ MFMailComposeViewControllerDelegate
khô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!