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
Sending an email from swift 3
提问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)
}
}
回答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(...