2010-11-26 9 views
5

Tengo dificultades para intentar enviar un correo electrónico desde mi aplicación. Probé este código de iCodeBlog (http://icodeblog.com/2009/11/18/iphone-coding-tutorial-in-application-emailing/)Problema al enviar un correo electrónico desde una aplicación con MFMailComposeViewController

 
-(void)sendEmail:(id)sender 
{ 
    MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init]; 
    mail.mailComposeDelegate = self; 
    if ([MFMailComposeViewController canSendMail]) { 
      //Setting up the Subject, recipients, and message body. 
     [mail setToRecipients:[NSArray arrayWithObjects:@"[email protected]",nil]]; 
     [mail setSubject:@"Subject of Email"]; 
     [mail setMessageBody:@"Message of email" isHTML:NO]; 
      //Present the mail view controller 
     [self presentModalViewController:mail animated:YES]; 
    } 
     //release the mail 
    [mail release]; 
} 
    //This is one of the delegate methods that handles success or failure 
    //and dismisses the mail 
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
    if (result == MFMailComposeResultFailed) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message Failed!" message:@"Your email has failed to send" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
    } 
} 

Se dice que enviar el correo electrónico y sin Se produce un error pero nunca recibo el correo electrónico en mi bandeja de entrada. Intenté enviarlos a diferentes cuentas de correo electrónico e intenté enviarlos desde diferentes cuentas, no se produjo ningún error pero nunca recibo el correo electrónico. Alguna idea?

Si es importante, me sale este mensaje en la consola del depurador cuando comienzo a escribir el campo Para: e-mail

DA | No se pudo abrir el archivo de bloqueo en /tmp/DAAccountsLoading.lock. Cargaremos las cuentas de todos modos, pero las cosas malas que puede suceder

=============================== ============================== Me acabo de dar cuenta de que todos esos correos electrónicos fueron enviados a mi Buzón de salida en Mail.app. ¿No se envían automáticamente cuando hago clic en enviar? Si no es así, ¿qué puedo hacer para que se envíen cuando el usuario presiona el botón Enviar en MFMailComposeView? O tal vez llame al Mail.app y haga que se envíen esos correos electrónicos.

Respuesta

6

Usar este código esto definitivamente va a trabajar:

-(IBAction)send{ 

     [self callMailComposer]; 
    } 

    -(void)callMailComposer{ 

     Class mailClass = (NSClassFromString(@"MFMailComposeViewController")); 
     if (mailClass != nil) 
     { 
     // We must always check whether the current device is configured for sending emails 
      if ([mailClass canSendMail]) 
       [self displayComposerSheet]; 
      else 
       [self launchMailAppOnDevice]; 
     } 

     else 
     { 
      [self launchMailAppOnDevice]; 
     } 
    } 


    #pragma mark - 
    #pragma mark Compose Mail 
    #pragma mark 

    // Displays an email composition interface inside the application. Populates all the Mail fields. 
    -(void)displayComposerSheet{ 

     MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 


     picker.mailComposeDelegate = self; 
     NSString *tosubject [email protected]""; 
     [picker setSubject:tosubject]; 


     // Set up recipients 
     [picker setCcRecipients:nil]; 
     [picker setBccRecipients:nil]; 

     [picker setToRecipients:nil]; 



     [picker setMessageBody:strNewsLink isHTML:NO]; 

     [self presentModalViewController:picker animated:YES]; 

     if(picker) [picker release]; 
     if(picker) picker=nil; 

    } 


    // Dismisses the email composition interface when users tap Cancel or Send. Proceeds to update the message field with the result of the operation. 

     - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{  
    NSString* alertMessage; 
    // message.hidden = NO; 
    // Notifies users about errors associated with the interface 
    switch (result) 
    { 
    case MFMailComposeResultCancelled: 
     alertMessage = @"Email composition cancelled"; 
     break; 
    case MFMailComposeResultSaved: 
     alertMessage = @"Your e-mail has been saved successfully"; 

     break; 
    case MFMailComposeResultSent: 
     alertMessage = @"Your email has been sent successfully"; 

     break; 
    case MFMailComposeResultFailed: 
     alertMessage = @"Failed to send email"; 

     break; 
    default: 
     alertMessage = @"Email Not Sent"; 

     break; 
    } 

    UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"My app name" 
                 message:alertMessage 
                delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
    [alertView show]; 
    [self dismissModalViewControllerAnimated:YES]; 
} 


    #pragma mark 
    #pragma mark Workaround 
    #pragma mark 
    // Launches the Mail application on the device. 

     -(void)launchMailAppOnDevice{ 

     NSString *recipients = @"mailto:?cc=&subject="; 
     NSString *body = @"&body="; 
     NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body]; 
     email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]]; 

    } 
+0

El código parece desordenado, pero he implementado el compositor de correo en muchas de mis aplicaciones y esto funciona absolutamente bien – Aditya

+0

Tu código me ayudó con algunas cosas. ¡Gracias! –

+0

En el código que parece en mal estado, es probable que no tenga los 4 espacios necesarios antes de las líneas que no aparecen como código. –

0

Btw Espero que esté probando esta funcionalidad en el dispositivo como si tratara de ejecutar este código en Simulator, mostrará que el correo electrónico se envió con éxito, pero el correo electrónico nunca se envía.

Gracias

+0

Sí, lo estoy probando en mi dispositivo. Dice que el correo electrónico fue enviado pero no está en mi bandeja de entrada ... –

1

excavando un viejo hilo aquí ... tal vez pueda ahorrar frustraciones futuras cuando se trata de MFMAilComposerViewController que no envía mensajes de correo electrónico.

mi aplicación enviaría correos electrónicos en 4 de mis 5 dispositivos de prueba y no pude entender cuál era la diferencia en la quinta. El problema fue una cuenta de Gmail mal configurada. El método de captura de error MFMailComposerViewController nunca devolvió ningún error, simplemente no envió el correo electrónico. El problema era una dirección de correo electrónico o una contraseña de correo electrónico incorrecta. Descubrí esto al preguntar al usuario del dispositivo su información de inicio de sesión de correo electrónico y luego apareció una alerta de error cuando intenté iniciar sesión en su cuenta de Gmail. El supuesto, sí, mi mal, era que canSendMail comprobaría para una cuenta de correo electrónico válida ...

0

Swift 4 Versión

let myController:MFMailComposeViewController = MFMailComposeViewController() 
    if MFMailComposeViewController.canSendMail() { 
     myController.mailComposeDelegate = self 
     myController.setToRecipients(["[email protected]"]) 
     self.present(myController, animated: true, completion: nil) 
    } 
Cuestiones relacionadas