IOS系统框架提供的两种发送Email的方法:openURL 和 MFMailComposeViewController。借助这两个方法,我们可以轻松的在应用里加入如用户反馈这类需要发送邮件的功能。

1.openURL

使用openURL调用系统邮箱客户端是我们在IOS3.0以下实现发邮件功能的主要手段。我们可以通过设置url里的相关参数来指定邮件的内容,不过其缺点很明显,这样的过程会导致程序暂时退出。下面是使用openURL来发邮件的一个小例子:
C代码  
  1. #pragma mark - 使用系统邮件客户端发送邮件
  2. -(void)launchMailApp
  3. {
  4. NSMutableString *mailUrl = [[[NSMutableString alloc]init]autorelease];
  5. //添加收件人
  6. NSArray *toRecipients = [NSArray arrayWithObject: @"first@example.com"];
  7. [mailUrl appendFormat:@"mailto:%@", [toRecipients componentsJoinedByString:@","]];
  8. //添加抄送
  9. NSArray *ccRecipients = [NSArray arrayWithObjects:@"second@example.com", @"third@example.com", nil];
  10. [mailUrl appendFormat:@"?cc=%@", [ccRecipients componentsJoinedByString:@","]];
  11. //添加密送
  12. NSArray *bccRecipients = [NSArray arrayWithObjects:@"fourth@example.com", nil];
  13. [mailUrl appendFormat:@"&bcc=%@", [bccRecipients componentsJoinedByString:@","]];
  14. //添加主题
  15. [mailUrl appendString:@"&subject=my email"];
  16. //添加邮件内容
  17. [mailUrl appendString:@"&body=<b>email</b> body!"];
  18. NSString* email = [mailUrl stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
  19. [[UIApplication sharedApplication] openURL: [NSURL URLWithString:email]];
  20. }

缺点很明显,这样的过程会导致程序暂时退出,即使在iOS 4.x支持多任务的情况下,这样的过程还是会让人觉得不是很方便。

2.MFMailComposeViewController

MFMailComposeViewController是在IOS3.0新增的一个接口,它在MessageUI.framework中。通过调用MFMailComposeViewController,可以把邮件发送窗口集成到我们的应用里,发送邮件就不需要退出程序了。MFMailComposeViewController的使用方法:
  • 1.项目中引入MessageUI.framework;
  • 2.在使用的文件中导入MFMailComposeViewController.h头文件;
  • 3.实现MFMailComposeViewControllerDelegate,处理邮件发送事件;
  • 4.调出邮件发送窗口前先使用MFMailComposeViewController里的“+ (BOOL)canSendMail”方法检查用户是否设置了邮件账户;
  • 5.初始化MFMailComposeViewController,构造邮件体
C代码  
  1. //
  2. //  ViewController.h
  3. //  MailDemo
  4. //
  5. //  Created by LUOYL on 12-4-4.
  6. //  Copyright (c) 2012年 http://luoyl.info. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #import <MessageUI/MFMailComposeViewController.h>
  10. @interface ViewController : UIViewController<MFMailComposeViewControllerDelegate>
  11. @end
Java代码  
  1. #pragma mark - 在应用内发送邮件
  2. //激活邮件功能
  3. - (void)sendMailInApp
  4. {
  5. Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
  6. if (!mailClass) {
  7. [self alertWithMessage:@"当前系统版本不支持应用内发送邮件功能,您可以使用mailto方法代替"];
  8. return;
  9. }
  10. if (![mailClass canSendMail]) {
  11. [self alertWithMessage:@"用户没有设置邮件账户"];
  12. return;
  13. }
  14. [self displayMailPicker];
  15. }
  16. //调出邮件发送窗口
  17. - (void)displayMailPicker
  18. {
  19. MFMailComposeViewController *mailPicker = [[MFMailComposeViewController alloc] init];
  20. mailPicker.mailComposeDelegate = self;
  21. //设置主题
  22. [mailPicker setSubject: @"eMail主题"];
  23. //添加收件人
  24. NSArray *toRecipients = [NSArray arrayWithObject: @"first@example.com"];
  25. [mailPicker setToRecipients: toRecipients];
  26. //添加抄送
  27. NSArray *ccRecipients = [NSArray arrayWithObjects:@"second@example.com", @"third@example.com", nil];
  28. [mailPicker setCcRecipients:ccRecipients];
  29. //添加密送
  30. NSArray *bccRecipients = [NSArray arrayWithObjects:@"fourth@example.com", nil];
  31. [mailPicker setBccRecipients:bccRecipients];
  32. // 添加一张图片
  33. UIImage *addPic = [UIImage imageNamed: @"Icon@2x.png"];
  34. NSData *imageData = UIImagePNGRepresentation(addPic);            // png
  35. //关于mimeType:http://www.iana.org/assignments/media-types/index.html
  36. [mailPicker addAttachmentData: imageData mimeType: @"" fileName: @"Icon.png"];
  37. //添加一个pdf附件
  38. NSString *file = [self fullBundlePathFromRelativePath:@"高质量C++编程指南.pdf"];
  39. NSData *pdf = [NSData dataWithContentsOfFile:file];
  40. [mailPicker addAttachmentData: pdf mimeType: @"" fileName: @"高质量C++编程指南.pdf"];
  41. NSString *emailBody = @"<font color='red'>eMail</font> 正文";
  42. [mailPicker setMessageBody:emailBody isHTML:YES];
  43. [self presentModalViewController: mailPicker animated:YES];
  44. [mailPicker release];
  45. }
  46. #pragma mark - 实现 MFMailComposeViewControllerDelegate
  47. - (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
  48. {
  49. //关闭邮件发送窗口
  50. [self dismissModalViewControllerAnimated:YES];
  51. NSString *msg;
  52. switch (result) {
  53. case MFMailComposeResultCancelled:
  54. msg = @"用户取消编辑邮件";
  55. break;
  56. case MFMailComposeResultSaved:
  57. msg = @"用户成功保存邮件";
  58. break;
  59. case MFMailComposeResultSent:
  60. msg = @"用户点击发送,将邮件放到队列中,还没发送";
  61. break;
  62. case MFMailComposeResultFailed:
  63. msg = @"用户试图保存或者发送邮件失败";
  64. break;
  65. default:
  66. msg = @"";
  67. break;
  68. }
  69. [self alertWithMessage:msg];
  70. }

第二种方法的劣势也很明显,iOS系统替我们提供了一个mail中的UI,而我们却完全无法对齐进行订制,这会让那些定制化成自己风格的App望而却步,因为这样使用的话无疑太突兀了。

3、我们可以根据自己的UI设计需求来定制相应的视图以适应整体的设计。可以使用比较有名的开源SMTP协议来实现。

https://github.com/jetseven/skpsmtpmessage

在SKPSMTPMessage类中,并没有对视图进行任何的要求,它提供的都是数据层级的处理,你之需要定义好相应的发送要求就可以实现邮件发送了。至于是以什么样的方式获取这些信息,就可以根据软件的需求来确定交互方式和视图样式了。

Java代码  
  1. SKPSMTPMessage *testMsg = [[SKPSMTPMessage alloc] init];
  2. testMsg.fromEmail = @"test@gmail.com";
  3. testMsg.toEmail =@"to@gmail.com";
  4. testMsg.relayHost = @"smtp.gmail.com";
  5. testMsg.requiresAuth = YES;
  6. testMsg.login = @"test@gmail.com";
  7. testMsg.pass = @"test";
  8. testMsg.subject = [NSString stringWithCString:"测试" encoding:NSUTF8StringEncoding];
  9. testMsg.bccEmail = @"bcc@gmail.com";
  10. testMsg.wantsSecure = YES; // smtp.gmail.com doesn't work without TLS!
  11. // Only do this for self-signed certs!
  12. // testMsg.validateSSLChain = NO;
  13. testMsg.delegate = self;
  14. NSDictionary *plainPart = [NSDictionary
  15. dictionaryWithObjectsAndKeys:@"text/plain",kSKPSMTPPartContentTypeKey,
  16. [NSString stringWithCString:"测试正文" encoding:NSUTF8StringEncoding],
  17. kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];
  18. NSString *vcfPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"vcf"];
  19. NSData *vcfData = [NSData dataWithContentsOfFile:vcfPath];
  20. NSDictionary *vcfPart = [NSDictionary dictionaryWithObjectsAndKeys: @"text/directory;\r\n\tx-unix-mode=0644;\r\n\tname=\"test.vcf\"",kSKPSMTPPartContentTypeKey,
  21. @"attachment;\r\n\tfilename=\"test.vcf\"",kSKPSMTPPartContentDispositionKey,
  22. [vcfData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil];
  23. testMsg.parts = [NSArray arrayWithObjects:plainPart,vcfPart,nil];
  24. [testMsg send];

该类也提供了相应的Delegate方法来让你更好的获知发送的状态.

Java代码  
  1. -(void)messageSent:(SKPSMTPMessage *)message;
  2. -(void)messageFailed:(SKPSMTPMessage *)message
  3. error:(NSError *)error;

iOS开发-Email的发送方法相关推荐

  1. iOS开发中常用的方法

    iOS开发中常用的方法 系统弹窗: 过期方法: UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"确认报价" ...

  2. iOS开发使用半透明模糊效果方法整理

    转载:http://www.cocoachina.com/ios/20141223/10731.html 虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范 ...

  3. [转]iOS开发使用半透明模糊效果方法整理

    转自:http://www.molotang.com/articles/1921.html 虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包 ...

  4. iOS开发之邮件发送代码

    [java] view plaincopy 检测设备是否支持邮件发送功能 Class mailClass = (NSClassFromString(@"MFMailComposeViewCo ...

  5. IOS开发之----常用加密方法

    本文转载至 http://blog.csdn.net/wildfireli/article/details/23191983 (AES.MD5.Base64) 分类: iPhone 2014-04-0 ...

  6. iOS开发 ☞ 那些最熟悉的陌生方法

    原文链接:http://blog.csdn.net/magicZYJ/article/details/51873894 1.addSubview 当我们调用 [superView addSubview ...

  7. iOS开发-UIColor转UIIamge方法

    只能说太神奇了,完美应用到我的毕业设计 - (UIImage*) createImageWithColor: (UIColor*) color {CGRect rect=CGRectMake(0,0, ...

  8. iOS开发 NSPredicate的使用方法

    1. 概念 1. 谓词(NSPredicate)是什么? Xcode的开发者文档中的解释: A definition of logical conditions used to constrain a ...

  9. IOS开发-Nsstring中搜索方法rangeOfString

    NSString *str1 = @"can you \n speak English"; NSString *str = @"\n"; //在str1这个字符 ...

最新文章

  1. Android之旅---Service
  2. -f shell 模糊匹配_生产力工具:shell 与 Bash 脚本
  3. Java黑皮书课后题第4章:*4.23(金融应用:酬金)编写一个程序,读取下面信息,然后输出一个酬金声明
  4. Linux 命令之 sed -- 功能强大的流式文本编辑器
  5. 密码学基本概念(一)
  6. linux 开放5222端口,ejabberd 安装配置
  7. 操作系统原理 —— 操作系统概述
  8. 使用Tslib在触摸屏上显示汉字
  9. leetcode [78] Subsets
  10. HDU2089 不要62【数位DP+记忆化搜索】
  11. python画蜡烛致敬烈士_Python量化交易-绘制蜡烛图 !这个图不像你的钱哦!
  12. python常用数据结构及算法_常用数据结构和算法汇总
  13. matlab着重标出某个点,MATLAB与数学实验讲义资料.doc
  14. 设计模式之Bridge模式(桥接模式)
  15. 组装台式计算机的部件,组装台式电脑各配件的简单介绍
  16. python无法打开_终端里为什么无法运行python?
  17. aspen如何确定塔板数_Aspen中有关回流比、塔板数、进料板位置等灵敏度分析作用...
  18. CS5265方案应用|TYPEC投屏方案| Type-C转HDMI4K60HZ转换方案
  19. 爱普生打印机在计算机上的地址,爱普生打印机怎么使用 爱普生打印机使用方法【详解】...
  20. python和大数据有什么关系

热门文章

  1. Oracle增加表分区
  2. iphone开发教程(1) iOS大纲
  3. 菜单箭头旋转180度
  4. html 滚动条置顶,css怎么设置网页下拉条(滚动条)样式?
  5. 这个gayhub的大佬作者,更新起ChatGPT的项目,简直是高产如奶牛呐!实战网页版chatgpt-web源码(上)
  6. 【已解决】使用pip安装包提示TLS证书错误解决办法
  7. 告别GIF,使用Jetpack Compose打造可爱的天气动画
  8. 从根上理解高性能、高并发(二):深入操作系统,理解I/O与零拷贝技术
  9. python排列组合结果输出_排列组合总结:将结果进行输出的实现方法
  10. Degenerate dimensions (退化的维)