给我的iOS应用“存钱猪猪”写用户反馈功能时,想要实现使用Swift发送邮件的功能,主要是给一个用户的反馈渠道,而且这个反馈渠道很多应用都在使用。
配置MessageUI
首先,打开Xcode并点击左侧的项目名称,找到TARGETS -> General -> Frameworks,Libraries,and Embedded Content,点击添加按钮。

输入“MessageUI”,可以在下面找到
MessageUI.framework
然后添加到我们的项目中。

使用方法
1、创建一个MessageUI控制器:
import SwiftUI
import MessageUI
struct MailComposeViewController: UIViewControllerRepresentable {
typealias UIViewControllerType = MFMailComposeViewController
var recipients: [String]
var subject: String
var body: String
var resultCallback: ((MFMailComposeResult) -> Void)?
class Coordinator: NSObject, MFMailComposeViewControllerDelegate {
var parent: MailComposeViewController
init(parent: MailComposeViewController) {
self.parent = parent
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
parent.resultCallback?(result)
controller.dismiss(animated: true)
}
}
func makeCoordinator() -> Coordinator {
return Coordinator(parent: self)
}
func makeUIViewController(context: Context) -> MFMailComposeViewController {
let vc = MFMailComposeViewController()
vc.mailComposeDelegate = context.coordinator
vc.setToRecipients(recipients)
vc.setSubject(subject)
vc.setMessageBody(body, isHTML: false)
return vc
}
func updateUIViewController(_ uiViewController: MFMailComposeViewController, context: Context) {}
}
2、View视图文件:
import SwiftUI
import UIKit
import MessageUI
struct ContentView: View {
@State private var showMailComposer = false
@State private var mailResult: MFMailComposeResult?
var body: some View {
Button("打开邮件") {
self.showMailComposer = true
}
// 邮件Sheet页
.sheet(isPresented: $showMailComposer) {
MailComposeViewController(
recipients: ["fangjunyu.com@gmail.com"], // 配置邮件地址
subject: "Feedback", // 配置邮件主题
body: "Hi fangjunyu,\n\n", // 配置邮件内容
resultCallback: { result in
self.mailResult = result
self.showMailComposer = false
})
}
}
}
视图文件需要导入 MessageUI,通过Sheet显示邮件页面。

注意事项
1、Message回调状态
View视图声明MFMailComposeResult类型的变量,这个变量用于存储邮件发送的结果。
@State private var mailResult: MFMailComposeResult?
public enum MFMailComposeResult : Int {
case cancelled // 用户取消
case saved // 用户保存草稿
case sent // 发送成功
case failed // 发送失败
}
用户在发送邮件或者取消后,会触发mailComposeController方法,并返回一个result:
func mailComposeController(_ controller: MFMailComposeViewController,
didFinishWith result: MFMailComposeResult,
error: Error?) {
parent.resultCallback?(result)
controller.dismiss(animated: true)
}
可以根据result显示邮件的对应状态。
2、显示崩溃的问题
Xcode预览或模拟器中,因为设备没有配置邮件账户或环境不支持邮件发送界面,可能导致预览崩溃。
MFMailComposeViewController的严格前提条件为:只有设备具备发送邮件能力时创建或显示,也就是说必须满足:
MFMailComposeViewController.canSendMail() == true
否则就会崩溃。
官方建议在使用前检查:
if MFMailComposeViewController.canSendMail() {
// 展示邮件界面
} else {
// 提示用户没配置邮箱
}
例如,SwiftUI视图为:
.sheet(isPresented: $showMailComposer) {
if MFMailComposeViewController.canSendMail() {
MailView()
} else {
VStack(spacing: 12) {
Image(systemName: "envelope.badge")
.font(.largeTitle)
.foregroundColor(.gray)
Text("无法发送邮件")
.font(.headline)
Text("请在系统“邮件”App中登录邮箱后再尝试。")
.font(.subheadline)
.multilineTextAlignment(.center)
.padding(.horizontal)
}
.padding()
}
}
总结
使用MessageUI可以在应用内发送邮件,不需要跳转到“邮件”应用。
但是在Xcode预览或者模拟器中,无法正常显示,因此需要添加显示条件。
如果想要添加更多的邮件内容,可以参考《SwiftUI通过邮件收集设备和App信息》。
如果不想要在应用中发现邮件,可以采用用简单的代码,跳转到“邮件”应用发送邮件。
相关文章
1、Swift实现发送邮件功能:https://fangjunyu.com/2024/10/19/swift%e5%ae%9e%e7%8e%b0%e5%8f%91%e9%80%81%e9%82%ae%e4%bb%b6%e5%8a%9f%e8%83%bd/
2、SwiftUI通过邮件收集设备和App信息:https://fangjunyu.com/2025/09/07/swiftui%e9%80%9a%e8%bf%87%e9%82%ae%e4%bb%b6%e6%94%b6%e9%9b%86%e8%ae%be%e5%a4%87%e5%92%8capp%e4%bf%a1%e6%81%af/
