iOS程序中邮件发送方法有三种方式,有两种原生自带方法发送邮件,另一种是使用第三方库发送邮件。
使用原生发送邮件,前提是手机上已经登录自己的邮箱地址了,否则不能发送,需要提示用户去登录设置邮箱地址,而使用第三方库发送不需要登录邮箱号,也可以不需要告知用户将要进行邮件发送的事情,但这个可能不符合苹果的理论,当然你也可以在发送之前弄个弹出框告知用户,并让用户选择是否发送。在上线项目中我还没有使用过这个第三方库。
1)openURL(原生)——用户体验较差,程序会进入后台,跳转至邮件发送界面。
2)MFMailComposeViewController(原生)——不会进入后台,使用模态弹出邮件发送视图。
3)SKPSMTPMessage
一、使用openURL发送邮件(测试环境:真机测试)
//创建可变的地址字符串对象:
NSMutableString *mailUrl = [[NSMutableString alloc] init];
//添加收件人:
NSArray *toRecipients = @[@"1780575208@qq.com"];
// 注意:如有多个收件人,可以使用componentsJoinedByString方法连接,连接符为@","
[mailUrl appendFormat:@"mailto:%@", toRecipients[0]];
//添加抄送人:
NSArray *ccRecipients = @[@"1780575208@qq.com"];
[mailUrl appendFormat:@"?cc=%@", ccRecipients[0]];
// 添加密送人:
NSArray *bccRecipients = @[@"1780575208@qq.com"];
[mailUrl appendFormat:@"&bcc=%@", bccRecipients[0]];
//添加邮件主题和邮件内容:
[mailUrl appendString:@"&subject=my email"];
[mailUrl appendString:@"&body=<b>Hello</b> World!"];
//打开地址,这里会跳转至邮件发送界面:
NSString *emailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:emailPath]];
效果图:
注意:如果你没添加抄送或密送,主题需要设为 ?subject=my email,不然邮件会没有主题。
邮件发送使用的是mailto的语法,可以自己去查看语法。
二、使用MFMailComposeViewController发送邮件(测试环境:真机测试)
1.项目需要导入框架:MessageUI.framework
2.发送代码实现
if ([MFMailComposeViewController canSendMail]) {
// 用户已设置邮件账户
// 邮件服务器
MFMailComposeViewController *mailCompose = [[MFMailComposeViewController alloc] init];
// 设置邮件代理
[mailCompose setMailComposeDelegate:self];
// 设置邮件主题
[mailCompose setSubject:@"我是邮件主题"];
// 设置收件人
[mailCompose setToRecipients:@[@"1780575208@qq.com"]];
// 设置抄送人
[mailCompose setCcRecipients:@[@"1780575208@qq.com"]];
// 设置密抄送
[mailCompose setBccRecipients:@[@"1780575208@qq.com"]];
/**
* 设置邮件的正文内容
*/
NSString *emailContent = @"我是邮件内容";
// 是否为HTML格式
[mailCompose setMessageBody:emailContent isHTML:NO];
// 如使用HTML格式,则为以下代码
// [mailCompose setMessageBody:@"<html><body><p>Hello</p><p>World!</p></body></html>" isHTML:YES];
/**
* 添加附件
*/
UIImage *image = [UIImage imageNamed:@"1"];
NSData *imageData = UIImagePNGRepresentation(image);
[mailCompose addAttachmentData:imageData mimeType:@"" fileName:@"image.png"];
NSString *file = [[NSBundle mainBundle] pathForResource:@"123" ofType:@"pdf"];
NSData *pdf = [NSData dataWithContentsOfFile:file];
[mailCompose addAttachmentData:pdf mimeType:@"" fileName:@"file"];
// 弹出邮件发送视图
[self presentViewController:mailCompose animated:YES completion:nil];
}else{
NSLog(@"请先设置登录邮箱号");
}
3.//MFMailComposeViewControllerDelegate的代理方法,发送后关闭发送邮件视图。
- (void)mailComposeController:(MFMailComposeViewController *)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError *)error
{
switch (result)
{
case MFMailComposeResultCancelled: // 用户取消编辑
NSLog(@"Mail send canceled...");
break;
case MFMailComposeResultSaved: // 用户保存邮件
NSLog(@"Mail saved...");
break;
case MFMailComposeResultSent: // 用户点击发送
NSLog(@"Mail sent...");
break;
case MFMailComposeResultFailed: // 用户尝试保存或发送邮件失败
NSLog(@"Mail send errored: %@...", [error localizedDescription]);
break;
}
// 关闭邮件发送视图
[self dismissViewControllerAnimated:YES completion:nil];
}
效果图:
在iOS的邮件发送里,附件会直接显示在正文的下方,但是不要误认为是图片放在了正文当中,两者是有区别的!
三、使用第三方库SKPSMTPMessage发送邮件 (测试环境:真机测试、模拟器测试)
1.先导入第三方库:pod 'skpsmtpmessage'
2.如果您的程序是ARC模式,导入第三方库需要配置程序兼容ARC模式,因为这个第三方库使用的是MRC模式开发的。
我们选中工程->选中targets中的工程,选中Build phases 第二行(Compile Sources )在导入的类后面双击加入标记"-fno-objc-arc"
3.导入类#import "SKPSMTPMessage.h"、#import "NSData+Base64Additions.h"
4.发送代码实现
/*
邮箱号和SMTP的授权码是我自己编的,需要换成你们的
*/
SKPSMTPMessage *myMessage = [[SKPSMTPMessage alloc] init];
//发信人
myMessage.fromEmail=@"1230@163.com";
//收件人
myMessage.toEmail=@"2545706530@qq.com";
//bccEmail、ccEmail可传可不传,如果需要的填写
// myMessage.bccEmail=@"123567@163.com";//暗抄送
// myMessage.ccEmail = @"123567@163.com";//抄送人
//发送邮件代理服务器
// myMessage.relayHost=@"smtp.qq.com";//qq个人
// myMessage.relayHost=@"smtp.exmail.qq.com";qq企业账号
myMessage.relayHost=@"smtp.163.com";
myMessage.requiresAuth=YES;//验证身份是否登录
if (myMessage.requiresAuth) {
//发信人
myMessage.login=@"1230@163.com"; //发信人账号
myMessage.pass=@"1234ddd";//发信人的SMTP的授权码
}
myMessage.wantsSecure =YES; //需要加密
/*
163邮箱报错的
S: 554 DT:SPM 163 smtp9,DcCowADXPVEoF_FaG5peAg--.47217S3 1525749544,please see http://mail.163.com/help/help_spam_16.htm?ip=125.118.133.189&hostid=smtp9&time=1525749544
重新修改subject内容
*/
myMessage.subject = @"你的第三封信";//// 设置邮件主题
myMessage.delegate = self;// 设置邮件代理
//设置邮件内容
NSString *sendMessageStr = @"hello";
NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain; charset=UTF-8",kSKPSMTPPartContentTypeKey,sendMessageStr,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];
myMessage.parts = [NSArray arrayWithObjects:plainPart,vcfPart,nil];
// 邮件首部字段、邮件内容格式和传输编码
// [myMessage setParts:@[plainPart]];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//发送
[myMessage send];
});
4.SKPSMTPMessage代理,可以获知成功/失败进行后续步骤处理:
- (void)messageSent:(SKPSMTPMessage *)message
{
NSLog(@"%@", message);
}
- (void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error
{
NSLog(@"message - %@\nerror - %@", message, error);
}
拓展功能,发送HTML文本
1.使用SKPSMTPMessage发送html
配置跟上面一样,代码如下
if ([MFMailComposeViewController canSendMail]) { // 用户已设置邮件账户
// 邮件服务器
MFMailComposeViewController *mailCompose = [[MFMailComposeViewController alloc] init];
// 设置邮件代理
[mailCompose setMailComposeDelegate:self];
// 设置邮件主题
[mailCompose setSubject:@"我是邮件主题"];
// 设置收件人
[mailCompose setToRecipients:@[@"1780575208@qq.com"]];
// 设置抄送人
[mailCompose setCcRecipients:@[@"1780575208@qq.com"]];
// 设置密抄送
[mailCompose setBccRecipients:@[@"1780575208@qq.com"]];
/**
* 设置邮件的正文内容
*/
NSString *emailContent = self.sendStr;
// 如使用HTML格式,则为以下代码
[mailCompose setMessageBody:emailContent isHTML:YES];
// 弹出邮件发送视图
[self presentViewController:mailCompose animated:YES completion:nil];
}else{
NSLog(@"请先设置邮箱号");
}
//MFMailComposeViewControllerDelegate的代理方法:
- (void)mailComposeController:(MFMailComposeViewController *)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError *)error
{
switch (result)
{
case MFMailComposeResultCancelled: // 用户取消编辑
NSLog(@"Mail send canceled...");
break;
case MFMailComposeResultSaved: // 用户保存邮件
NSLog(@"Mail saved...");
break;
case MFMailComposeResultSent: // 用户点击发送
NSLog(@"Mail sent...");
break;
case MFMailComposeResultFailed: // 用户尝试保存或发送邮件失败
NSLog(@"Mail send errored: %@...", [error localizedDescription]);
break;
}
// 关闭邮件发送视图
[self dismissViewControllerAnimated:YES completion:nil];
}
效果图
2.使用SKPSMTPMessage发送html
配置跟上面一样,代码如下
/*
邮箱号和SMTP的授权码是我自己编的,需要换成你们的
*/
SKPSMTPMessage *myMessage = [[SKPSMTPMessage alloc] init];
//发信人
myMessage.fromEmail=@"2545706530@qq.com";
//收件人
myMessage.toEmail=@"2545706530@qq.com";
//bccEmail、ccEmail可传可不传,如果需要的填写
// myMessage.bccEmail=@"123567@163.com";//暗抄送
// myMessage.ccEmail = @"123567@163.com";//抄送人
//发送邮件代理服务器
myMessage.relayHost=@"smtp.qq.com";//qq个人
// myMessage.relayHost=@"smtp.exmail.qq.com";qq企业账号
// myMessage.relayHost=@"smtp.163.com";
myMessage.requiresAuth=YES;//验证身份是否登录
if (myMessage.requiresAuth) {
//发信人
myMessage.login=@"2545706530@qq.com"; //发信人账号
myMessage.pass=@"ilbtouxxepakeadj";//发信人的SMTP的授权码
}
myMessage.wantsSecure =YES; //需要加密
/*
163邮箱报错的
S: 554 DT:SPM 163 smtp9,DcCowADXPVEoF_FaG5peAg--.47217S3 1525749544,please see http://mail.163.com/help/help_spam_16.htm?ip=125.118.133.189&hostid=smtp9&time=1525749544
重新修改subject内容
*/
myMessage.subject = @"你好啊我是";//// 设置邮件主题
myMessage.delegate = self;// 设置邮件代理
//设置邮件内容
NSString *dataStr = self.sendStr;
NSString *sendMessageStr = [self htmlEntityDecode:dataStr];
NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/html",kSKPSMTPPartContentTypeKey,
sendMessageStr,kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];
myMessage.parts = [NSArray arrayWithObjects:plainPart,nil]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//发送
[myMessage send];
});
});
效果图:
SKPSMTPMessage使用注意事项:
1、使用授权码密码登录
邮件平台的授权码一般需要手动获取,先登录你所需要的后台,点击设置,开启SMTP服务,生成授权码,设置账号登录的时候,用户名还填自己的,密码填写授权码。
2、添加附件的时候使用
testMsg.parts = [NSArray arrayWithObjects:plainPart,vcfPart,nil];
参考文章:
iOS开发-发送邮件(E-mail)方法整理合集(共3种)
iOS开发-内部邮件发送功能实现
使用的第三方框架:
SKPSMTPMessage 第三方库发送邮件
ZSSRichTextEditor 自定义内容html发送邮件