Wie kann ich E-Mails von einer iPhone-Anwendung senden?

242

Ich möchte eine E-Mail von meiner iPhone-Anwendung senden. Ich habe gehört, dass das iOS SDK keine E-Mail-API hat. Ich möchte den folgenden Code nicht verwenden, da dadurch meine Anwendung beendet wird:

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

Wie kann ich eine E-Mail von meiner App aus senden?

Khushi
quelle

Antworten:

430

Unter iOS 3.0 und höher sollten Sie die MFMailComposeViewControllerKlasse und das MFMailComposeViewControllerDelegateProtokoll verwenden, die im MessageUI-Framework versteckt sind.

Fügen Sie zuerst das Framework hinzu und importieren Sie:

#import <MessageUI/MFMailComposeViewController.h>

So senden Sie eine Nachricht:

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

Dann erledigt der Benutzer die Arbeit und Sie erhalten den Rückruf des Delegierten rechtzeitig:

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

Denken Sie daran, zu überprüfen, ob das Gerät für das Senden von E-Mails konfiguriert ist:

if ([MFMailComposeViewController canSendMail]) {
  // Show the composer
} else {
  // Handle the error
}
PeyloW
quelle
5
+1. Die zu importierenden Frameworks werden hier erwähnt ( mobileorchard.com/… ).
Dan Rosenstark
71
Um Ihnen den Sprung zu ersparen, müssen Sie #import <MessageUI / MFMailComposeViewController.h>
TomH
22
Zu beachten , dass gerade da war diese Antwort UIViewController Methoden geschrieben presentModalViewController:animated:und dismissModalViewControllerAnimated:wurde als veraltet markiert - anstatt die blockbasierte Ersatzverfahren presentViewController:animated:completion:und dismissViewControllerAnimated:completion:verwendet werden.
2
Und vergessen Sie nicht, den Delegierten in .h@interface viewController : UIViewController <MFMailComposeViewControllerDelegate>
Nazir
18
Und in IOS 6 [self presentModalViewController:controller animated:YES]; ersetzen durch [self presentViewController:controller animated:YES completion:nil]; und [self dismissModalViewControllerAnimated:YES]; ersetzen durch [self dismissViewControllerAnimated:YES completion:nil];
Nazir
61

MFMailComposeViewController ist der richtige Weg nach der Veröffentlichung der iPhone OS 3.0-Software. Sie können sich den Beispielcode oder das Tutorial ansehen, das ich geschrieben habe .

Mugunth
quelle
2
Super Beitrag von Mugunth. Weiter so, Kumpel!
Jordanien
1
Es ist wirklich super. Vielen Dank. Ich habe eine Ansicht speziell für das Akzeptieren der E-Mail und des Betreffs vom Benutzer entworfen. Durch die Implementierung des gleichen Codes wird wieder eine etwas ähnliche Ansicht angezeigt. Kann ich die Delegate-Methode von meinem Button-Press-Ereignis in der View-Controller-Klasse
aufrufen?
Ich habe den gleichen Beispielcode heruntergeladen, aber keine E-Mail gesendet. Es wird nur gefragt, ob die E-Mail erfolgreich gesendet wurde, aber keine E-Mail empfangen wird. Ich habe versucht, ein MessageUI-Framework hinzuzufügen, das standardmäßig rot angezeigt wird, aber die Anwendung sendet die E-Mail immer noch nicht. Jede Hilfe in dieser Hinsicht wird sehr geschätzt. Ich teste die App im Simulator.
Ravi Shankar
E-Mail vom Simulator kann nicht gesendet werden.
Malaki1974
20

Ein paar Dinge, die ich hier hinzufügen möchte:

  1. Die Verwendung der mailto-URL funktioniert im Simulator nicht, da mail.app nicht im Simulator installiert ist. Es funktioniert jedoch auf dem Gerät.

  2. Die Länge der Mailto-URL ist begrenzt. Wenn die URL größer als 4096 Zeichen ist, wird mail.app nicht gestartet.

  3. In OS 3.0 gibt es eine neue Klasse, mit der Sie eine E-Mail senden können, ohne Ihre App zu verlassen. Siehe die Klasse MFMailComposeViewController.

Jeff Atwood
quelle
13

Wenn Sie E-Mails von Ihrer Anwendung senden möchten, ist der obige Code die einzige Möglichkeit, dies zu tun, es sei denn, Sie codieren Ihren eigenen E-Mail-Client (SMTP) in Ihrer App oder lassen die E-Mails von einem Server für Sie senden.

Sie können Ihre App beispielsweise so codieren, dass auf Ihrem Server eine URL aufgerufen wird, die die E-Mail für Sie sendet. Dann rufen Sie einfach die URL aus Ihrem Code auf.

Beachten Sie, dass Sie mit dem obigen Code nichts an die E-Mail anhängen können, was die SMTP-Client-Methode Ihnen erlauben würde, sowie die serverseitige Methode.

Genericrich
quelle
12

Der folgende Code wird in meiner Anwendung verwendet, um E-Mails mit einem Anhang zu senden. Hier handelt es sich bei den Anhängen um ein Bild. Sie können jede Art von Datei senden. Beachten Sie jedoch nur, dass Sie den richtigen 'mimeType' angeben mussten.

Fügen Sie dies Ihrer .h-Datei hinzu

#import <MessageUI/MFMailComposeViewController.h>

Fügen Sie Ihrer Projektdatei MessageUI.framework hinzu

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

Die Delegierungsmethode ist wie unten gezeigt

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

Dies ist der Code, der Ihnen helfen kann, aber vergessen Sie nicht, die Nachricht ui framewark und die Delegatenmethode MFMailComposeViewControllerDelegate einzuschließen

-(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];
    }
mandeep
quelle
Vielen Dank! Sehr nützliches Beispiel mit HTML-Body.
Ruhen Sie sich am
4

Swift 2.2. Angepasst an Esqs Antwort

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

Kundencode:

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 = ["[email protected]"]
    ms?.send(title, messageBody: messageBody, toRecipents: toRecipents)
}
Evdzhan Mustafa
quelle
4

Um eine E-Mail von der iPhone-Anwendung zu senden, müssen Sie die folgende Aufgabenliste ausführen.

Schritt 1: Importieren#import <MessageUI/MessageUI.h> In Ihrer Controller-Klasse, in der Sie eine E-Mail senden möchten.

Schritt 2: Fügen Sie den Delegaten wie unten gezeigt zu Ihrem Controller hinzu

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

Schritt 3: Fügen Sie die folgende Methode zum Senden von E-Mails hinzu.

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

Schritt 4: Implementieren Sie MFMailComposeViewController Delegate

- (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;
}
}
Patrick R.
quelle
Enthält diese Antwort neue Informationen, die nicht bereits in einer der vorhandenen Antworten enthalten sind?
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)")

        //------------------------------------------------
    }
}
brian.clear
quelle
1

Hier ist eine schnelle Version:

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

Quelle

Esqarrouth
quelle
0

Ich habe einen einfachen Wrapper namens KRNSendEmail geschrieben, der das Senden von E-Mails an einen Methodenaufruf vereinfacht.

KRNSendEmail ist gut dokumentiert und wird CocoaPods hinzugefügt.

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

Julian D.
quelle