iOS 应用通过 MFMailComposeViewController 或 mailto 来发送邮件

| Swift , iOS

 

内容概览

  • 前言
  • MFMailComposeViewController
  • mailto
  • 总结

 

前言

 

在 iOS 开发中实现发送邮件的需求是比较简单的,本文主要提供两种方案:

  • 通过 MessageUI 中提供的 MFMailComposeViewController 来在应用内显示邮件编辑页面;
  • 通过 mailto 协议来启动 iOS 系统中的邮件应用;

Ficow 建议您使用第一种方案,因为它可以让您很轻易地自定义邮件的内容,比如:邮件的主题、收件人列表、抄送收件人列表、正文文本内容、正文附件等等。

 

MFMailComposeViewController

 

请直接看代码:

import MessageUI // 首先导入 MessageUI 库

final class ViewController: UIViewController {

    func showEmailPage() {
        let mailComposerVC = MFMailComposeViewController()
        let recipients = ["ficowshen@hotmail.com"]
        mailComposerVC.setToRecipients(recipients)
        mailComposerVC.setSubject("Email to Ficow Shen")
        let body = """
        Hello, Ficow Shen!
        This is the body of the test email~
        """
        mailComposerVC.setMessageBody(body, isHTML: false)
        mailComposerVC.mailComposeDelegate = self // 需要遵循 MFMailComposeViewControllerDelegate 协议
        present(mailComposerVC, animated: animated, completion: nil)
    }

}

另外,您还需要让 ViewController 遵循 MFMailComposeViewControllerDelegate 协议,因为 self 被赋给了 MFMailComposeViewController 实例的 mailComposeDelegate 属性。这个协议提供的回调方法,主要用于隐藏邮件编辑页面以及展示可能出现的错误。

extension ViewController: MFMailComposeViewControllerDelegate {
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        controller.dismiss(animated: true, completion: nil)
        if let error = error {
            // 处理错误信息
        }
    }
}

由于某些原因,MFMailComposeViewController 可能无法发送邮件(比如:用户尚未配置发送邮件的邮箱帐号)。所以在显示 MFMailComposeViewController 到屏幕之前,您必须先检查 MFMailComposeViewController.canSendMail() 的返回值是否为 true

如果,MFMailComposeViewController.canSendMail() 返回的值为 false,您可以告知用户去配置邮箱帐号。或者,您可以在这种情况下使用 mailto 方案。

 

mailto

 

采用 mailto 方案的实现非常简单,您只需要构建一个包含邮箱地址的 URL 即可:

let email = "ficowshen@hotmail.com"

if let url = URL(string: "mailto:\(email)") {
    UIApplication.shared.open(url)
} else {
    fatalError("Invalid mailto URL!")
}

如果需要发送给多个收件人,您就需要这样配置(%2C 是英文逗号通过百分号编码之后的格式):

let recipients = ["aaa@qq.com","bbb@qq.com"]
if let url = URL(string: "mailto:\(recipients.joined(separator: "%2C"))") {
    UIApplication.shared.open(url)
} else {
    fatalError("Invalid mailto URL!")
}

如果您需要定制抄送收件人、邮件主题、正文文本等参数,您就需要这样配置(%20就是空格通过百分号编码之后的格式):

let email = "ficowshen@hotmail.com?cc=aaa@qq.com&subject=Email%20Subject&body=This%20is%20body"

if let url = URL(string: "mailto:\(email)") {
    UIApplication.shared.open(url)
} else {
    fatalError("Invalid mailto URL!")
}

 

总结

 

相对来说,MFMailComposeViewController 更加易用。而且,它允许您在应用内展示邮件编辑页面,而不是像 mailto 那样跳转到应用外部。Ficow 建议您在 MFMailComposeViewController 方案不可用的情况下再采用 mailto 方案。

以上就是本文的全部内容,希望对您有所帮助。如果您还有其他的可行方案,欢迎您给 Ficow 留言哈~

 

参考内容:
Apple URL Scheme Reference - Mail Links

 

觉得不错?点个赞呗~

本文链接:iOS 应用通过 MFMailComposeViewController 或 mailto 来发送邮件

转载声明:本站文章如无特别说明,皆为原创。转载请注明:Ficow Shen's Blog

评论区(期待你的留言)