Как отправить почту из приложения iphone, не показывая MFMailComposeViewController? - PullRequest
7 голосов
/ 24 февраля 2012

Я хочу отправлять почту из своего пользовательского приложения для iPhone. Я использовал MFMailComposeViewController для отправки почты с моего iphone в моем предыдущем приложении. Теперь я не хочу показывать MFMailComposeViewController пользователю, если он нажимает Send Mail button, письмо автоматически отправляется на recipient mail address. Как я могу это сделать? Можете ли вы помочь мне в этом? Заранее спасибо.

Я использовал приведенный ниже код для отображения MFMailComposeViewController,

MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"Details"];
[controller setMessageBody:@"Hi" isHTML:NO];
[controller setToRecipients:[NSArray arrayWithObjects:@"abcd.m@gmail.com", nil]];
[self presentModalViewController:controller animated:YES];
[controller release];

Ответы [ 2 ]

14 голосов
/ 24 февраля 2012

Программная отправка сообщений электронной почты без вмешательства пользователя из приложения iphone не может быть реализована с помощью какой-либо платформы Apple.Это может быть возможно в взломанном телефоне, но тогда он никогда не увидит внутри App Store.

Если вы хотите контролировать отправку электронной почты, то лучшим способом было бы настроить веб-службу (на стороне сервера), которую вы можете публиковать с помощью HTTP-запроса.Если вы публикуете только один адрес, это может работать очень хорошо, хотя вы можете попросить пользователя ввести свой обратный почтовый адрес.

В противном случае доступен только стандартный диалог (это зависит от использования любой учетной записи, которую оннастроил на устройстве).

5 голосов
/ 20 мая 2017

iOS SDK значительно облегчает отправку электронной почты с помощью встроенных API-интерфейсов.С помощью нескольких строк кодов вы можете запустить тот же интерфейс электронной почты, что и стандартное почтовое приложение, которое позволяет вам создавать электронную почту.Вы можете открыть форму составителя писем, написать сообщение и отправить обычную почту или прикрепленный файл с помощью класса MFMailComposeViewController.Для получения дополнительной информации: Отправка электронной почты из вашего приложения для iOS

Но в этом разделе я собираюсь объяснить отправку электронной почты без отображения листа составителя почты, т.е.отправка писем в фоновом режиме.Для этой функции мы не можем использовать родной класс iOS MFMailComposer, потому что он не позволяет нам отправлять электронные письма в фоновом режиме, вместо этого он открывает окно составителя писем, откуда пользователь должен нажать кнопку «отправить», поэтому в этом разделе я собираюсьиспользуйте библиотеку SKPSMTPMessage для отправки электронных писем в фоновом режиме, однако для этого метода должна быть жестко задана учетная запись электронной почты.

Ограничения:

Адрес электронной почты отправителя / получателя должен быть жестко закодирован, или вы должны захватить его с помощьюнекоторые всплывающие формы в вашем приложении, где пользователь вводит адрес электронной почты отправителя / получателя.Кроме того, учетные данные отправителя также должны быть жестко закодированы, поскольку мы не можем получить их из настроек устройства.

Метод:

  1. Импорт CFNetwork.framework в ваш проект.
  2. Включить #import "SKPSMTPMessage.h" #import "NSData + Base64Additions.h" // для кодировки Base64
  3. Включить в ваш ViewController
  4. Загрузить библиотеку SKPSMTPMessage из
    https://github.com/jetseven/skpsmtpmessage
  5. Перетащите папку «SMTPLibrary», которую вы загрузили в свой проект.

    Прежде чем продолжить, сообщите, что я использую адрес электронной почты отправителя / получателя и пароль отправителяжестко запрограммирован в коде для этого примера. Но вы можете получить эти учетные данные от пользователя, позволяя им вводить данные в какой-либо форме (используя UIViews).

    -(void) sendEmailInBackground {
        NSLog(@"Start Sending");
        SKPSMTPMessage *emailMessage = [[SKPSMTPMessage alloc] init];
        emailMessage.fromEmail = @"sender@gmail.com"; //sender email address
        emailMessage.toEmail = @"receiver@gmail.com";  //receiver email address
        emailMessage.relayHost = @"smtp.gmail.com";
        //emailMessage.ccEmail =@"your cc address";
        //emailMessage.bccEmail =@"your bcc address";
        emailMessage.requiresAuth = YES;
        emailMessage.login = @"sender@gmail.com"; //sender email address
        emailMessage.pass = @"Passwxxxx"; //sender email password
        emailMessage.subject =@"@"email subject header message";
        emailMessage.wantsSecure = YES; 
        emailMessage.delegate = self; // you must include <SKPSMTPMessageDelegate> to your class
        NSString *messageBody = @"your email body message";
        //for example :   NSString *messageBody = [NSString stringWithFormat:@"Tour Name: %@\nName: %@\nEmail: %@\nContact No: %@\nAddress: %@\nNote: %@",selectedTour,nameField.text,emailField.text,foneField.text,addField.text,txtView.text];
        // Now creating plain text email message
        NSDictionary *plainMsg = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain",kSKPSMTPPartContentTypeKey, messageBody,kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];
        emailMessage.parts = [NSArray arrayWithObjects:plainMsg,nil];
        //in addition : Logic for attaching file with email message.
        /*
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"JPG"];
        NSData *fileData = [NSData dataWithContentsOfFile:filePath];
        NSDictionary *fileMsg = [NSDictionary dictionaryWithObjectsAndKeys:@"text/directory;\r\n\tx- unix-mode=0644;\r\n\tname=\"filename.JPG\"",kSKPSMTPPartContentTypeKey,@"attachment;\r\n\tfilename=\"filename.JPG\"",kSKPSMTPPartContentDispositionKey,[fileData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil];
        emailMessage.parts = [NSArray arrayWithObjects:plainMsg,fileMsg,nil]; //including plain msg and attached file msg
        */
        [emailMessage send];
        // sending email- will take little time to send so its better to use indicator with message showing sending...
    }
    

Теперь, обработкаметоды делегата:

// В случае успеха

-(void)messageSent:(SKPSMTPMessage *)message{
    NSLog(@"delegate - message sent");
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message sent." message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
    [alert show]; 
}

// В случае отказа

-(void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error{
// open an alert with just an OK button
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error!" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
    [alert show];
    NSLog(@"delegate - error(%d): %@", [error code], [error localizedDescription]);
}

Хорошо, вот и все со стороны кодирования.Надеюсь, этот урок может оказаться полезным для вас, guyz

...