web-dev-qa-db-ja.com

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(["[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.
    }
}

そのため、「メールサービスは利用できません」というメッセージが表示されます。これで、iCloudでシミュレーターデバイスにログインしました。なぜこれが機能しないのですか?何が間違っているのか、どうすれば前進できるのか教えてください。

45
H.N.

シミュレータでは動作しません。 iPhoneデバイスでテストしてください。参照できます Apple Developer Portal-MFMailComposeViewController

42

ここに私がそれをした方法があります。ドキュメントを非常によく読んでいるようです。他の人に役立つ場合に備えて、バリエーションを追加すると思いました。さらに、これは現在の(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(["[email protected]"])
    composeVC.setSubject("Message Subject")
    composeVC.setMessageBody("Message content.", isHTML: false)

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

}

次のmailComposeController関数について、ドキュメントは述べています

メール作成View Controllerは自動的に閉じられません。ユーザーがボタンをタップして電子メールを送信するか、インターフェイスをキャンセルすると、メール作成ビューコントローラーはそのデリゲートのmailComposeController(_:didFinishWith:error :)メソッドを呼び出します。このメソッドの実装では、リスト3に示すように、View Controllerを明示的に閉じる必要があります。このメソッドを使用して、操作の結果を確認することもできます。

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

32
Josh

アプリが実際のデバイスで実行されている場合、コードは良好であると思われ、正常に動作します

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

シミュレーターでテストすることはできません。UI、キャンセル/送信ボタンのクリック時の状況などの基本的なことをテストできます。

テストするには、デバイスを使用する必要があります。デバイスのメールアプリケーションは、いくつかのメールで構成する必要があります(例:[email protected])。

それが役に立てば幸いです。

8
Naresh Reddy M

メールの送信は簡単に終了します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(["[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:これを実際のデバイスでテストする必要があることを忘れないでください

2
swiftBoy

コードの問題は、

// View Controllerをモーダルで提示します。 self.present(composeVC、アニメーション:true、補完:nil)

それ自体で自分自身を提示;-)

現在のView Controllerがわからない場合は、RootViewControllerに表示するだけです。

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

0
Tintenklecks