Bagaimana saya bisa mengirim email dari aplikasi iPhone


242

Saya ingin mengirim email dari aplikasi iPhone saya. Saya telah mendengar bahwa iOS SDK tidak memiliki API email. Saya tidak ingin menggunakan kode berikut karena akan keluar dari aplikasi saya:

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

Jadi bagaimana saya bisa mengirim email dari aplikasi saya?

Jawaban:


430

Di iOS 3.0 dan yang lebih baru, Anda harus menggunakan MFMailComposeViewControllerkelas, dan MFMailComposeViewControllerDelegateprotokol, yang tersimpan dalam kerangka MessageUI.

Pertama tambahkan kerangka kerja dan impor:

#import <MessageUI/MFMailComposeViewController.h>

Kemudian, untuk mengirim pesan:

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

Kemudian pengguna melakukan pekerjaan dan Anda mendapatkan panggilan balik delegasi tepat waktu:

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

Ingatlah untuk memeriksa apakah perangkat dikonfigurasi untuk mengirim email:

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

5
+1. Kerangka kerja yang perlu diimpor disebutkan di sini ( mobileorchard.com/... ).
Dan Rosenstark

71
Untuk menyelamatkan Anda dari lompatan, Anda perlu #import <MessageUI / MFMailComposeViewController.h>
TomH

22
Hanya untuk mencatat bahwa karena jawaban ini ditulis metode UIViewController presentModalViewController:animated:dan dismissModalViewControllerAnimated:telah ditandai sebagai usang - sebagai gantinya metode penggantian berbasis blok presentViewController:animated:completion:dan dismissViewControllerAnimated:completion:harus digunakan.

2
Dan jangan lupa mengatur delegasi di .h @interface viewController : UIViewController <MFMailComposeViewControllerDelegate>
Nazir

18
Dan di iOS 6 [self presentModalViewController:controller animated:YES]; ganti dengan [self presentViewController:controller animated:YES completion:nil]; dan [self dismissModalViewControllerAnimated:YES]; ganti dengan [self dismissViewControllerAnimated:YES completion:nil];
Nazir

61

MFMailComposeViewController adalah cara yang harus dilakukan setelah rilis perangkat lunak iPhone OS 3.0. Anda dapat melihat kode contoh atau tutorial yang saya tulis .


2
Pos luar biasa oleh Mugunth. Cara untuk pergi sobat!
Jordan

1
Sangat mengagumkan. Terima kasih. Saya mendesain tampilan khusus untuk menerima email dan subjek dari pengguna. dengan menerapkan kode yang sama lagi-lagi menampilkan tampilan yang agak mirip. dapatkah saya memohon metode delegasi dari acara saya menekan tombol di kelas controller tampilan Terima kasih atas bantuan Anda, Shibin
smakstr

Saya telah mengunduh kode sampel yang sama tetapi tidak mengirim surat apa pun. Itu hanya meminta agar surat berhasil dikirim tetapi tidak ada surat yang diterima. Saya telah mencoba menambahkan kerangka MessageUI yang tampak berwarna merah secara default tetapi aplikasi tetap tidak mengirim surat. Bantuan apa pun dalam hal ini akan sangat dihargai. Saya menguji aplikasi dalam simulator.
Ravi shankar

Tidak dapat mengirim email dari simulator.
malaki1974

20

Beberapa hal yang ingin saya tambahkan di sini:

  1. Menggunakan URL mailto tidak akan berfungsi di simulator karena mail.app tidak diinstal pada simulator. Itu bekerja pada perangkat.

  2. Ada batas panjang URL mailto. Jika URL lebih besar dari 4096 karakter, mail.app tidak akan diluncurkan.

  3. Ada kelas baru di OS 3.0 yang memungkinkan Anda mengirim email tanpa meninggalkan aplikasi Anda. Lihat kelas MFMailComposeViewController.


13

Jika Anda ingin mengirim email dari aplikasi Anda, kode di atas adalah satu-satunya cara untuk melakukannya kecuali jika Anda memberi kode pada klien surat Anda sendiri (SMTP) di dalam aplikasi Anda, atau minta server mengirim surat untuk Anda.

Misalnya, Anda bisa membuat kode aplikasi Anda untuk meminta URL di server Anda yang akan mengirim email untuk Anda. Maka Anda cukup memanggil URL dari kode Anda.

Perhatikan bahwa dengan kode di atas Anda tidak dapat melampirkan apa pun ke email, yang dapat Anda lakukan dengan metode SMTP client, serta metode sisi server.


12

Kode di bawah ini digunakan dalam aplikasi saya untuk mengirim email dengan lampiran di sini lampiran adalah gambar. Anda dapat mengirim semua jenis file yang hanya perlu diingat adalah bahwa Anda harus menentukan 'mimeType' yang benar

tambahkan ini ke file .h Anda

#import <MessageUI/MFMailComposeViewController.h>

Tambahkan MessageUI.framework ke file proyek Anda

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

Metode pendelegasian adalah seperti yang ditunjukkan di bawah ini

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

11

Ini adalah kode yang dapat membantu Anda tetapi jangan lupa menyertakan pesan ui framewark dan menyertakan metode delegasi 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];
    }

Terima kasih banyak! Contoh yang sangat berguna dengan tubuh HTML.
Resty

4

Cepat 2.2. Diadaptasi dari jawaban 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)
    }
}

Kode klien:

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

Untuk mengirim email dari aplikasi iPhone yang perlu Anda lakukan di bawah daftar tugas.

Langkah 1: Impor#import <MessageUI/MessageUI.h> Di kelas pengontrol Anda tempat Anda ingin mengirim email.

Langkah 2: Tambahkan delegasi ke controller Anda seperti yang ditunjukkan di bawah ini

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

Langkah 3: Tambahkan metode di bawah ini untuk mengirim email.

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

Langkah 4: Terapkan Delegasi 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;
}
}

apakah jawaban ini memberikan informasi baru yang belum termasuk dalam salah satu jawaban yang ada?
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

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

Sumber


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.