Подтвердить что ты не робот

Отправка сообщения электронной почты от быстрого 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... Поэтому я думаю, что он должен это делать, но это не так. Почему это не работает? Можете ли вы сказать мне, что случилось, и как я могу двигаться вперед?

4b9b3361

Ответ 2

Вот как я это сделал. Похоже, вы очень внимательно следили за документацией, я подумал, что добавлю свой вариант на случай, если он кому-нибудь поможет. Кроме того, он немного обновлен до текущего (август 2017 года) синтаксиса.

Соответствуйте протоколу 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 говорится в документации

Контроллер представления почтовых сообщений не удаляется автоматически. Когда пользователь нажимает кнопки для отправки электронного письма или отмены интерфейса, контроллер представления почтового сообщения вызывает метод 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)
   }
}

Источник Apple Документация: MFMailComposeViewController

Ответ 3

Код кажется хорошим и отлично работает, если приложение работает в реальном устройстве

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

Вы не можете протестировать его на симуляторе, вы сможете протестировать основные вещи, такие как пользовательский интерфейс, как все происходит на нажатиях кнопки "Отмена/отправка".

Чтобы проверить, вам нужно использовать устройство, приложение Mail в устройстве должно быть настроено с помощью некоторой почты (например: [email protected]).

Надеюсь, что это поможет.

Ответ 4

Проблема с вашим кодом заключается в том, что

//Показывать контроллер вида.         self.present(composeVC, анимированный: true, завершение: ноль)

сам по себе представляет: -)

Если вы не знаете текущий контроллер, просто покажите его на RootViewController, т.е.

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

Ответ 5

В 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: пожалуйста, не забудьте, что вам нужно проверить это на реальном устройстве