Come posso inviare posta da un'applicazione iPhone


242

Voglio inviare un'e-mail dalla mia applicazione iPhone. Ho sentito che l'SDK di iOS non ha un'API di posta elettronica. Non voglio usare il seguente codice perché uscirà dalla mia applicazione:

NSString *url = [NSString stringWithString: @"mailto:foo@example.com?cc=bar@example.com&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!"];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

Quindi, come posso inviare un'e-mail dalla mia app?

Risposte:


430

Su iOS 3.0 e versioni successive dovresti usare la MFMailComposeViewControllerclasse e il MFMailComposeViewControllerDelegateprotocollo, che sono nascosti nel framework MessageUI.

Per prima cosa aggiungi il framework e importa:

#import <MessageUI/MFMailComposeViewController.h>

Quindi, per inviare un messaggio:

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

Quindi l'utente fa il lavoro e si ottiene il callback delegato in tempo:

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

Ricorda di verificare se il dispositivo è configurato per l'invio di e-mail:

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

5
+1. I framework che devono essere importati sono menzionati qui ( mobileorchard.com/… ).
Dan Rosenstark, il

71
Per salvarti il ​​salto, devi #import <MessageUI / MFMailComposeViewController.h>
TomH

22
Basta notare che da quando questa risposta è stata scritta metodi di UIViewController presentModalViewController:animated:e dismissModalViewControllerAnimated:sono stati contrassegnati come deprecato - invece i metodi sostitutivi basati su blocchi presentViewController:animated:completion:e dismissViewControllerAnimated:completion:dovrebbe essere usato.

2
E non dimenticare di impostare il delegato in .h @interface viewController : UIViewController <MFMailComposeViewControllerDelegate>
Nazir

18
E in IOS 6 [self presentModalViewController:controller animated:YES]; sostituire [self presentViewController:controller animated:YES completion:nil]; e [self dismissModalViewControllerAnimated:YES]; sostituire con [self dismissViewControllerAnimated:YES completion:nil];
Nazir

61

MFMailComposeViewController è la strada da percorrere dopo il rilascio del software iPhone OS 3.0. Puoi guardare il codice di esempio o il tutorial che ho scritto .


2
Post fantastico di Mugunth. Ben fatto amico!
Giordania,

1
È davvero fantastico. Grazie. Ho progettato una vista appositamente per accettare l'e-mail e l'oggetto dell'utente. implementando lo stesso codice è di nuovo mostrando una visione un po 'simile. posso invocare il metodo delegato dall'evento del mio pulsante premuto nella classe del controller di visualizzazione Grazie per l'aiuto, Shibin
smakstr

Ho scaricato lo stesso codice di esempio ma non invio di posta. Richiede solo che la posta sia stata inviata correttamente ma che non sia stata ricevuta. Ho provato ad aggiungere il framework MessageUI che appariva di colore rosso per impostazione predefinita ma l'applicazione non sta ancora inviando la posta. Qualsiasi aiuto in tal senso sarà molto apprezzato. Sto testando l'app nel simulatore.
Ravi Shank,

Impossibile inviare e-mail dal simulatore.
Malaki1974,

20

Alcune cose che vorrei aggiungere qui:

  1. L'uso dell'URL mailto non funzionerà nel simulatore poiché mail.app non è installato sul simulatore. Funziona sul dispositivo però.

  2. C'è un limite alla lunghezza dell'URL mailto. Se l'URL contiene più di 4096 caratteri, mail.app non verrà avviato.

  3. Esiste una nuova classe nel sistema operativo 3.0 che ti consente di inviare un'e-mail senza uscire dall'app. Vedi la classe MFMailComposeViewController.


13

Se si desidera inviare e-mail dalla propria applicazione, il codice sopra riportato è l'unico modo per farlo a meno che non si codifichi il proprio client di posta elettronica (SMTP) all'interno della propria app o si abbia un server che invia la posta per te.

Ad esempio, potresti codificare la tua app per invocare un URL sul tuo server che invierebbe la posta per te. Quindi devi semplicemente chiamare l'URL dal tuo codice.

Nota che con il codice sopra non puoi allegare nulla all'e-mail, che il metodo client SMTP ti permetterebbe di fare, così come il metodo lato server.


12

Di seguito il codice viene utilizzato nella mia applicazione per inviare e-mail con un allegato qui gli allegati sono un'immagine. È possibile inviare qualsiasi tipo di file, l'unica cosa da tenere a mente è che è stato necessario specificare il 'mimeType' corretto

aggiungi questo al tuo file .h

#import <MessageUI/MFMailComposeViewController.h>

Aggiungi MessageUI.framework al tuo file di progetto

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

Il metodo delegato è come mostrato di seguito

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

11

Questo è il codice che può aiutarti ma non dimenticare di includere il messaggio ui framewark e includere il metodo dei delegati 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];
    }

Grazie mille! Esempio molto utile con il corpo HTML.
Resty

4

Swift 2.2. Adattato dalla risposta di 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)
    }
}

Codice cliente:

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 = ["foo@bar.com"]
    ms?.send(title, messageBody: messageBody, toRecipents: toRecipents)
}

4

Per inviare un'e-mail dall'applicazione iPhone è necessario eseguire l'elenco di attività di seguito.

Passaggio 1: importazione#import <MessageUI/MessageUI.h> nella classe del controller a cui si desidera inviare un'e-mail.

Passaggio 2: aggiungere il delegato al controller come mostrato di seguito

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

Passaggio 3: aggiungi il metodo seguente per inviare 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.
}
}

Passaggio 4: implementare il delegato 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;
}
}

questa risposta fornisce nuove informazioni che non sono già incluse in una delle risposte esistenti?
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)")

        //------------------------------------------------
    }
}

1

Ecco una versione 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 = ["pj@veasoftware.com"]
            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)
    }
}

fonte


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.