iOS-从Swift 3发送电子邮件

我正在尝试使用“发送电子邮件”选项设置一个应用程序。

我有以下代码:

import Foundation
import MessageUI
import UIKit

class emailClass: UIViewController, MFMailComposeViewControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()

        if !MFMailComposeViewController.canSendMail() {
            print("Mail services are not available")
            return
        }        
        sendEmail() 
    }

    func sendEmail() {      
        let composeVC = MFMailComposeViewController()
        composeVC.mailComposeDelegate = self
        // Configure the fields of the interface.
        composeVC.setToRecipients(["address@example.com"])
        composeVC.setSubject("Hello!")
        composeVC.setMessageBody("Hello this is my message body!", isHTML: false)
        // Present the view controller modally.
        self.present(composeVC, animated: true, completion: nil)
    }

    func mailComposeController(controller: MFMailComposeViewController,
                           didFinishWithResult result: MFMailComposeResult, error: NSError?) {
        // Check the result or perform other tasks.
        // Dismiss the mail compose view controller.
        controller.dismiss(animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

因此,我收到以下消息:“邮件服务不可用”。现在,我已经在iCloud中登录了模拟器设备...所以我认为应该这样做,但事实并非如此。 为什么这不起作用? 您能告诉我出什么问题了,我该如何前进?

H.N. asked 2020-07-11T20:54:20Z
5个解决方案
43 votes

它不适用于模拟器。 请在iPhone设备上进行测试。 您可以参考Apple Developer Portal-MFMailComposeViewController

Sandeep-Systematix answered 2020-07-11T20:54:37Z
32 votes

这是我的方法。 看来您很好地遵循了文档,我想我会添加一些变体,以防它对其他人有所帮助。 此外,这已更新为当前(2017年8月)语法。

符合MFMailComposeViewControllerDelegate协议,并检查设备是否可以发送邮件。

import Foundation
import UIKit
import MessageUI

class WelcomeViewController: UIViewController, MFMailComposeViewControllerDelegate {


override func viewDidLoad() {
    super.viewDidLoad()

    if !MFMailComposeViewController.canSendMail() {
        print("Mail services are not available")
        return
    }
}

我的应用程序使用IBAction来启动邮件撰写。

@IBAction func sendFeedbackButtonTapped(_ sender: Any) {

    let composeVC = MFMailComposeViewController()
    composeVC.mailComposeDelegate = self

    // Configure the fields of the interface.
    composeVC.setToRecipients(["exampleEmail@email.com"])
    composeVC.setSubject("Message Subject")
    composeVC.setMessageBody("Message content.", isHTML: false)

    // Present the view controller modally.
    self.present(composeVC, animated: true, completion: nil)

}

关于以下mailComposeController函数,文档说

邮件撰写视图控制器不会自动关闭。 当用户点击按钮发送电子邮件或取消界面时,邮件撰写视图控制器将调用 mailComposeController(_:didFinishWith:error :) 其委托的方法。 您对该方法的实现必须显式关闭视图控制器,如清单3所示。您还可以使用此方法检查操作结果。

func mailComposeController(_ controller: MFMailComposeViewController,
                           didFinishWith result: MFMailComposeResult, error: Error?) {
    // Check the result or perform other tasks.

    // Dismiss the mail compose view controller.
    controller.dismiss(animated: true, completion: nil)
   }
}

来源Apple文档:MFMailComposeViewController

Josh answered 2020-07-11T20:55:20Z
8 votes

如果应用程序在真实设备中运行,代码似乎很好并且可以正常工作

MFMailComposeViewController.canSendMail() // returns false for simulators.

您无法在模拟器上对其进行测试,您将能够测试诸如UI之类的基本内容,单击“取消/发送”按钮时这些内容如何发生。

要测试,您必须使用设备,该设备中的Mail应用程序应配置一些邮件(例如:abc@xyz.com)。

希望有帮助。

Naresh Reddy M answered 2020-07-11T20:55:53Z
2 votes

在Swift 5中,发送电子邮件非常容易,您需要确认并实现MFMailComposeViewControllerDelegate并检查我们是否可以在此设备上发送电子邮件

这是我用于执行任务的一小段代码

import UIKit
import MessageUI

class ViewController: UIViewController, MFMailComposeViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    //MARK: IBAction Method for Button click
    @IBAction func sendEmail(_ sender: Any) {
        //TODO:  You should chack if we can send email or not
        if MFMailComposeViewController.canSendMail() {
            let mail = MFMailComposeViewController()
            mail.mailComposeDelegate = self
            mail.setToRecipients(["you@yoursite.com"])
            mail.setSubject("Email Subject Here")
            mail.setMessageBody("<p>You're so awesome!</p>", isHTML: true)
            present(mail, animated: true)
        } else {
            print("Application is not able to send an email")
        }
    }

    //MARK: MFMail Compose ViewController Delegate method
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        controller.dismiss(animated: true)
    }
}

PS:请不要忘记您需要在真实设备上进行测试

swiftBoy answered 2020-07-11T20:56:22Z
0 votes

您的代码的问题是

//以模态呈现视图控制器。 self.present(composeVC,动画:true,完成:无)

本身呈现;-)

如果您不知道当前的视图控制器,只需将其显示在RootViewController上,即

UiApplication.shared.cainwindo?.Rootviewcontroller ?.目前(...

Tintenklecks answered 2020-07-11T20:56:59Z
translate from https://stackoverflow.com:/questions/40887721/sending-an-email-from-swift-3