IOS发送Email的方法

来源:互联网 发布:八个字网络流行语 编辑:程序博客网 时间:2024/06/10 17:41
IOS系统框架提供的两种发送Email的方法:openURL 和 MFMailComposeViewController。借助这两个方法,我们可以轻松的在应用里加入如用户反馈这类需要发送邮件的功能。

 

1.openURL

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

 

//   //  ViewController.h   //  MailDemo   //   //  Created by LUOYL on 12-4-4.   //  Copyright (c) 2012年 http://luoyl.info. All rights reserved.   //     #import <UIKit/UIKit.h>   #import <MessageUI/MFMailComposeViewController.h>     @interface ViewController : UIViewController<MFMailComposeViewControllerDelegate>     @end  

 

 

#pragma mark - 在应用内发送邮件   //激活邮件功能   - (void)sendMailInApp   {       Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));        if (!mailClass) {           [self alertWithMessage:@"当前系统版本不支持应用内发送邮件功能,您可以使用mailto方法代替"];           return;       }       if (![mailClass canSendMail]) {           [self alertWithMessage:@"用户没有设置邮件账户"];           return;       }       [self displayMailPicker];   }     //调出邮件发送窗口   - (void)displayMailPicker   {       MFMailComposeViewController *mailPicker = [[MFMailComposeViewController alloc] init];         mailPicker.mailComposeDelegate = self;                //设置主题         [mailPicker setSubject: @"eMail主题"];         //添加收件人       NSArray *toRecipients = [NSArray arrayWithObject: @"first@example.com"];       [mailPicker setToRecipients: toRecipients];         //添加抄送       NSArray *ccRecipients = [NSArray arrayWithObjects:@"second@example.com", @"third@example.com", nil];         [mailPicker setCcRecipients:ccRecipients];             //添加密送       NSArray *bccRecipients = [NSArray arrayWithObjects:@"fourth@example.com", nil];         [mailPicker setBccRecipients:bccRecipients];                // 添加一张图片         UIImage *addPic = [UIImage imageNamed: @"Icon@2x.png"];         NSData *imageData = UIImagePNGRepresentation(addPic);            // png            //关于mimeType:http://www.iana.org/assignments/media-types/index.html       [mailPicker addAttachmentData: imageData mimeType: @"" fileName: @"Icon.png"];             //添加一个pdf附件       NSString *file = [self fullBundlePathFromRelativePath:@"高质量C++编程指南.pdf"];       NSData *pdf = [NSData dataWithContentsOfFile:file];       [mailPicker addAttachmentData: pdf mimeType: @"" fileName: @"高质量C++编程指南.pdf"];           NSString *emailBody = @"<font color='red'>eMail</font> 正文";         [mailPicker setMessageBody:emailBody isHTML:YES];         [self presentModalViewController: mailPicker animated:YES];         [mailPicker release];     }     #pragma mark - 实现 MFMailComposeViewControllerDelegate    - (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error   {       //关闭邮件发送窗口       [self dismissModalViewControllerAnimated:YES];       NSString *msg;         switch (result) {             case MFMailComposeResultCancelled:                 msg = @"用户取消编辑邮件";                 break;             case MFMailComposeResultSaved:                 msg = @"用户成功保存邮件";                 break;             case MFMailComposeResultSent:                 msg = @"用户点击发送,将邮件放到队列中,还没发送";                 break;             case MFMailComposeResultFailed:                 msg = @"用户试图保存或者发送邮件失败";                 break;             default:                 msg = @"";               break;         }         [self alertWithMessage:msg];   }   

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

 

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

 https://github.com/jetseven/skpsmtpmessage

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

SKPSMTPMessage *testMsg = [[SKPSMTPMessage alloc] init];testMsg.fromEmail = @"test@gmail.com";testMsg.toEmail =@"to@gmail.com";testMsg.relayHost = @"smtp.gmail.com";testMsg.requiresAuth = YES;testMsg.login = @"test@gmail.com";testMsg.pass = @"test";testMsg.subject = [NSString stringWithCString:"测试" encoding:NSUTF8StringEncoding];testMsg.bccEmail = @"bcc@gmail.com";testMsg.wantsSecure = YES; // smtp.gmail.com doesn't work without TLS! // Only do this for self-signed certs!// testMsg.validateSSLChain = NO;testMsg.delegate = self; NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain",kSKPSMTPPartContentTypeKey,[NSString stringWithCString:"测试正文" encoding:NSUTF8StringEncoding],kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil]; NSString *vcfPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"vcf"];NSData *vcfData = [NSData dataWithContentsOfFile:vcfPath]; NSDictionary *vcfPart = [NSDictionary dictionaryWithObjectsAndKeys: @"text/directory;\r\n\tx-unix-mode=0644;\r\n\tname=\"test.vcf\"",kSKPSMTPPartContentTypeKey,@"attachment;\r\n\tfilename=\"test.vcf\"",kSKPSMTPPartContentDispositionKey,[vcfData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil]; testMsg.parts = [NSArray arrayWithObjects:plainPart,vcfPart,nil]; [testMsg send];

 

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

-(void)messageSent:(SKPSMTPMessage *)message;-(void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error;

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 天猫商家发货发个空包裹怎么办 无限流量怎么办没有4g 海外直邮身份证过期了怎么办 买车的人不过户怎么办 天猫精灵球泡离线怎么办 花呗被骗了2万怎么办 天猫公司变更地址发票怎么办 支付宝自助解限怎么办 支付宝16岁限额怎么办 支付宝提不了现怎么办 支付宝余额受限需要身份证怎么办 微信被骗了6000怎么办 被代运营骗了该怎么办 淘宝店铺过节放假无人打理怎么办 淘宝店太久没打理出现未开店怎么办 淘宝店关了售后怎么办 发货运单号发错了怎么办 天猫积分为零怎么办 山东聊城小型车脱审一年怎么办? 廉租房如果夫妻离婚怎么办 淘宝客服不给退货怎么办 天猫客服打字慢怎么办 京东买的kindle坏了怎么办 欧巴怎么办韩语怎么写 聚划算淘宝口令打不开怎么办 道聚城白银礼包下架怎么办 聚星输了很多钱怎么办 弹力运动裤被烟烧了个洞怎么办 生完宝宝胯宽怎么办 黑色纯棉裤子洗的发白怎么办 金盾保险柜密码忘了怎么办 装修好的房子漏水怎么办 刚装修的房子墙面开裂怎么办 刚装修的房子有味道怎么办 代销产品规格填写不完整怎么办 我的信息被泄露怎么办 进入不良网站手机发信息怎么办 发不良信息被停机了怎么办 手机qq登录显示被冻结怎么办 qq账户被冻结了怎么办 qq钱包账户被永久冻结怎么办