前言
在iOS开发中,有时候我们需要使用到发送邮件的功能,比如说接收用户的反馈信息、APP的崩溃情况的通知等等。
iOS系统提供了两种原生方式已供开发者发送邮件(email):
1)openURL(原生)
——用户体验较差,程序会进入后台,跳转至邮件发送界面。
2)MFMailComposeViewController(原生)
——不会进入后台,使用模态弹出邮件发送视图。
这里主要介绍第三种,采用静默方式发送的email:
使用到的库:
SKPSMTPMessage
下载地址:
https://github.com/jetseven/skpsmtpmessage
—— 你可以不需要告知用户将要进行邮件发送的事情,我在想这个是不是不符合苹果的理论。当然你也可以在发送之前弄个弹出框告知用户,并让用户选择是否发送。
小主在Xcode 8.1,真机(iOS 10.2.1)环境下亲测通过,这里就如何使用该库做一下说明,希望对其他有需要的同学有帮助。
1、工程配置
我是手动导进工程里,因为该库是使用MRC开发的,所以就要设置进行相应的设置。
在项目的build phrases->compile source->找到SKPSMTPMessage.m,NSStream+SKPSMTPExtensions.m这两个文件,双击后再弹框中添加-fno-objc-arc
。
可见图例:
2、引入头文件
#import "SKPSMTPMessage.h"
#import "NSData+Base64Additions.h"
3、遵循协议
SKPSMTPMessageDelegate
4、协议的实现
#pragma mark - SKPSMTPMessageDelegate
- (void)messageSent:(SKPSMTPMessage *)message
{
[self.view makeToast:@"发送邮件成功" duration:1 position:@"center"];
}
- (void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error
{
[self.view makeToast:[NSString stringWithFormat:@"发送邮件失败nerror - %@",error] duration:1 position:@"center"];
NSLog(@"message - %@\nerror - %@", message, error);
}
5、方法的实现
- (void)sendEmail
{
SKPSMTPMessage *myMessage = [[SKPSMTPMessage alloc] init];
//此处发件箱已163为例:
myMessage.fromEmail = @"******@163.com";//发送者邮箱
myMessage.toEmail = @"******@qq.com";//收件邮箱
//myMessage.bccEmail = @"******@qq.com";//抄送
//myMessage.relayHost = @"smtp.exmail.qq.com";//发送地址host 腾讯企业邮箱:smtp.exmail.qq.com
myMessage.relayHost = @"smtp.163.com";
myMessage.requiresAuth = YES;
if (myMessage.requiresAuth) {
myMessage.login = @"******@163.com";//发送者邮箱的用户名
myMessage.pass = @"******";//发送者邮箱的密码
}
myMessage.wantsSecure = YES;//为gmail邮箱设置 smtp.gmail.com
myMessage.subject = @"iOS静默方式发送的email";//邮件主题
myMessage.delegate = self;
/* >>>>>>>>>>>>>>>>>>>> * 设置邮件内容 * <<<<<<<<<<<<<<<<<<<< */
//1.文字信息
NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain; charset=UTF-8",kSKPSMTPPartContentTypeKey, @"是不是很简单呀,这样一封email就发送成功了呢!",kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];
/* >>>>>>>>>>>>>>>>>>>> * 添加附件 * <<<<<<<<<<<<<<<<<<<< */
/*
//2.联系人信息附件
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];
*/
//3.图片和视频附件
/*
//3.1视频附件
NSDictionary *videoPart = [NSDictionary dictionaryWithObjectsAndKeys:@"video/quicktime;\r\n\tx-unix-mode=0644;\r\n\tname=\"video.mov\"",kSKPSMTPPartContentTypeKey,
@"attachment;\r\n\tfilename=\"video.mov\"",kSKPSMTPPartContentDispositionKey,[videoData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil];
*/
//获取当前屏幕截图
UIGraphicsBeginImageContextWithOptions(CGSizeMake(kIPHONE_WIDTH, kIPHONE_HEIGHT), NO, [[UIScreen mainScreen] scale]);
[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:NO];
UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImageJPEGRepresentation(snapshot, 1.0);
//3.2图片附件
NSDictionary *imagePart = [NSDictionary dictionaryWithObjectsAndKeys:@"image/jpg;\r\n\tx-unix-mode=0644;\r\n\tname=\"snapshot.jpg\"",kSKPSMTPPartContentTypeKey,
@"attachment;\r\n\tfilename=\"snapshot.jpg\"",kSKPSMTPPartContentDispositionKey,[imageData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil];
myMessage.parts = [NSArray arrayWithObjects:plainPart,imagePart,nil];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[myMessage send];
});
}