Je veux envoyer un email à partir de mon application iPhone. J'ai entendu dire que le SDK iOS ne dispose pas d'une API de messagerie. Je ne veux pas utiliser le code suivant car il va quitter 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 email depuis mon application?
Sur iOS 3.0 et versions ultérieures, vous devez utiliser la classe MFMailComposeViewController
et le protocole MFMailComposeViewControllerDelegate
, qui est caché dans le cadre de 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 l'envoi d'e-mails:
if ([MFMailComposeViewController canSendMail]) {
// Show the composer
} else {
// Handle the error
}
MFMailComposeViewController est la voie à suivre après la publication du logiciel iPhone OS 3.0. Vous pouvez regarder le exemple de code ou le tutoriel que j'ai écrit .
Quelques choses que j'aimerais ajouter ici:
L'utilisation de l'URL mailto ne fonctionnera pas dans le simulateur, car mail.app n'est pas installé sur le simulateur. Cela fonctionne sur l'appareil cependant.
La longueur de l'URL mailto est limitée. Si l'URL est supérieure à 4096 caractères, mail.app ne se lancera pas.
OS 3.0 est une nouvelle classe qui vous permet d’envoyer un courrier électronique sans quitter votre application. Voir la classe MFMailComposeViewController.
Si vous souhaitez envoyer un courrier électronique à 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 demandez à un serveur de vous envoyer le courrier.
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 au courrier électronique, ce que la méthode client SMTP vous permettrait, ainsi que la méthode côté serveur.
Le code ci-dessous est utilisé dans mon application pour envoyer un e-mail avec une pièce jointe. Ici, la pièce jointe est une image. Vous pouvez envoyer tout type de fichier. N'oubliez pas que vous devez spécifier le bon 'mimeType'
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 illustrée ci-dessous
-(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error;
{
if (result == MFMailComposeResultSent) {
NSLog(@"It's away!");
}
[self dismissModalViewControllerAnimated:YES];
}
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];
}
Pour envoyer un email depuis une application iPhone, vous devez faire la liste de tâches ci-dessous.
Étape 1: Importation #import <MessageUI/MessageUI.h>
Dans la classe de votre contrôleur où vous souhaitez envoyer un courrier électronique.
É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 courrier électronique.
- (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 le délégué MFMailComposeViewController
- (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;
}
}
Swift 2.2. Adapté de 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 = "https://stackoverflow.com/questions/310946/how-can-i-send-mail-from-an-iphone-application this question."
let toRecipents = ["[email protected]"]
ms?.send(title, messageBody: messageBody, toRecipents: toRecipents)
}
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)")
//------------------------------------------------
}
}
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)
}
}
J'ai écrit un simple wrapper appelé KRNSendEmail qui simplifie l'envoi de courrier électronique à un seul appel de méthode.
Le KRNSendEmail est bien documenté et ajouté à CocoaPods.
https://github.com/ulian-onua/KRNSendEmail