2011-02-01 11 views
37

¿Cómo envío un correo electrónico dentro de una aplicación sin salir de la aplicación?Objetivo C: enviar correo electrónico sin salir de la aplicación

Esto funciona:

-(void) sendEmailTo:(NSString *)to withSubject:(NSString *)subject withBody:(NSString *)body { 
NSString *mailString = [NSString stringWithFormat:@"mailto:?to=%@&subject=%@&body=%@", 
         [to stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding], 
         [subject stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding], 
         [body stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]; 
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailString]]; 
} 

sino que va a la aplicación de correo para enviar. ¿Hay alguna manera de hacer esto sin salir de la aplicación?

+0

Usted puede encontrar [esto] (http: // www. iphonedevsdk.com/forum/tutorial-discussion/43633-quick-tutorial-how-add-mfmailcomposeviewcontroller.html) tutorial útil. – Vin

+0

Encontré [este] (http://www.codingexplorer.com/mfmailcomposeviewcontroller-send-email-in-your-apps/) tutorial mejor http://www.codingexplorer.com/mfmailcomposeviewcontroller-send-email-in- your-apps/ – andi

Respuesta

48

Sí. Use el MFMailComposeViewController.

// From within your active view controller 
if([MFMailComposeViewController canSendMail]) { 
    MFMailComposeViewController *mailCont = [[MFMailComposeViewController alloc] init]; 
    mailCont.mailComposeDelegate = self; 

    [mailCont setSubject:@"yo!"]; 
    [mailCont setToRecipients:[NSArray arrayWithObject:@"[email protected]"]]; 
    [mailCont setMessageBody:@"Don't ever want to give you up" isHTML:NO]; 

    [self presentModalViewController:mailCont animated:YES]; 
    [mailCont release]; 
} 


// Then implement the delegate method 
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { 
    [self dismissModalViewControllerAnimated:YES]; 
} 
+0

Este tipo de funcionó, pero no va a exigir la pantalla de correo cuando se hace – Chris

+0

También debe implementar el método de delegado, que agregué. – kubi

+0

Esa segunda parte también está en el archivo de implementación, ¿correcto? Porque todavía se bloquea cuando presiono cancelar o enviar en la pantalla de correo electrónico – Chris

12

Actualización para iOS 6. Tenga en cuenta que esta utiliza ARC y no utiliza la vista modal presentación en desuso:

#import <MessageUI/MessageUI.h> 
#import <MessageUI/MFMailComposeViewController.h> 
@interface MyViewController : UIViewController<MFMailComposeViewControllerDelegate> 

y luego el código de presentar la pantalla de correo electrónico:

- (IBAction)emailButtonPushed:(id)sender { 

    if([MFMailComposeViewController canSendMail]) { 
     MFMailComposeViewController *mailCont = [[MFMailComposeViewController alloc] init]; 
     mailCont.mailComposeDelegate = self; 
     [mailCont setSubject:@"Your email"]; 
     [mailCont setMessageBody:[@"Your body for this message is " stringByAppendingString:@" this is awesome"] isHTML:NO]; 
     [self presentViewController:mailCont animated:YES completion:nil]; 
    } 

} 

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { 
    //handle any error 
    [controller dismissViewControllerAnimated:YES completion:nil]; 
} 
25
  1. Agregar MessageUI marco:

    • Haga clic en el proyecto
    • Seleccione "Build Phases"
    • Ampliar "Enlace binario con Bibliotecas"
    • Haga clic en "+" y tipo "mensaje" para encontrar "MessageUI" marco, a continuación, añadir.
  2. En vista controlador actuales se agregan importación y poner en práctica un protocolo:

    #import <MessageUI/MessageUI.h> 
    #import <MessageUI/MFMailComposeViewController.h> 
    @interface MyViewController : UIViewController<MFMailComposeViewControllerDelegate> 
    

Añadir métodos:

-(void)sendEmail { 
     // From within your active view controller 
     if([MFMailComposeViewController canSendMail]) { 
      MFMailComposeViewController *mailCont = [[MFMailComposeViewController alloc] init]; 
      mailCont.mailComposeDelegate = self;  // Required to invoke mailComposeController when send 

      [mailCont setSubject:@"Email subject"]; 
      [mailCont setToRecipients:[NSArray arrayWithObject:@"[email protected]"]]; 
      [mailCont setMessageBody:@"Email message" isHTML:NO]; 

      [self presentViewController:mailCont animated:YES completion:nil]; 
     } 
    } 

    - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { 
     [controller dismissViewControllerAnimated:YES completion:nil]; 
    } 
Cuestiones relacionadas