Comment envoyer du courrier depuis une application iPhone

242

Je souhaite envoyer un e-mail depuis mon application iPhone. J'ai entendu dire que le SDK iOS n'a pas d'API de messagerie. Je ne veux pas utiliser le code suivant car il quittera mon application:

NSString *url = [NSString stringWithString: @"mailto:[email protected][email protected]&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!"];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

Alors, comment puis-je envoyer un e-mail depuis mon application?

Khushi
la source

Réponses:

430

Sur iOS 3.0 et versions ultérieures, vous devez utiliser la MFMailComposeViewControllerclasse et le MFMailComposeViewControllerDelegateprotocole qui sont cachés dans le cadre MessageUI.

Ajoutez d'abord le framework et importez:

#import <MessageUI/MFMailComposeViewController.h>

Ensuite, pour envoyer un message:

MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"My Subject"];
[controller setMessageBody:@"Hello there." isHTML:NO]; 
if (controller) [self presentModalViewController:controller animated:YES];
[controller release];

Ensuite, l'utilisateur fait le travail et vous obtenez le rappel du délégué à temps:

- (void)mailComposeController:(MFMailComposeViewController*)controller  
          didFinishWithResult:(MFMailComposeResult)result 
                        error:(NSError*)error;
{
  if (result == MFMailComposeResultSent) {
    NSLog(@"It's away!");
  }
  [self dismissModalViewControllerAnimated:YES];
}

N'oubliez pas de vérifier si l'appareil est configuré pour envoyer des e-mails:

if ([MFMailComposeViewController canSendMail]) {
  // Show the composer
} else {
  // Handle the error
}
PeyloW
la source
5
+1. Les cadres qui doivent être importés sont mentionnés ici ( mobileorchard.com/… ).
Dan Rosenstark
71
Pour vous sauver le saut, vous devez #import <MessageUI / MFMailComposeViewController.h>
TomH
22
Il suffit de noter que depuis cette réponse a été écrit les méthodes de UIViewController presentModalViewController:animated:et dismissModalViewControllerAnimated:ont été marquées comme dépréciée - au lieu des méthodes de remplacement à base de blocs presentViewController:animated:completion:et dismissViewControllerAnimated:completion:doit être utilisé.
2
Et n'oubliez pas de définir le délégué en .h @interface viewController : UIViewController <MFMailComposeViewControllerDelegate>
Nazir
18
Et dans IOS 6 [self presentModalViewController:controller animated:YES]; remplacer par [self presentViewController:controller animated:YES completion:nil]; et [self dismissModalViewControllerAnimated:YES]; remplacer par [self dismissViewControllerAnimated:YES completion:nil];
Nazir
61

MFMailComposeViewController est la voie à suivre après la sortie du logiciel iPhone OS 3.0. Vous pouvez consulter l' exemple de code ou le didacticiel que j'ai écrit .

Mugunth
la source
2
Post génial par Mugunth. Bravo mon pote!
Jordan
1
C'est vraiment génial. Merci. J'ai conçu une vue spécialement pour accepter l'e-mail et le sujet de l'utilisateur. en implémentant le même code, il affiche à nouveau une vue quelque peu similaire. puis-je invoquer la méthode déléguée à partir de mon événement de pression de bouton dans la classe de contrôleur de vue Merci pour votre aide, Shibin
smakstr
J'ai téléchargé le même exemple de code mais il n'envoie aucun courrier. Il indique uniquement que le courrier a été envoyé avec succès, mais aucun courrier n'est reçu. J'ai essayé d'ajouter le cadre MessageUI qui est apparu en rouge par défaut, mais l'application n'envoie toujours pas le courrier. Toute aide à cet égard sera très appréciée. Je teste l'application dans le simulateur.
Ravi Shankar
Impossible d'envoyer des e-mails depuis le simulateur.
malaki1974
20

J'aimerais ajouter quelques éléments ici:

  1. L'utilisation de l'URL mailto ne fonctionnera pas dans le simulateur car mail.app n'est pas installé sur le simulateur. Cela fonctionne cependant sur l'appareil.

  2. La longueur de l'URL mailto est limitée. Si l'URL est supérieure à 4096 caractères, mail.app ne se lancera pas.

  3. Il existe une nouvelle classe dans OS 3.0 qui vous permet d'envoyer un e-mail sans quitter votre application. Voir la classe MFMailComposeViewController.

Jeff Atwood
la source
13

Si vous souhaitez envoyer des e-mails à partir de votre application, le code ci-dessus est le seul moyen de le faire, sauf si vous codez votre propre client de messagerie (SMTP) dans votre application, ou si un serveur envoie le courrier pour vous.

Par exemple, vous pouvez coder votre application pour invoquer une URL sur votre serveur qui enverrait le courrier pour vous. Ensuite, vous appelez simplement l'URL à partir de votre code.

Notez qu'avec le code ci-dessus, vous ne pouvez rien joindre à l'e-mail, ce que la méthode client SMTP vous permettrait de faire, ainsi que la méthode côté serveur.

Genericrich
la source
12

Le code ci-dessous est utilisé dans mon application pour envoyer un e-mail avec une pièce jointe ici, les pièces jointes sont une image. Vous pouvez envoyer n'importe quel type de fichier .

ajoutez ceci à votre fichier .h

#import <MessageUI/MFMailComposeViewController.h>

Ajoutez MessageUI.framework à votre fichier de projet

NSArray *paths = SSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *getImagePath = [documentsDirectory stringByAppendingPathComponent:@"myGreenCard.png"];



MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"Green card application"];
[controller setMessageBody:@"Hi , <br/>  This is my new latest designed green card." isHTML:YES]; 
[controller addAttachmentData:[NSData dataWithContentsOfFile:getImagePath] mimeType:@"png" fileName:@"My Green Card"];
if (controller)
    [self presentModalViewController:controller animated:YES];
[controller release];

La méthode déléguée est indiquée ci-dessous

  -(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error;
{
    if (result == MFMailComposeResultSent) {
        NSLog(@"It's away!");
    }
    [self dismissModalViewControllerAnimated:YES];
}
Kannan Prasad
la source
11

C'est le code qui peut vous aider mais n'oubliez pas d'inclure le message framewark ui et d'inclure la méthode des délégués MFMailComposeViewControllerDelegate

-(void)EmailButtonACtion{

        if ([MFMailComposeViewController canSendMail])
        {
            MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
            controller.mailComposeDelegate = self;
            [controller.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigation_bg_iPhone.png"] forBarMetrics:UIBarMetricsDefault];
            controller.navigationBar.tintColor = [UIColor colorWithRed:51.0/255.0 green:51.0/255.0 blue:51.0/255.0 alpha:1.0];
            [controller setSubject:@""];
            [controller setMessageBody:@" " isHTML:YES];
            [controller setToRecipients:[NSArray arrayWithObjects:@"",nil]];
            UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
            UIImage *ui = resultimg.image;
            pasteboard.image = ui;
            NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(ui)];
            [controller addAttachmentData:imageData mimeType:@"image/png" fileName:@" "];
            [self presentViewController:controller animated:YES completion:NULL];
        }
        else{
            UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"alrt" message:nil delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil] ;
            [alert show];
        }

    }
    -(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
    {

        [MailAlert show];
        switch (result)
        {
            case MFMailComposeResultCancelled:
                MailAlert.message = @"Email Cancelled";
                break;
            case MFMailComposeResultSaved:
                MailAlert.message = @"Email Saved";
                break;
            case MFMailComposeResultSent:
                MailAlert.message = @"Email Sent";
                break;
            case MFMailComposeResultFailed:
                MailAlert.message = @"Email Failed";
                break;
            default:
                MailAlert.message = @"Email Not Sent";
                break;
        }
        [self dismissViewControllerAnimated:YES completion:NULL];
        [MailAlert show];
    }
mandé
la source
Merci beaucoup! Exemple très utile avec le corps HTML.
Resty le
4

Swift 2.2. Adapté de la réponse d' Esq

import Foundation
import MessageUI

class MailSender: NSObject, MFMailComposeViewControllerDelegate {

    let parentVC: UIViewController

    init(parentVC: UIViewController) {
        self.parentVC = parentVC
        super.init()
    }

    func send(title: String, messageBody: String, toRecipients: [String]) {
        if MFMailComposeViewController.canSendMail() {
            let mc: MFMailComposeViewController = MFMailComposeViewController()
            mc.mailComposeDelegate = self
            mc.setSubject(title)
            mc.setMessageBody(messageBody, isHTML: false)
            mc.setToRecipients(toRecipients)
            parentVC.presentViewController(mc, animated: true, completion: nil)
        } else {
            print("No email account found.")
        }
    }

    func mailComposeController(controller: MFMailComposeViewController,
        didFinishWithResult result: MFMailComposeResult, error: NSError?) {

            switch result.rawValue {
            case MFMailComposeResultCancelled.rawValue: print("Mail Cancelled")
            case MFMailComposeResultSaved.rawValue: print("Mail Saved")
            case MFMailComposeResultSent.rawValue: print("Mail Sent")
            case MFMailComposeResultFailed.rawValue: print("Mail Failed")
            default: break
            }

            parentVC.dismissViewControllerAnimated(false, completion: nil)
    }
}

Code client:

var ms: MailSender?

@IBAction func onSendPressed(sender: AnyObject) {
    ms = MailSender(parentVC: self)
    let title = "Title"
    let messageBody = "/programming/310946/how-can-i-send-mail-from-an-iphone-application this question."
    let toRecipents = ["[email protected]"]
    ms?.send(title, messageBody: messageBody, toRecipents: toRecipents)
}
Evdzhan Mustafa
la source
4

Pour envoyer un e-mail depuis l'application iPhone, vous devez effectuer la liste de tâches ci-dessous.

Étape 1: importer#import <MessageUI/MessageUI.h> dans votre classe de contrôleur où vous souhaitez envoyer un e-mail.

Étape 2: ajoutez le délégué à votre contrôleur comme indiqué ci-dessous

 @interface <yourControllerName> : UIViewController <MFMessageComposeViewControllerDelegate, MFMailComposeViewControllerDelegate>

Étape 3: Ajoutez la méthode ci-dessous pour envoyer un e-mail.

 - (void) sendEmail {
 // Check if your app support the email.
 if ([MFMailComposeViewController canSendMail]) {
    // Create an object of mail composer.
    MFMailComposeViewController *mailComposer =      [[MFMailComposeViewController alloc] init];
    // Add delegate to your self.
    mailComposer.mailComposeDelegate = self;
    // Add recipients to mail if you do not want to add default recipient then remove below line.
    [mailComposer setToRecipients:@[<add here your recipient objects>]];
    // Write email subject.
    [mailComposer setSubject:@“<Your Subject Here>”];
    // Set your email body and if body contains HTML then Pass “YES” in isHTML.
    [mailComposer setMessageBody:@“<Your Message Body>” isHTML:NO];
    // Show your mail composer.
    [self presentViewController:mailComposer animated:YES completion:NULL];
 }
 else {
 // Here you can show toast to user about not support to sending email.
}
}

Étape 4: implémenter MFMailComposeViewController Delegate

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(nullable NSError *)error {
[controller dismissViewControllerAnimated:TRUE completion:nil];


switch (result) {
   case MFMailComposeResultSaved: {
    // Add code on save mail to draft.
    break;
}
case MFMailComposeResultSent: {
    // Add code on sent a mail.
    break;
}
case MFMailComposeResultCancelled: {
    // Add code on cancel a mail.
    break;
}
case MFMailComposeResultFailed: {
    // Add code on failed to send a mail.
    break;
}
default:
    break;
}
}
Patrick R
la source
cette réponse fournit-elle de nouvelles informations qui ne figurent pas déjà dans l'une des réponses existantes?
Florian Koch
2

Swift 2.0

func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?){
    if let error = error{
        print("Error: \(error)")
    }else{
        //NO Error
        //------------------------------------------------
        var feedbackMsg = ""

        switch result.rawValue {
        case MFMailComposeResultCancelled.rawValue:
            feedbackMsg = "Mail Cancelled"
        case MFMailComposeResultSaved.rawValue:
            feedbackMsg = "Mail Saved"
        case MFMailComposeResultSent.rawValue:
            feedbackMsg = "Mail Sent"
        case MFMailComposeResultFailed.rawValue:
            feedbackMsg = "Mail Failed"
        default:
            feedbackMsg = ""
        }

        print("Mail: \(feedbackMsg)")

        //------------------------------------------------
    }
}
brian.clear
la source
1

Voici une version Swift:

import MessageUI

class YourVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        if MFMailComposeViewController.canSendMail() {
            var emailTitle = "Vea Software Feedback"
            var messageBody = "Vea Software! :) "
            var toRecipents = ["[email protected]"]
            var mc:MFMailComposeViewController = MFMailComposeViewController()
            mc.mailComposeDelegate = self
            mc.setSubject(emailTitle)
            mc.setMessageBody(messageBody, isHTML: false)
            mc.setToRecipients(toRecipents)
            self.presentViewController(mc, animated: true, completion: nil)
        } else {
            println("No email account found")
        }
    }
}

extension YourVC: MFMailComposeViewControllerDelegate {
    func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) {
        switch result.value {
        case MFMailComposeResultCancelled.value:
            println("Mail Cancelled")
        case MFMailComposeResultSaved.value:
            println("Mail Saved")
        case MFMailComposeResultSent.value:
            println("Mail Sent")
        case MFMailComposeResultFailed.value:
            println("Mail Failed")
        default:
            break
        }
        self.dismissViewControllerAnimated(false, completion: nil)
    }
}

La source

Esqarrouth
la source