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:[email protected][email protected]&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!"];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

Jadi bagaimana saya bisa mengirim email dari aplikasi saya?

Khushi
sumber

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
}
PeyloW
sumber
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 .

Mugunth
sumber
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.

Jeff Atwood
sumber
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.

Genericrich
sumber
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];
}
Kannan Prasad
sumber
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];
    }
Mandeep
sumber
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 = ["[email protected]"]
    ms?.send(title, messageBody: messageBody, toRecipents: toRecipents)
}
Evdzhan Mustafa
sumber
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;
}
}
Patrick R
sumber
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)")

        //------------------------------------------------
    }
}
brian.clear
sumber
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 = ["[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)
    }
}

Sumber

Esqarrouth
sumber
0

Saya menulis pembungkus sederhana bernama KRNSendEmail yang menyederhanakan pengiriman email ke satu metode panggilan.

KRNSendEmail didokumentasikan dengan baik dan ditambahkan ke CocoaPods.

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

Julian D.
sumber