在 Swift (iOS/macOS) 中发送电子邮件:MFMailComposeViewController 和 SMTP

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Swift (iOS/macOS) 中发送电子邮件:完整指南



发送电子邮件是现代移动和桌面应用程序的关键功能之一。在 Apple 的 Swift (iOS/macOS) 生态系统中,有两种主要方法:使用内置控制器 MFMailComposeViewController 通过设备的邮件客户端简单发送,以及通过第三方库(如 SwiftSMTP)使用 SMTP 协议进行发送。在本文中,我们将详细讨论这两种方法、它们的优势、局限性,并提供实用的代码示例。



1. 通过 MFMailComposeViewController 发送电子邮件



MFMailComposeViewController 是 MessageUI.framework 框架中的一个组件,它提供了一个现成的界面来创建和发送邮件。当需要快速实现发送而无需配置 SMTP 服务器时,此方法非常理想。



优势和局限性

  • 优势:无需配置 SMTP,支持 HTML 内容、附件,自动使用设备上配置的邮件帐户。
  • 局限性:仅在实际设备上运行(不在模拟器中),需要配置邮件帐户,不适合无用户界面的后台发送。


实现示例

首先,导入框架并实现委托:



import UIKitimport MessageUI

class ViewController: UIViewController, MFMailComposeViewControllerDelegate {

@IBAction func sendEmailTapped(_ sender: UIButton) { guard MFMailComposeViewController.canSendMail() else { print("设备上未配置邮件") return }

let mailComposer = MFMailComposeViewController() mailComposer.mailComposeDelegate = self mailComposer.setToRecipients(["recipient@example.com"]) mailComposer.setSubject("来自 Swift 的问候!") mailComposer.setMessageBody("<h1>测试邮件</h1><p>这是 HTML 内容。</p>", isHTML: true)

// 添加附件 if let fileData = "文本文件".data(using: .utf8) { mailComposer.addAttachmentData(fileData, mimeType: "text/plain", fileName: "example.txt") }

present(mailComposer, animated: true, completion: nil) }

// 处理结果的委托 func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { switch result { case .cancelled: print("发送已取消") case .saved: print("邮件已保存为草稿") case .sent: print("邮件已发送") case .failed: print("发送失败:\\(error?.localizedDescription ?? "未知错误")") @unknown default: break } controller.dismiss(animated: true, completion: nil) }}


2. 通过 SwiftSMTP 库使用 SMTP 发送电子邮件



如果需要以编程方式发送邮件,无需用户参与(例如,用于注册邮件或通知),请使用 SMTP 协议。Swift 的一个流行库是 SwiftSMTP。它支持 TLS/SSL、身份验证和附件处理。



通过 Swift Package Manager 安装

在 Package.swift 中添加依赖:

dependencies: [    .package(url: "https://github.com/Kitura/Swift-SMTP.git", from: "2.0.0")]


通过 Gmail SMTP 服务器发送的示例

import SwiftSMTP

func sendEmailViaSMTP() { let smtp = SMTP( hostname: "smtp.gmail.com", // SMTP 服务器 email: "your-email@gmail.com", password: "your-app-passwo

推荐