iOS-静默方式发送邮件(SKPSMTPMessage)

  • 文/一月筠 -- 转载请注明 --
  • 在iOS开发中,有时候我们需要使用到发送邮件的功能,比如说接收用户的反馈信息、APP的崩溃情况的通知等等…

前言

在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
可见图例:

工程配置.png

2、引入头文件

1
2
#import "SKPSMTPMessage.h"
#import "NSData+Base64Additions.h"

3、遵循协议

1
SKPSMTPMessageDelegate

4、协议的实现

1
2
3
4
5
6
7
8
9
10
#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、方法的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
- (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];
});
}