【问题标题】:How to send mail from iphone app without showing MFMailComposeViewController?如何在不显示 MFMailComposeViewController 的情况下从 iphone 应用程序发送邮件?
【发布时间】:2012-02-24 07:37:00
【问题描述】:

我想从我的定制 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];

【问题讨论】:

    标签: iphone objective-c ios sendmail mfmailcomposeviewcontroller


    【解决方案1】:

    在没有用户干预的情况下,从 iphone 应用程序以编程方式发送电子邮件,不能使用任何 Apple 框架来实现。在越狱的手机中可能是可能的,但它永远不会看到 App Store 的内部。

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

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

    【讨论】:

    • 您能否详细说明您的答案?有这方面的样品吗?我也在努力发送邮件。谢谢。
    • 正如我所说,未经用户同意,您无法从 iOS 设备发送电子邮件。那你还想要什么?
    • 是的,我明白了。谢谢。
    • @gopinath 如果我本着 stackoverflow 社区的精神帮助了你,请投票 :) 谢谢...
    • 声明无法完成不如链接到文章或引用官方来源有用。你有这些吗?
    【解决方案2】:

    iOS SDK 让使用内置 API 发送电子邮件变得非常容易。只需几行代码,您就可以启动与股票邮件应用程序相同的电子邮件界面,让您撰写电子邮件。您可以使用 MFMailComposeViewController 类弹出邮件编写器表单、编写消息并可以发送普通邮件或文件附件邮件。更多信息:从您的 iOS 应用发送电子邮件

    但是,在本节中,我要解释的是关于在不显示邮件编写器表的情况下发送电子邮件,即。在后台发送电子邮件。对于此功能,我们不能使用 iOS 原生 MFMailComposer 类,因为它不允许我们在后台发送电子邮件,而是会弹出邮件编辑器视图,用户必须从该视图中点击“发送”按钮,所以对于本节,我将使用 SKPSMTPMessage 库在后台发送电子邮件,但是电子邮件帐户必须在此方法上进行硬编码。

    限制:

    发件人/收件人电子邮件地址必须是硬编码的,或者您必须使用应用程序中的一些弹出表单来获取它,用户在其中输入发件人/收件人电子邮件地址。此外,发件人帐户凭据也必须进行硬编码,因为我们无法从设备设置中获取它。

    方法:

    1. 将 CFNetwork.framework 导入您的项目。
    2. 包括#import "SKPSMTPMessage.h" #import "NSData+Base64Additions.h" // 用于 Base64 编码
    3. 包含到您的 ViewController 中

    4. https://github.com/jetseven/skpsmtpmessage 下载 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]);
    }
    

    好的,这就是编码方面的全部内容。希望本教程对你有用

    【讨论】:

    • 工作正常。我只是更改了一些非 ARC 代码。此外,我已将发件人谷歌邮件帐户的设置更改为“允许访问不太安全的应用程序”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2012-02-04
    • 2020-08-16
    • 2010-09-23
    • 2012-02-20
    • 2021-05-19
    相关资源
    最近更新 更多