Как отправить электронное письмо получателю в фоновом режиме в iOS5? - PullRequest
8 голосов
/ 10 ноября 2011

В приложении для iPhone я хочу отправить электронное письмо человеку, который забыл свой пароль. Я хочу отправить почту в фоновом режиме (не могу использовать MFMailComposeViewController для этого), а также приложение не должно быть переведено в фоновый режим. Есть ли способ добиться этого?

Ответы [ 7 ]

10 голосов
/ 19 октября 2012

Лучший способ сделать это - использовать SKPSMTPMessage.Вы можете скачать его здесь: https://github.com/jetseven/skpsmtpmessage Это очень простое решение, которое я использовал ранее для использования решений "Забыли пароль" в приложениях для iOS.Чтобы реализовать, просто перетащите загруженные файлы в ваше приложение, #import «SKPSMTPMessage.h» в свой класс и внедрите следующий код:

.h

#import "SKPSMTPMessage.h"

@interface SomeView : UIViewController <SKPSMTPMessageDelegate> {

}

- (IBAction)forgotPassword;

.m

- (IBAction)forgotPassword {
SKPSMTPMessage *forgotPassword = [[SKPSMTPMessage alloc] init];
[forgotPassword setFromEmail:@"some-email@gmail.com"];  // Change to your email address
[forgotPassword setToEmail:@"user-email@gmail.com"]; // Load this, or have user enter this
[forgotPassword setRelayHost:@"smtp.gmail.com"];
[theMessage setRequiresAuth:YES]; // GMail requires this
[forgotPassword setLogin:@"some-email@gmail.com"]; // Same as the "setFromEmail:" email
[forgotPassword setPass:@"password"]; // Password for the Gmail account that you are sending from
[forgotPassword setSubject:@"Forgot Password: My App"]; // Change this to change the subject of the email
[forgotPassword setWantsSecure:YES]; // Gmail Requires this
[forgotPassword setDelegate:self]; // Required

NSString *newpassword = @"helloworld";

NSString *message = [NSString stringWithFormat:@"Your password has been successfully reset. Your new password: %@", newpassword];
NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain", kSKPSMTPPartContentTypeKey, message, kSKPSMTPPartMessageKey, @"8bit" , kSKPSMTPPartContentTransferEncodingKey, nil];

[forgotPassword setParts:[NSArray arrayWithObjects:plainPart, nil]];
[forgotPassword send];
}

Также обязательно укажите следующие методы в .m.Вы можете изменить содержимое UIAlertViews в зависимости от того, что вы хотите отобразить пользователю.

- (void)messageSent:(SKPSMTPMessage *)message {
    NSLog(@"Message Sent");

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Password Reset" message:@"Check your email for your new password." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
}

- (void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error {
    NSLog(@"Message Failed With Error(s): %@", [error description]);
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"There was an error reseting your password. Please try again later." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
}

Вам также необходимо сделать следующее, прежде чем это сработает.Ваша цель -> Получить информацию -> Построить -> Все конфигурации -> Другие флаги связи: "-ObjC" Если вам нужна помощь с этим, см. http://developer.apple.com/qa/qa2006/qa1490.html

РЕДАКТИРОВАТЬ: * CFNetwork.framework mustТакже добавьте, чтобы это работало!*

Дайте мне знать, если у вас есть еще вопросы.

Спасибо, Джейкоб

5 голосов
/ 10 ноября 2011

Вы не можете использовать MFMailComposeViewController, чтобы сделать это.Ни один API не позволит вам отправлять электронные письма или любые другие сообщения от имени пользователя, пока он его не увидит.

Единственное, что я вижу, это позвонить на ваш сервер, а сервер отправит электронное письмо, что-то вродеэто:

NSURLRequest requestWithURL:[NSURL urlWithString:@"http://server.com/send_passcode?to=email@lala.com"]];
2 голосов
/ 10 ноября 2011

Вы МОЖЕТ отправлять электронную почту в фоновом режиме (без использования контроллера MFMail по умолчанию).НО вам все еще нужно, чтобы пользователь заполнил любую форму (или контент, который вы хотите отправить по электронной почте) и попросил его нажать «Отправить».

Вот мой пост о том, как это сделать.Он включает в себя код и изображения.

Блокировка полей в MFMailComposeViewController

PS это работает, и Apple одобрила более 10 моих приложений, использующих этот код / ​​метод.

2 голосов
/ 10 ноября 2011

Вы не можете отправлять SMS / электронную почту без согласия пользователя.Но в интернете существует множество веб-сервисов, которые могут отправлять SMS / электронную почту.Я думаю, какое-то приложение использует эти сервисы или использует свои собственные.

0 голосов
/ 27 февраля 2015

Загрузите библиотеку SKPSMTP и импортируйте

#import "SKPSMTPMessage.h"
#import "NSData+Base64Additions.h"


-(IBAction)btnRecoverClicked:(id)Sender;

Затем реализуйте метод отправки почты в фоновом режиме.

-(IBAction) btnRecoverClicked:(id)sender {
    NSString *str=@"Your password is:";
    NSString *strUserPassword=[NSString stringWithFormat:@"%@ %@",str,struserPassword];
    NSLog(@"Start Sending");
    SKPSMTPMessage *emailMessage = [[SKPSMTPMessage alloc] init];
    emailMessage.fromEmail = @"XXXXX"; //sender email address
    emailMessage.toEmail = struserEmail;  //receiver email address
    emailMessage.relayHost = @"smtp.gmail.com";
    //emailMessage.ccEmail =@"your cc address";
    //emailMessage.bccEmail =@"your bcc address";
    emailMessage.requiresAuth = YES;
    emailMessage.login = @"xxxxxxxx"; //sender email address
    emailMessage.pass = @"XXXXXXX"; //sender email password
    emailMessage.subject =@"Password Recovery";
    emailMessage.wantsSecure = YES;
    emailMessage.delegate = self; // you must include <SKPSMTPMessageDelegate> to your class
    NSString *messageBody = [NSString stringWithFormat:@"Your password is: %@",struserPassword]
    ;
    //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 to your mail." 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]);
}
0 голосов
/ 20 июня 2014

Может быть, вы должны реализовать скрипт PHP, который будет отправлять электронное письмо пользователю. В ios вы можете использовать метод POST в NSURLConnection для вызова скрипта PHP. В Google можно найти множество сценариев для отправки электронной почты пользователю.

0 голосов
/ 11 января 2013

Что касается комментария к PostageApp, приведенного ниже, если вы хотите отправлять электронные письма без каких-либо проблем с настройкой SMTP-клиента, вы можете проверить упаковку PostageKit для использования службы PostageApp.Давайте отправим письма с парой строк кода надежно.

https://github.com/twg/PostageKit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...