web-dev-qa-db-ja.com

iOSアプリケーションからメールを送信する方法-SWIFT

アプリケーションからメールを送信したい。 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()

    }
}
14
jonathan

最初にライブラリをインポート:

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)
}

enter image description here

100%動作してテスト済み

16

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)
}

interface Builderでボタンをこのアクションに接続します

13
gvuksic

Swift

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)
    }
}
9
Jaydeep

メールを送信するには、通常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 protected]"])
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)
}
7
iAnkit

anton Platonovに追加:ソースファイルの要求時にMessageUIをインポートし、View Controllerのクラスを宣言するときにプロトコルを追加:class FirstVC:UIViewController、MFMailComposeViewControllerDelegate {

1
Stalker