iOS 调用系统邮件,上传pdf、doc等附件

MFMailComposeViewController是iOS内置的写邮件控制器,可以在自己的应用中调用该控制器实现写邮件,还能上传附件,并能通过代理MFMailComposeViewControllerDelegate的方法返回到自己的应用中。
只要通过设置附件的文件名字和mimeType,便可以从bundle中读取各种html所支持mimeType文件类型,作为附件上传。使用NSData dataWithContentsOfFile:方法将这些文件转为NSData即可。
步骤:
1.新建MFMailComposeViewController的对象,设置其代理为另一控制器。

  if (mailController == nil) {

        mailController = [[MFMailComposeViewController alloc]init];

        mailController.mailComposeDelegate = self;}

2.使代理控制器遵循协议。并实现代理方法。

@interface ViewController : UIViewController<MFMailComposeViewControllerDelegate>

3.判断当前设备是否支持邮件发送:[MFMailComposeViewController canSendMail]

4.如果支持,则可以使用如下方法设置发件人,转发人,附件等。

-(void)sendMailWithEnclosure:(UIButton*)sender

{

      UIButton *btn = sender;

    NSString *name = nil;

    NSString *mimeType = nil;

    

    if (btn.tag == 10) {

        name =@"pdf附件.pdf";

        mimeType =@"application/pdf";

    }else if(btn.tag == 20){

        name =@"pages附件.doc";

        mimeType =@"application/msword";

    }

    if ([MFMailComposeViewControllercanSendMail]) {

        [mailControllersetSubject:@"测试邮件发送附件"];

        [mailControllersetToRecipients:[NSArrayarrayWithObjects:@"ouyang****@163.com", nil]];

        [mailControllersetMessageBody:@"Test SendMailWithEnclosure!"isHTML:NO];

        

        NSString *path = [[NSBundlemainBundle] bundlePath];

        NSString *finalPath = [path stringByAppendingPathComponent:name];

        NSData *Data = [NSDatadataWithContentsOfFile:finalPath];

        

        //发送文件的NSData,类型,附件名

        [mailController addAttachmentData:Data mimeType:mimeType fileName:name];

        NSLog(@"%@,%@",mimeType,name);

        

       [self presentViewController:mailController animated:YES completion:nil];

        //把当前controller变为mailcontroller

    }

}

5.代理方法中对邮件发送结果进行判断:

 #pragma mark -MFMailComposeViewControllerDelegate

 - (void)mailComposeController:(MFMailComposeViewController*)controller

          didFinishWithResult:(MFMailComposeResult)result

                        error:(NSError*)error

{

    NSString *resultString = nil;

    switch (result){

            

        caseMFMailComposeResultCancelled:

            resultString = [NSString stringWithFormat:@"Mail send canceled…"];

            

            break;

            

        caseMFMailComposeResultSaved:

            resultString = [NSString stringWithFormat:@"Mail saved…"];

            

            break;

            

        caseMFMailComposeResultSent:

            resultString = [NSString stringWithFormat:@"Mail sent out…"];

            

            break;

            

        caseMFMailComposeResultFailed:

            resultString = [NSStringstringWithFormat:@"%@", [error localizedDescription]];

            

            break;

            

        default:

            break;

            

    }

    

    UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:@"提示"message:resultString delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:nil];

    [alert show];

    [self dismissViewControllerAnimated:YES completion:nil];

    mailController = nil;

}

注意:
1.真机才支持发送邮件,模拟器会模拟邮件的发送,但是收件人收不到邮件。
2.MFMailComposeViewController的父类是UINavigationController,所以在展示UINavigationController的控制器时,不能使用导航控制器的push和pop方法展示MFMailComposeViewController的对象。
3.使用mailto发送邮件,无法通过代理方法直接返回自己的应用。

    

    mailto四个常用的参数

    subject -- 代表邮件的标题

    body -- 代表邮件的内容

    cc -- 代表一个抄送对象

    bcc -- 代表一个暗送对象

拼接方法:

    NSString*urlString =@"mailto:abc@example.com?cc=cde@example.com&subject=Greetings!&body=Wishes!";

    [[UIApplicationsharedApplication] openURL:[NSURLURLWithString:urlString]];

 4.MIME type格式查询:
  http://www.freeformatter.com/mime-types-list.html