mailcore2 的使用与问题解决
前言
MailCore是由MailCore团队开发维护的一个支持POP和IMAP 接收邮件协议以及smtp邮件发送协议。MailCore2是MailCore的下一代产品。
一、下载及运行配置
源码下载:传送门~
通过pod 或者直接下载源码把mailcore2,打开时选择buildmac 文件夹工程直接拖进你的工程
另需要配置一些参数和添加必要的系统支持库如下:
1.、添加CFNetwork.framework、Security.framework、libMailCore-ios.a
2、你的工程build Setting添加: 'Other Linker Flags': -lctemplate-ios -letpan-ios -lxml2 -lsasl2 -liconv -ltidy -lz -lc++ -lresolv -stdlib=libc++ -ObjC (最新版本设置)
5.build setting 里 Clang 确保LLVM C++ standard library 为libc++
6. Build Phases, add a Target Dependency of static mailcore2 ios.
二、运行成库时遇到的问题
1、MCOErrorDomain Code=5
邮箱帐号或者密码错误,邮箱后缀是否正确。
2、MCOErrorDomain Code=4
服务器证书无效,可以将 checkCertificateEnabled 设置为NO;另网络原因也可能造成连接不上
3、MCOErrorDomain Code=1
a).hostname不存在,或者拼写错误
b).需要SSL安全链接,将connectionType设置为MCOConnectionTypeTLS;
c).端口号错误。
一般配置的端口 imap 993 / smtp 465 ; pop3/smtp 25
4、找不到'libetpan / libetpan.h'、'unicode / udat.h'、'ctemplate / template.h'
libetpan 是C写的为不同类型的邮件访问提供支持邮件支持库,ctemplate 是ctemplate 是一个简单实用、功能强大的文字模板(template language),unicode顾明思义是编码库。一般情况下找不到这些文件是编译前后顺序的问题, 生成了iOS 库再去编译mailcore2 的库才能找到。
a).运行 static mailcore2 ios、再运行 mailcore2 ios
b).再选择你自己的工程运行
三、邮件收发问题
1、邮件中文乱码
a).文件夹名乱码,是由于命名空间未匹配导致
MCOIMAPFetchNamespaceOperation * op = [imapSession fetchNamespaceOperation];
[op start:^(NSError *__nullableerror, NSDictionary * namespaces) {
MCOIMAPNamespace * namespace = (imapSession.defaultNamespace !=nil) ? imapSession.defaultNamespace : [namespaces objectForKey:MCOIMAPNamespacePersonal];
if(namespace){
NSString *folername= [namespace componentsFromPath:imapFolder.path][0]; }}];
//namespace 为空时则可能中文乱码
b).邮件正文乱码
NSString *htmlString =[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if(htmlString ==nil|| htmlString.length==0)
{ htmlString=[[MCOMessageParser messageParserWithData:data] htmlBodyRendering]; //默认使用MC 的转码但很多外界邮箱发来无法解析 }
2、添加附件
附件分为inlineAttachments 和 新增attachments
MCOAttachment *attachment=[MCOAttachment attachmentWithContentsOfFile:[attachmentModel fileName]];
[attachment setUniqueID:[attachmentModel modelID]];
[attachment setInlineAttachment:NO];//yes or no
[messageBuilder addRelatedAttachment:inlineAttachment];
[messageBuilder addAttachment:attachment];