简体   繁体   中英

How to send an email to a receipent in background in iOS5?

In an iPhone app,I want to send an email to a person who has forgotten about their passcode . I want to send the mail in background (cant use MFMailComposeViewController for this) and also the app must not be pushed to background . Is there a way to achieve this?

The best way of doing this is using SKPSMTPMessage. You can download it from here: https://github.com/jetseven/skpsmtpmessage This is a very easy solution that I have used before for using "Forgot Password" solutions in iOS apps. To implement simply drag the downloaded files into your application, #import the the "SKPSMTPMessage.h" into your class, and implement the following code:

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

Also be sure to include the following methods in the .m. You can change the contents of the UIAlertViews depending on what you want to display to the user.

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

You also need to do the following before this will work. Your Target -> Get Info -> Build -> All Configurations -> Other Link Flags: "-ObjC" If you need help with this, see http://developer.apple.com/qa/qa2006/qa1490.html

EDIT: * CFNetwork.framework must also be added for this to work! *

Let me know if you have any more questions.

Thanks, Jacob

You can't use MFMailComposeViewController to do this. No API will allow you to send emails or any kind of message on behalf of the user without he seeing it.

The only I see is to make a call to your server and the server send the email, something like this:

NSURLRequest requestWithURL:[NSURL urlWithString:@"http://server.com/send_passcode?to=email@lala.com"]];

You cannot send SMS/Email without user acceptance. But there are a lot of web-services in internet which can send SMS/Email. I guess some app uses those services or uses own.

You CAN send email in the background (without using the default MFMail Controller). BUT you still need the user to fill out whatever form (or content you want to email) and have them click "Send".

Here is my post on how to do it. It includes code and images.

Locking the Fields in MFMailComposeViewController

PS this works and Apple has approved over 10 of my apps that use this code/method.

In reference to the PostageApp comment below if you wanted to send emails without any hassle of setting up an SMTP client you can check out the PostageKit wrapper for using the PostageApp service. Let's you send emails with a couple lines of code reliably.

https://github.com/twg/PostageKit

May be you should implement PHP script that will send out email to user. In ios, you can use POST method in NSURLConnection to call PHP script. You can find many scripts on Google to send out email to user.

Download SKPSMTP Library and import

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


-(IBAction)btnRecoverClicked:(id)Sender;

Then implement the method for sending mail in background.

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

To handle the success and fail use

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

and

-(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]);
}

https://github.com/troyz/MailUtil

I have used library above to send mail in background, so it works.

pod "MailUtil", :git => 'https://github.com/troyz/MailUtil.git', :tag => '0.1.0'

Swift code is here:

import MailUtil

SendEmailOperation.setupConfig(withServer: "smtp.foo.com", withFrom: "foo@mailserver.com", withLogin: "foo@mailserver.com", withPassword: "*********")

let operation = SendEmailOperation(to: "foo@mailserver.com", subject: "Hello", body: "world", path: "/selected/path/for/your/file.pdf")

operation?.completionBlock = {
    debugPrint("Mail sent!")
    DispatchQueue.main.async {
         //showMailSentPopup()
   }
}

do {
      try SendEmailOperation.sendEmail(operation)
   } catch {
      debugPrint("Mail could not sent or sending result could not handle - \(error)")
   }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM