如何从我的iOS应用程序发送邮件 - SWIFT

14

我想从我的应用程序发送邮件。我正在学习SWIFT的基础知识,但是遇到了问题。我希望按下一个按钮就可以打开邮件。你能告诉我如何进行按钮连接吗?我认为这应该是一个操作,但我不知道在代码中放哪里。

import UIKit
import MessageUI

class ViewController: UIViewController, MFMailComposeViewControllerDelegate {

    func sendEmail() {
        let mailVC = MFMailComposeViewController()
        mailVC.mailComposeDelegate = self
        mailVC.setToRecipients([])
        mailVC.setSubject("Subject for email")
        mailVC.setMessageBody("Email message string", isHTML: false)

        presentViewController(mailVC, animated: true, completion: nil)
    }

    // MARK: - Email Delegate 

    func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
        controller.dismissViewControllerAnimated(true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }
}
5个回答

17

首先导入库:

import MessageUI

设置代理如下:

MFMailComposeViewControllerDelegate

写出漂亮的代码:
 @IBAction func buttonHandlerSendEmail(_ sender: Any) {

  let mailComposeViewController = configureMailComposer()
    if MFMailComposeViewController.canSendMail(){
        self.present(mailComposeViewController, animated: true, completion: nil)
    }else{
        print("Can't send email")
    }
}
func configureMailComposer() -> MFMailComposeViewController{
    let mailComposeVC = MFMailComposeViewController()
    mailComposeVC.mailComposeDelegate = self
    mailComposeVC.setToRecipients([self.textFieldTo.text!])
    mailComposeVC.setSubject(self.textFieldSubject.text!)
    mailComposeVC.setMessageBody(self.textViewBody.text!, isHTML: false)
    return mailComposeVC
}

还需要编写类似以下的委托方法:
//MARK: - MFMail compose method
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
    controller.dismiss(animated: true, completion: nil)
}

在此输入图片描述

100%可行并已测试


13

sendEmail函数更改如下:

@IBAction func sendEmail(sender: AnyObject) {
    let mailVC = MFMailComposeViewController()
    mailVC.mailComposeDelegate = self
    mailVC.setToRecipients([])
    mailVC.setSubject("Subject for email")
    mailVC.setMessageBody("Email message string", isHTML: false)

    presentViewController(mailVC, animated: true, completion: nil)
}

并在界面构建器中将您的按钮连接到此操作


我需要删除func sndEmail()吗? - jonathan
@Jonathan,只需要更改func sendEmail() {这一行即可。 - gvuksic
抱歉问一个愚蠢的问题,但当它处于那种状态时... 它仍然无法工作。 - jonathan
@IBAction func email(sender: AnyObject) {//func email() { let mailVC = MFMailComposeViewController() mailVC.mailComposeDelegate = self mailVC.setToRecipients([]) mailVC.setSubject("电子邮件主题") mailVC.setMessageBody("电子邮件正文字符串", isHTML: false) presentViewController(mailVC, animated: true, completion: nil) } - jonathan
@jonathan 很高兴听到这个消息,随意接受答案。 - gvuksic

10

Swift 3

let composer = MFMailComposeViewController()

if MFMailComposeViewController.canSendMail() {
     composer.mailComposeDelegate = self
     composer.setToRecipients(["Email1", "Email2"])
     composer.setSubject("Test Mail")
     composer.setMessageBody("Text Body", isHTML: false)
     present(composer, animated: true, completion: nil)
}

委托方法

class SendMailViewController: MFMailComposeViewControllerDelegate {
   func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        dismiss(animated: true, completion: nil)
    }
}

7

发送邮件通常使用MFMailComposer。它无法在iOS模拟器上工作,因此可以在设备上测试。

要测试邮件服务是否可用,请使用以下函数:

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

要发送邮件,请在函数或按钮操作中使用以下代码。

let composeVC = MFMailComposeViewController()
composeVC.mailComposeDelegate = self

// Configure the fields of the interface.
composeVC.setToRecipients(["email_address@example.com"])
composeVC.setSubject("Hello World!")
composeVC.setMessageBody("Hello from iOS!", isHTML: false)

// Present the view controller modally.
self.presentViewController(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.dismissViewControllerAnimated(true, completion: nil)
}

感谢您的回答。那么如何启用邮件服务? - Anton Platonov

1

对于Anton Platonov,您需要在源文件的开头添加import MessageUI,并且在声明视图控制器的类时添加协议:class FirstVC:UIViewController,MFMailComposeViewControllerDelegate{


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接