Як я можу надсилати пошту із програми iPhone


242

Я хочу надіслати електронний лист від своєї програми iPhone. Я чув, що SDK для iOS не має API електронної пошти. Я не хочу використовувати наступний код, оскільки він закриє мою програму:

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

Тож як я можу надіслати електронний лист від свого додатка?

Відповіді:


430

На iOS 3.0 і пізніших версіях ви повинні використовувати MFMailComposeViewControllerклас та MFMailComposeViewControllerDelegateпротокол, які затягнуті в рамку MessageUI.

Спочатку додайте фреймворк та імпортуйте:

#import <MessageUI/MFMailComposeViewController.h>

Потім, щоб надіслати повідомлення:

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

Тоді користувач виконує роботу, і ви отримуєте зворотний зворот делегата:

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

Не забудьте перевірити, чи пристрій налаштовано для надсилання електронної пошти:

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

5
+1. Тут згадуються рамки, які потребують імпорту ( mobileorchard.com/… ).
Дан Розенстарк

71
Щоб заощадити стрибок, вам потрібно #import <MessageUI / MFMailComposeViewController.h>
TomH

22
Зауважимо лише, що оскільки ця відповідь була написана методами UIViewController presentModalViewController:animated:і dismissModalViewControllerAnimated:позначена як застаріла - замість методів заміни на основі блоків presentViewController:animated:completion:і їх dismissViewControllerAnimated:completion:слід використовувати.

2
І не забудьте встановити делегата в .h @interface viewController : UIViewController <MFMailComposeViewControllerDelegate>
Назір

18
А в IOS 6 [self presentModalViewController:controller animated:YES]; заміни [self presentViewController:controller animated:YES completion:nil]; і [self dismissModalViewControllerAnimated:YES]; заміни на [self dismissViewControllerAnimated:YES completion:nil];
Назір

61

MFMailComposeViewController - це шлях після виходу програмного забезпечення iPhone OS 3.0. Ви можете подивитися зразок коду чи підручник, який я написав .


2
Дивовижний пост Мугунта. Шлях піти приятелю!
Йорданія

1
Це дійсно приголомшливо. Дякую. Я створив перегляд спеціально для прийому електронної пошти та теми від користувача. реалізуючи той самий код, його знову виявляється дещо схожий погляд. Чи можу я викликати метод делегування від моєї події натискання кнопок у класі контролера перегляду Дякую за вашу допомогу,
Shibin

Я завантажив той самий зразок коду, але він не надсилав жодної пошти. Це лише спонукає до того, що пошту було надіслано успішно, але повідомлення не отримано. Я спробував додати рамку MessageUI, яка за замовчуванням виявилася червоним кольором, але програма не надсилає пошту. Будь-яка допомога в цьому плані буде дуже вдячна. Я тестую додаток на тренажері.
Раві шанкар

Не вдається надіслати електронний лист від тренажера.
malaki1974

20

Я хочу додати тут декілька речей:

  1. Використання URL-адреси mailto не працюватиме в тренажері, оскільки mail.app не встановлений на тренажері. Однак це працює на пристрої.

  2. Існує обмеження на довжину URL-адреси поштового зв’язку. Якщо URL перевищує 4096 символів, пошта mail.app не запуститься.

  3. В ОС 3.0 є новий клас, який дозволяє надсилати електронну пошту, не виходячи із програми. Дивіться клас MFMailComposeViewController.


13

Якщо ви хочете надіслати електронну пошту зі своєї програми, наведений вище код - це єдиний спосіб зробити це, якщо ви не кодуєте власний поштовий клієнт (SMTP) всередині свого додатка або не попросите сервера відправити пошту за вас.

Наприклад, ви можете кодувати свою програму, щоб викликати URL-адресу на своєму сервері, яка надсилатиме вам пошту. Тоді ви просто зателефонуєте за URL-адресою зі свого коду.

Зауважте, що з вищевказаного коду ви не можете приєднати нічого до електронної пошти, що дозволить вам зробити клієнтський метод SMTP, а також метод на стороні сервера.


12

Нижче код використовується в моїй програмі для надсилання електронного листа із вкладенням, тут вкладення - це зображення. Ви можете надсилати будь-який тип файлів, лише потрібно пам’ятати, що вам потрібно було вказати правильний 'mimeType'

додайте це у свій .h файл

#import <MessageUI/MFMailComposeViewController.h>

Додайте MessageUI.framework до файлу проекту

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

Метод делегування показаний нижче

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

11

Це код, який може допомогти u, але не забудьте включити фреймворк повідомлення ui та включити метод делегатів 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];
    }

Дуже дякую! Дуже корисний приклад з тілом HTML.
Resty

4

Швидкий 2.2. Адаптований з відповіді Еск

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

Код клієнта:

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

Щоб надіслати електронний лист із програми iPhone, потрібно виконати нижче список завдань.

Крок 1: Імпорт#import <MessageUI/MessageUI.h> у клас контролера, куди потрібно надіслати електронний лист.

Крок 2. Додайте делегат до свого контролера, як показано нижче

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

Крок 3: Додайте нижче метод для надсилання електронної пошти.

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

Крок 4: Реалізуйте 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;
}
}

чи відповідає ця відповідь новою інформацією, яка вже не включена в одну з існуючих відповідей?
Флоріан Кох

2

Швидкий 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

Ось версія 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)
    }
}

Джерело


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.