Как я могу отправить почту из приложения iPhone


242

Я хочу отправить электронное письмо из приложения для iPhone. Я слышал, что iOS SDK не имеет почтового 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
Потрясающий пост от Mugunth. Путь, приятель!
Иордания

1
Это действительно потрясающе. Спасибо. Я разработал вид специально для приема электронной почты и темы от пользователя. реализуя тот же код, он снова показывает несколько похожий вид. Могу ли я вызвать метод делегата из события нажатия моей кнопки в классе контроллера представления Спасибо за вашу помощь, Шибин
smakstr

Я скачал тот же пример кода, но он не отправлял почту. Он только подсказывает, что письмо было успешно отправлено, но письмо не получено. Я попытался добавить каркас MessageUI, который по умолчанию выглядел красным, но приложение не отправляет почту. Любая помощь в этом отношении будет высоко оценена. Я тестирую приложение в симуляторе.
Рави Шанкар

Не могу отправить письмо с симулятора.
malaki1974

20

Несколько вещей, которые я хотел бы добавить сюда:

  1. Использование mailto URL не будет работать в симуляторе, так как mail.app не установлен на симуляторе. Это работает на устройстве, хотя.

  2. Существует ограничение на длину почтового URL. Если URL превышает 4096 символов, mail.app не запустится.

  3. В OS 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

Это код, который может помочь вам, но не забудьте включить фреймворк пользовательского интерфейса и метод делегатов 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.
Отдых

4

Свифт 2.2. Адаптировано из ответа 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)
    }
}

Код клиента:

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

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

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

Вот версия 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)
    }
}

Источник


0

Я написал простую оболочку под названием KRNSendEmail, которая упрощает отправку электронной почты для одного вызова метода.

KRNSendEmail хорошо документирован и добавлен в CocoaPods.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.