web-dev-qa-db-fra.com

Envoi d'un email de Swift 3

J'essaie de configurer une application avec l'option d'envoi par courrier électronique.

J'ai ce 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.
    }
}

Je reçois donc ce message: "Les services de messagerie ne sont pas disponibles". Maintenant, je me suis connecté au simulateur dans iCloud ... Donc, je pense qu'il devrait le faire mais ce n'est pas le cas. Pourquoi ça ne marche pas? Pouvez-vous me dire ce qui ne va pas et comment puis-je aller de l'avant?

45
H.N.

Cela ne fonctionnera pas avec le simulateur. Veuillez le tester sur un iPhone. Vous pouvez vous référer à portail de développement Apple - MFMailComposeViewController

42
Sandeep-Systematix

Voici comment je l'ai fait. Il semble que vous ayez très bien suivi la documentation. J'ai pensé ajouter ma variante au cas où cela aiderait quelqu'un d'autre. De plus, c'est un peu plus mis à jour à la syntaxe actuelle (août 2017).

Conformez-vous au protocole MFMailComposeViewControllerDelegate et vérifiez si le périphérique peut envoyer du courrier.

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

Mon application utilise IBAction pour lancer la composition du courrier.

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

}

À propos de la fonction mailComposeController suivante, la documentation indique

Le contrôleur de vue de composition de courrier n'est pas automatiquement rejeté. Lorsque l'utilisateur appuie sur les boutons pour envoyer le courrier électronique ou annuler l'interface, le contrôleur de vue de composition du courrier appelle la méthode mailComposeController (_: didFinishWith: error :) de son délégué. Votre implémentation de cette méthode doit exclure explicitement le contrôleur de vue, comme indiqué dans la liste 3. Vous pouvez également utiliser cette méthode pour vérifier le résultat de l'opération.

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

Source Documentation Apple: MFMailComposeViewController

32
Josh

Le code semble être bon et fonctionne bien si l'application est exécutée dans un appareil réel

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

Vous ne pouvez pas le tester sur simulateur, vous pourrez tester des éléments de base tels que l'interface utilisateur, comment les choses se passent lors des clics du bouton Annuler/Envoyer.

Pour tester, vous devez utiliser un périphérique. L'application Mail du périphérique doit être configurée avec certains messages (ex: [email protected]).

J'espère que ça t'as aidé.

8
Naresh Reddy M

L'envoi d'un courrier électronique est facile dans Swift 5 vous devez confirmer et mettre en œuvre MFMailComposeViewControllerDelegate et vérifier si nous pouvons envoyer un courrier électronique sur cet appareil

Voici le petit morceau de code que j'utilisais pour ma tâche

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: N'oubliez pas que vous devez tester ceci sur un appareil réel.

2
swiftBoy

Le problème avec votre code est que le

// Présente le contrôleur de vue de manière modale. self.present (composeVC, animé: vrai, achèvement: nul)

se présente en soi ;-)

Si vous ne connaissez pas le contrôleur de vue actuel, affichez-le simplement sur le RootViewController, c.-à-d.

UIApplication.shared.keyWindow? .RootViewController? .Present (...

0
Tintenklecks