SwiftUI使用MessageUI框架发送邮件
SwiftUI使用MessageUI框架发送邮件

SwiftUI使用MessageUI框架发送邮件

给我的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/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注