在开发过程中,有时会需要调用原生的发送邮件功能,用来实现自己应用中的一些业务处理流程,对此,官方开放了两个API可以供开发者调用
OpenURL方式
首先,最简单的方式是调用OpenURL,代码如下:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto:10010@qq.com"]];
iOS10之后苹果官方建议使用下面的方法:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://10010@qq.com"] options:@{} completionHandler:^(BOOL success) {
if (success) {
NSLog(@"调用成功");
}else{
NSLog(@"调用失败");
}
}];
这种方式是调用原生组件的方式,打电话,发短信,发邮件,调用原生地图,甚至进入相应app的设置页面也可以使用这种方式,但使用这种方式需要跳出当前app,且无法监听用户操作。
MessageUI
系统还提供了页面调用方式,不用跳出当前app也能使用发送邮件的功能,而且可以监听用户操作。
下面是调用步骤:
1.导入MessageUI头文件
#import <MessageUI/MessageUI.h>
2.调用时先判断当前设备是否支持该调用方式
if ([MFMailComposeViewController canSendMail]) {
// 判断一下是否支持发送邮件,比如模拟器
MFMailComposeViewController *mailVC = [[MFMailComposeViewController alloc] init];
// 需要发送的邮箱数组
[mailVC setToRecipients:@[@"test@qq.com", @"test1@11.com"]];
// 需要抄送的邮箱数组
[mailVC setCcRecipients:@[@"test2@qq.com", @"test3@11.com"]];
// 需要密送的邮箱数组
[mailVC setBccRecipients:@[@"test2@qq.com", @"test3@11.com"]];
// 邮件主题
[mailVC setSubject:@"邮件主题"];
// 添加一张图片
UIImage *addPic = [UIImage imageNamed:@"756DACBA-C620-4829-BD29-36289AB948BC.png"];
NSData *imageData = UIImagePNGRepresentation(addPic);// png
[mailVC addAttachmentData:imageData mimeType:@"image" fileName:@"Icon.png"];
// 关于mimeType:http://www.iana.org/assignments/media-types/
// application
// audio
// font
// example
// image
// message
// model
// multipart
// text
// video
// 添加一个附件
NSData *pdf = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://jamesfiles.oss-cn-hangzhou.aliyuncs.com/190619/2816435-14aa3174d94a7eff.png"]];
// 关于mimeType:http://www.iana.org/assignments/media-types/
[mailVC addAttachmentData:pdf mimeType:@"application" fileName:@"附加名称.png"];
// 富文本为 isHTML:YES 字符串isHTML:NO
NSString *emailBody = @"<font color='red'>eMail</font> 我的邮件";
[mailVC setMessageBody:emailBody isHTML:YES];
mailVC.mailComposeDelegate = self; //指定代理
[self presentViewController:mailVC animated:YES completion:nil];
} else {
NSLog(@"该设备不支持发送邮件功能");
}
3.遵循MessageUI的代理方法(MFMailComposeViewControllerDelegate)
进入头文件后可以看到,MessageUI只有一个代理方法
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(nullable NSError *)error ;
按住command,点击MFMailComposeResult类,可以看到,代理返回的result是个枚举类型
typedef NS_ENUM(NSInteger, MFMailComposeResult) {
MFMailComposeResultCancelled, // 用户取消了操作
MFMailComposeResultSaved,// 成功保存了消息
MFMailComposeResultSent,// 用户成功发送或排队中
MFMailComposeResultFailed// 用户保存或发送失败
} API_AVAILABLE(ios(3.0)) ;
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
switch (result) {
case MFMailComposeResultSent:
NSLog(@"用户成功发送或排队中");
break;
case MFMailComposeResultCancelled:
NSLog(@"用户取消发送");
break;
case MFMailComposeResultSaved:
NSLog(@"邮件已保存");
break;
default:
NSLog(@"发送或保存失败");
break;
}
[controller dismissViewControllerAnimated:YES completion:nil];
}