iOS Dev — ส่งอีเมล

Nov 26 2022
อีเมลเป็นหนึ่งในช่องทางการสื่อสารที่ดีที่สุดในศตวรรษที่ 21 ข้อมูลสามารถส่งไปยังกลุ่มผู้รับได้ภายในเวลาไม่กี่วินาที

อีเมลเป็นหนึ่งในช่องทางการสื่อสารที่ดีที่สุดในศตวรรษที่ 21 ข้อมูลสามารถส่งไปยังกลุ่มผู้รับได้ภายในเวลาไม่กี่วินาที คุณเคยคิดที่จะรวมฟังก์ชั่นอีเมลเข้ากับแอพของคุณหรือไม่?

Apple ได้จัดเตรียมเฟรมเวิร์กที่ใช้งานง่ายMessageUIสำหรับนักพัฒนา เราสามารถกำหนดค่าคุณสมบัติดังต่อไปนี้:

  1. รายชื่อผู้รับ
  2. เรื่อง
  3. เนื้อความของข้อความ
  4. ไฟล์แนบ

ขั้นตอนทีละขั้นตอน

ขั้นตอนที่ 1) ตรวจสอบว่าอุปกรณ์สามารถส่งอีเมลได้หรือไม่

import MessageUI

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

1. ผู้ใช้แอปยังไม่ได้ตั้งค่าบัญชีอีเมลของตนในแอปการส่งจดหมายของระบบ

2. โปรไฟล์ MDM ของ iOS ได้ปิดใช้งานฟังก์ชันการส่งจดหมาย โดยอ้างถึงคำตอบStackOverflow นี้

ขั้นตอนที่ 2) กำหนดค่าอินสแตนซ์ 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. รายชื่อผู้รับ รวมถึงto, cc&bcc
  2. สาขาวิชา
  3. เนื้อหาข้อความเป็นข้อความธรรมดาหรือข้อความ HTML

ขั้นตอนที่ 3) ปิด 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)
    }
}

นอกจากนี้ยังมีresultพร็อพเพอร์ตี้เพื่อแสดงการกระทำของผู้ใช้ ได้แก่:

  1. cancelled— ผู้ใช้คลิกปุ่ม “ยกเลิก” แล้วลบฉบับร่างอีเมล
  2. saved— ผู้ใช้คลิกปุ่ม “ยกเลิก” แล้วบันทึกฉบับร่างอีเมล
  3. sent— ผู้ใช้ *ส่ง* อีเมลออกไปแล้ว
  4. fail— มีข้อผิดพลาดในการจัดคิวอีเมลไปยังแอปอีเมล

ทริค — อีเมลจะถูกส่งออกไปจริง ๆ เมื่อผลลัพธ์ `ส่ง` ถูกตีกลับหรือไม่?

คุณพยายามส่งอีเมลเมื่อไม่มีการเชื่อมต่อเครือข่าย เช่น โหมดเครื่องบินหรือไม่ โอ้ไม่ ! การdidFinishWithเรียกกลับของMFMailComposeViewControllerDelegateผลตอบแทนจริงsent!!!

นั่นหมายความว่าอย่างไร?

ตามเอกสารด้านล่างของ Apple MFMailComposeViewControllerเพียงส่งคำขอไปยังโปรแกรมอีเมลระบบเพื่อจัดคิวอีเมลแทนการส่งออก !!!

เอกสารอย่างเป็นทางการของ Apple — mailComposeController(_:didFinishWith:error:):

หากผู้ใช้เลือกที่จะส่งอีเมลที่สร้างโดยอินเทอร์เฟซนี้อีเมลนั้นควรอยู่ในคิวในโปรแกรม Mail ของผู้ใช้เมื่อถึงเวลาที่เรียกใช้วิธีนี้ หากเกิดข้อผิดพลาดขณะจัดคิวข้อความอีเมลerrorพารามิเตอร์จะมีอ็อบเจ็กต์ข้อผิดพลาดที่ระบุประเภทของความล้มเหลวที่เกิดขึ้น

กล่าวอีกนัยหนึ่ง แอปไม่มีทางรู้ได้เลยว่าอีเมลถูกส่งไปยังผู้รับสำเร็จหรือไม่

คุณสมบัติขั้นสูง - การเพิ่มไฟล์แนบในอีเมล

การส่งไฟล์แนบเป็นฟังก์ชันที่หายากในกรณีการใช้งานส่วนใหญ่ อย่างไรก็ตามMFMailComposeViewControllerช่วยให้เราแนบรายการไฟล์แนบในรูปแบบไฟล์ใดก็ได้ไปกับอีเมลที่เขียน

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

เรียนรู้เพิ่มเติม

มีหลายวิธีในการส่งอีเมลออก อีเมล ทริกเกอร์ส่วนขยายของ Firebaseมีเครื่องมือที่ใช้งานง่ายเพื่อช่วยให้นักพัฒนาสามารถส่งอีเมลโดยสร้างเอกสาร Firestore พร้อมช่องที่กำหนดไว้ล่วงหน้า ด้านล่างนี้เป็นบล็อกอื่นของฉันเกี่ยวกับส่วนขยายอีเมลทริกเกอร์ คุณสามารถอ่านได้หากต้องการทราบข้อมูลเพิ่มเติม

ส่วนขยาย Firebase — ทริกเกอร์อีเมล

บทสรุป

Apple มีMessageUIเฟรมเวิร์กที่ใช้งานง่ายเพื่อช่วยให้แอพส่งอีเมลโดยมอบหมายงานให้กับแอพส่งเมลของระบบ แอพสามารถตั้งค่ารายชื่อผู้รับ หัวเรื่อง เนื้อหาข้อความ และรายการไฟล์แนบ เมื่อผู้ใช้ดำเนินการใดๆ แล้วMFMailComposeViewControllerDelegateแอปจะส่งผลลัพธ์กลับและแอปต้องปิดการดำเนินการMFMailComposeViewControllerด้วยตนเอง

โปรดทราบว่าsentผลลัพธ์จาก the MFMailComposeViewControllerDelegateไม่ได้หมายความว่าอีเมลถูกส่งออกไปจริงๆ คำขออีเมลจะเข้าคิวที่แอปส่งจดหมายของระบบเท่านั้น!

หวังว่าคุณจะสนุกกับบล็อกนี้และมีวันที่ดี!