webentwicklung-frage-antwort-db.com.de

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

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 von meiner App aus eine E-Mail senden?

243
Khushi

Unter iOS 3.0 und höher sollten Sie die Klasse MFMailComposeViewController und das Protokoll MFMailComposeViewControllerDelegate verwenden, die im MessageUI-Framework versteckt sind.

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

#import <MessageUI/MFMailComposeViewController.h>

Dann, um eine Nachricht zu senden:

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 rechtzeitig den Rückruf des Stellvertreters:

- (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 zum Senden von E-Mails konfiguriert ist:

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

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

61
Mugunth

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

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

  2. Die Länge der mailto-URL ist begrenzt. Wenn die URL länger 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.

19
Lee Spivack

Wenn Sie E-Mails aus Ihrer Anwendung senden möchten, ist der obige Code die einzige Möglichkeit, es sei denn, Sie codieren Ihren eigenen Mail-Client (SMTP) in Ihrer App oder Sie 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, über die die E-Mail für Sie gesendet wird. 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, ebenso wie die serverseitige Methode.

13
Genericrich

Der folgende Code wird in meiner Anwendung verwendet, um E-Mails mit einem Anhang zu senden. Die Anhänge sind ein Bild. Sie können jede Art von Datei senden. Beachten Sie jedoch, dass Sie den richtigen 'mimeType' angeben müssen

fügen Sie dies Ihrer .h-Datei hinzu

#import <MessageUI/MFMailComposeViewController.h>

Fügen Sie MessageUI.framework zu Ihrer Projektdatei 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 folgt

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

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];
    }
11
mandeep

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

Schritt 1: Import #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;
}
}
4
Patrick R

Swift 2.2. Angepasst von 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 = "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
Evdzhan Mustafa

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
brian.clear

Hier ist eine Swift 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

1
Esqarrouth

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

Das KRNSendEmail ist gut dokumentiert und zu CocoaPods hinzugefügt.

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

0
Julian D.