52 votes

Envoi d'un e-mail à partir de swift 3

J'essaie de mettre en place une application avec une option d'envoi d'email.

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(["address@example.com"])
        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". Je me suis connecté au simulateur dans iCloud... Donc je pense que ça devrait le faire mais ce n'est pas le cas. Pourquoi cela ne fonctionne-t-il pas ? Pouvez-vous me dire ce qui ne va pas et comment je peux avancer ?

0 votes

Avez-vous configuré votre appareil avec une adresse e-mail ? Si non, faites-le... et cela pourrait résoudre votre problème.

0 votes

J'utilise le simulateur. Comment puis-je configurer l'appareil avec une adresse e-mail ? Lorsque je vais dans les paramètres, je ne vois pas d'option "e-mail" .....

0 votes

Je pense que vous avez résolu ce problème... En attendant, voici le lien pour configurer un email pour un appareil iOS ... support.apple.com/fr/HT201320

46voto

Sandeep-Systematix Points 1061

Il ne fonctionnera pas avec le simulateur. Veuillez le tester sur un appareil iPhone. Vous pouvez consulter Portail Apple Developer - MFMailComposeViewController

0 votes

Oui. Je suis sûr à 100%. Je travaille sur le même type d'application et j'ai trouvé ceci.

0 votes

Ok merci :) mais le code que j'ai écrit ci-dessus. Est-il correct ?

0 votes

Oui. Le code semble correct et devrait fonctionner. Vous n'aviez pas d'iPhone ?

38voto

Josh Points 296

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

Conforme au protocole MFMailComposeViewControllerDelegate, et vérifie 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 une 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(["exampleEmail@email.com"])
    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 que

Le contrôleur de vue de composition de courrier n'est pas rejeté automatiquement. Lorsque l'utilisateur appuie sur les boutons pour envoyer l'e-mail ou annuler l'interface, le contrôleur de vue de composition d'e-mails appelle la commande mailComposeController(_:didFinishWith:error :) de son délégué. Votre implémentation de cette méthode doit rejeter le contrôleur de vue de manière explicite, comme indiqué dans le Listing 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

1 votes

Pour souligner quelque chose qui va casser les choses : dans les anciennes versions, le type de l'objet error: dans le ...didFinishWith result:... L'en en-tête était NSError? . Dans les nouvelles versions, il s'agit simplement de Error? . Si vous n'avez pas le EXACT même en-tête comme prévu, votre délégué ne fonctionnera pas tout à fait -- la partie du code qui ferme le View Controller ne s'exécutera pas, et le courrier restera au-dessus de votre autre vue. Il m'a fallu beaucoup trop de temps pour comprendre cette différence subtile ; j'espère que cela aidera quelqu'un.

9voto

Naresh Reddy M Points 759

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 un simulateur, mais vous serez en mesure de tester des éléments de base comme l'interface utilisateur, comment les choses se passent lors des clics sur les boutons Annuler/Envoyer.

Pour tester, vous devez utiliser un appareil, l'application de messagerie dans l'appareil doit être configurée avec un certain courrier (ex : abc@xyz.com).

J'espère que cela vous aidera.

9voto

RDC Points 9222

L'envoi d'un courriel est très facile dans Swift 5 vous devez confirmer et mettre en œuvre le MFMailComposeViewControllerDelegate et vérifier si nous pouvons envoyer des e-mails sur ce dispositif.

Voici le petit bout 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(["you@yoursite.com"])
            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.

1voto

Ingo Böhme Points 286

Le problème avec votre code est que le

// Présenter le contrôleur de vue de manière modale. self.present(composeVC, animated : true, completion : nil)

se présente en soi ;-)

Si vous ne connaissez pas le contrôleur de vue actuel, il suffit de l'afficher sur le RootViewController, c'est-à-dire

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X