如何在不显示MFMailComposeViewController的情况下从iphone应用程序发送邮件?

时间:2012-02-24 07:37:00

标签: iphone objective-c ios sendmail mfmailcomposeviewcontroller

我想从我的自定义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 个答案:

答案 0 :(得分:14)

从iphone应用程序以编程方式发送电子邮件,无需用户干预,无法使用任何Apple框架实施。这可能是一个越狱手机,但它永远不会看到App Store的内部。

如果您想控制电子邮件发送,那么更好的方法是设置一个Web服务(在您的服务器端),您可以使用HTTP请求发布。如果您只发布到一个地址,这可以很好地工作,尽管您可能希望让用户输入他们的回邮地址。

否则只有标准对话框可用(这依赖于使用他们在设备上设置的任何帐户)。

答案 1 :(得分:5)

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...
    }
    
  6. 现在,处理委托方法:

    //成功

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

    好的,那就是编码方面的一切。希望本教程可能对您有用#guy p