Как я могу отправить почту из приложения 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]];

Так как я могу отправить электронное письмо из моего приложения?

Khushi
источник

Ответы:

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
}
PeyloW
источник
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. Вы можете посмотреть пример кода или учебник, который я написал .

Mugunth
источник
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-клиента, а также метод на стороне сервера.

Genericrich
источник
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)")

        //------------------------------------------------
    }
}
brian.clear
источник
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)
    }
}

Источник

Esqarrouth
источник
0

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

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

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

Джулиан Д.
источник