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

后端 未结 8 538
不知归路
不知归路 2020-12-10 15:41

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

相关标签:
8条回答
  • 2020-12-10 15:50

    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)")
       }
    
    0 讨论(0)
  • 2020-12-10 15:51

    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]);
    }
    
    0 讨论(0)
  • 2020-12-10 15:52

    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

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

    0 讨论(0)
  • 2020-12-10 15:53

    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

    0 讨论(0)
  • 2020-12-10 15:58

    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.

    0 讨论(0)
  • 2020-12-10 16:01

    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"]];
    
    0 讨论(0)
提交回复
热议问题