2008-11-22 15 views
242

Deseo enviar un correo electrónico desde mi aplicación de iPhone. He oído que el iOS SDK no tiene una API de correo electrónico. No quiero utilizar el siguiente código porque va a salir de mi solicitud:¿Cómo puedo enviar correos desde una aplicación de iPhone?

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

Entonces, ¿cómo puedo enviar un correo electrónico de mi aplicación?

Respuesta

13

Si desea enviar un correo electrónico desde su aplicación, el código anterior es la única forma de hacerlo a menos que codifique su propio cliente de correo (SMTP) dentro de su aplicación o haga que un servidor envíe el correo por usted.

Por ejemplo, puede codificar su aplicación para invocar una URL en su servidor que le envíe el correo. Luego simplemente llama a la URL desde tu código.

Tenga en cuenta que con el código anterior no puede adjuntar nada al correo electrónico, que el método del cliente SMTP le permite hacer, así como el método del lado del servidor.

19

Un par de cosas que me gustaría añadir aquí:

  1. Utilizando la URL mailto no funciona en el simulador como mail.app no ​​está instalado en el simulador. Sin embargo, funciona en el dispositivo.

  2. Hay un límite en la longitud de la URL de mailto. Si la URL tiene más de 4096 caracteres, mail.app no ​​se abrirá.

  3. Hay una nueva clase en OS 3.0 que le permite enviar un correo electrónico sin salir de su aplicación. Vea la clase MFMailComposeViewController.

61

MFMailComposeViewController es el camino a seguir después del lanzamiento del software de iPhone OS 3.0. Puede mirar el sample code o el tutorial I wrote.

+2

Awesome post by Mugunth. ¡Buen amigo! – Jordan

+1

Es realmente increíble. Gracias. Diseñé una vista especialmente para aceptar el correo electrónico y el tema del usuario. al implementar el mismo código, vuelve a mostrar una vista algo similar. puedo invocar el método de delegado desde mi evento de presionar un botón en la clase de controlador de vista Gracias por su ayuda, Shibin – smakstr

+0

He descargado el mismo código de muestra pero no he enviado ningún correo. Solo solicita que el correo se envíe correctamente pero no se reciba correo. He intentado agregar el marco de MessageUI que apareció de color rojo por defecto, pero aún así la aplicación no está enviando el correo. Cualquier ayuda en este sentido será muy apreciada. Estoy probando la aplicación en el simulador. –

431

En iOS 3.0 y posterior se debe utilizar la clase MFMailComposeViewController, y el protocolo MFMailComposeViewControllerDelegate, que está escondido en el marco MessageUI.

En primer lugar tiene que añadir framework e importación:

#import <MessageUI/MFMailComposeViewController.h> 

Entonces, para enviar un mensaje:

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]; 

continuación, el usuario hace el trabajo y se obtiene la devolución de llamada delegado en el tiempo:

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

Recuerde verificar si el dispositivo está configurado para enviar correos electrónicos:

if ([MFMailComposeViewController canSendMail]) { 
    // Show the composer 
} else { 
    // Handle the error 
} 
+5

+1. Los marcos que necesitan importar se mencionan aquí (http://www.mobileorchard.com/new-in-iphone-30-tutorial-series-part-2-in-app-email-messageui/). –

+71

Para salvarte el salto, necesitas # import TomH

+24

Y MessageUI framework – Lope

12

A continuación se utiliza el código en mi aplicación para enviar correo electrónico con un archivo adjunto aquí los archivos adjuntos es una imagen Usted puede enviar cualquier tipo de archivo es único a tener en cuenta es que había que especificar la correcta '' mimeType

añadir esto a su archivo .h

#import <MessageUI/MFMailComposeViewController.h> 

Añadir MessageUI.marco al archivo de proyecto

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]; 

método delegado es como se muestra a continuación

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

Este es el código que puede ayudar u, pero no se olvide de incluir framewark mensaje de interfaz de usuario y la inclusión del método delegados 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]; 
    } 
+0

¡Muchas gracias! Ejemplo muy útil con cuerpo HTML. – Resty

+0

Sea bienvenido – mandeep

1

Heres a Swift versión:

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

Source

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

     //------------------------------------------------ 
    } 
} 
2

Swift 2.2. Adaptado de Esq's answer

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

El código de cliente:

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

Para enviar un correo electrónico de la aplicación iPhone que tiene que hacer a continuación la lista de tareas.

Paso 1: Importación #import <MessageUI/MessageUI.h> En la clase de controlador en la que desea enviar un correo electrónico.

Paso 2: Añadir el delegado a su controlador, como se muestra a continuación

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

Paso 3: Añadir a continuación el método para enviar correo electrónico.

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

Paso 4: Aplicar MFMailComposeViewController Delegado

- (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; 
} 
} 
+0

¿esta respuesta proporciona alguna información nueva que no esté incluida en una de las respuestas existentes? –

0

me escribió una envoltura simple llamado KRNSendEmail que simplifican el envío de correo electrónico a una llamada al método.

El KRNSendEmail está bien documentado y agregado a CocoaPods.

https://github.com/ulian-onua/KRNSendEmail

Cuestiones relacionadas