ios 从 swift 3 发送电子邮件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/40887721/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 10:52:58  来源:igfitidea点击:

Sending an email from swift 3

iosswiftiphoneswift3messageui

提问by H.N.

I am trying to set up an app with send email option.

我正在尝试设置一个带有发送电子邮件选项的应用程序。

I have this code:

我有这个代码:

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(["[email protected]"])
        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.
    }
}

So I get this message: "Mail services are not available". Now I've logged in the simulator device in iCloud... So i think it should do it but it's not. Why isn't this working? Can you tell me whats wrong and how can I move forward?

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

采纳答案by Sandeep-Systematix

It will not work with simulator. Please test it on iPhone device. You can refer Apple Developer Portal - MFMailComposeViewController

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

回答by Josh

Here's how I did it. It looks like you followed the documentation very well, I thought I'd add my variation in case it helps someone else. Plus, this is a little more updated to current (Aug 2017) syntax.

这是我如何做到的。看起来您很好地遵循了文档,我想我会添加我的变体,以防它对其他人有帮助。另外,这是对当前(2017 年 8 月)语法的更新。

Conform to the MFMailComposeViewControllerDelegate protocol, and check if the device can send mail.

符合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
    }
}

My app uses an IBAction to initiate the mail composition.

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

@IBAction func sendFeedbackButtonTapped(_ sender: Any) {

    let composeVC = MFMailComposeViewController()
    composeVC.mailComposeDelegate = self

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

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

}

About the following mailComposeController function, the documentation says

关于以下 mailComposeController 函数,文档说

The mail compose view controller is not dismissed automatically. When the user taps the buttons to send the email or cancel the interface, the mail compose view controller calls the mailComposeController(_:didFinishWith:error:) method of its delegate. Your implementation of that method must dismiss the view controller explicitly, as shown in Listing 3. You can also use this method to check the result of the operation.

邮件撰写视图控制器不会自动关闭。当用户点击按钮发送电子邮件或取消界面时,邮件撰写视图控制器调用其委托的 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)
   }
}

Source Apple Documentation: MFMailComposeViewController

Apple 文档:MFMailComposeViewController

回答by Naresh Reddy M

Code seems to be good and works fine if the app is running in a real device

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

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

You can't test it on simulator,You'll be able to test basic things like UI,How the things are happening on Cancel/Send button clicks.

你不能在模拟器上测试它,你将能够测试基本的东西,比如 UI,在取消/发送按钮点击时事情是如何发生的。

To test,You have to use a device,The Mail application in the device should be configured with some mail(ex: [email protected]).

要测试,您必须使用设备,设备中的邮件应用程序应该配置一些邮件(例如:[email protected])。

Hope that helps.

希望有帮助。

回答by swiftBoy

Sending an Email is quit easy in Swift 5you need to confirm and implement MFMailComposeViewControllerDelegate and check if we can send email on this device

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

Here is the tiny piece of code I was using for my task

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

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(["[email protected]"])
            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: Please don't forget you need to test this on real device

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

回答by Tintenklecks

The problem with your code is, that the

你的代码的问题是,

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

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

presents itself in itself ;-)

呈现自己;-)

If you don′t know the current view controller, just display it on the RootViewController, i.e.

如果你不知道当前的视图控制器,直接在RootViewController上显示即可,即

UIApplication.shared.keyWindow?.rootViewController?.present(...

UIApplication.shared.keyWindow?.rootViewController?.present(...