mailcore 2 iOS 之二 SMTP

起源见 mailcore2-ios 之一 IMAP

上一篇大致说了下IMAP协议中的简单使用,看到文章有人看,为了我的三个👨‍💻‍👨‍💻‍👨‍💻‍粉丝,那我继续更新一下,希望对你们有帮助,也做个沟通交流。

  • IMAP mailcore2-ios 之一 IMAP
  • SMTP
    • 登录/用户验证
    • 创建邮件体
    • 附件添加
    • 发送
    • 发送成功后手动添加到“已发送”文件夹
SMTP
  • 1、登录/用户验证
    不论哪种协议,都需要先验证邮箱地址/服务器、密码、端口等,SMTP也一样,你也可以不验证,大不了就是发不出去邮件。。。🤓🤓🤓🤓🤓

创建session,都类似的

self.smtpSession.hostname = session.smtpHost;//smtp.***.com
self.smtpSession.username = session.username;//littlecat@xxx.com.cn
self.smtpSession.password = session.password;//password
self.smtpSession.port     = (unsigned int)session.smtpPort;//25、465、587?
self.smtpSession.connectionType = session.smtpIsSSL ? MCOConnectionTypeTLS: MCOConnectionTypeClear;//取决于你的邮件服务器是不是SSL的;
self.smtpSession.authType = MCOAuthTypeSASLLogin;//session校验的类型,这里选的登录,其他还没搞明白(没看。。)😌

校验邮箱信息

MCOSMTPOperation *smtpOperation = [smtpSession loginOperation];
[smtpOperation start:^(NSError * error) {
    NSLog(@"finished checking SMTP account.");
    if (error == nil) {
        //now ,you can send email.
    } else {
        NSLog(@"error check smtp account: %@", error);
    }
}];
  • 2、创建邮件
    • create message builder;
    • set sender(from)、receiver(to)、cc and bcc;
    • set body (html body or plain text body);

懒得正经打字了,bite me!🙄🙄🙄🙄🙄🙄🙄🙄🙄🙄

- (void)messageBuildFrom:(NSString *)displayName // 发件人昵称,可以不设置;
                 mailBox:(NSString *)mail  //发件人邮箱地址;
                      to:(NSArray *)to  //收件人(邮箱地址字符串格式,下同);
                      cc:(NSArray *)cc  //抄送人;
                     bcc:(NSArray *)bcc  //密送人;
                 subject:(NSString *)subject  //邮件主题;
                textBody:(NSString *)body  //邮件正文,我这里是带标签的html文本;
                 attachs:(NSDictionary *)attachs  //附件s(文件名称和NSData格式数据);
                htmlBody:(MCOAbstractMessage *)msgParser  //转发时的原邮件;
         completeHandler:(void(^)())complete
                   error:(void(^)(NSError *error))fail
{
    MCOMessageBuilder *msgBuilder = [[MCOMessageBuilder alloc] init];

    //header;
    if (displayName != nil) {
        msgBuilder.header.from = [MCOAddress addressWithDisplayName:displayName mailbox:mail];
    }else{
        msgBuilder.header.from = [MCOAddress addressWithMailbox:mail];
    }
    msgBuilder.header.to      = [self mailStringToMCOAddress:to];//字符串格式的邮箱地址,要转成address类;
    msgBuilder.header.cc      = [self mailStringToMCOAddress:cc];
    msgBuilder.header.bcc     = [self mailStringToMCOAddress:bcc];
    msgBuilder.header.subject = subject;

    //body
    [msgBuilder setHTMLBody:body];
    
    //------见下
}

- (NSArray *)mailStringToMCOAddress:(NSArray *)arr
{
    NSMutableArray *temp = [NSMutableArray array];
    for (NSString *str in arr) {
        MCOAddress *add = [MCOAddress addressWithMailbox:str];
        [temp addObject:add];
    }
    return temp.copy;
}
  • 3、附件处理
- (void)messageBuildFrom:(NSString *)displayName
                 mailBox:(NSString *)mail
                      to:(NSArray *)to
                      cc:(NSArray *)cc
                     bcc:(NSArray *)bcc
                 subject:(NSString *)subject
                textBody:(NSString *)body
                 attachs:(NSDictionary *)attachs
                htmlBody:(MCOAbstractMessage *)msgParser
         completeHandler:(void(^)())complete
                   error:(void(^)(NSError *error))fail
{
    MCOMessageBuilder *msgBuilder = [[MCOMessageBuilder alloc] init];

    // -------见上 。。。 ------//
    if (msgParser != nil) {
        //附加资源,
        NSArray *inAttach = msgParser.htmlInlineAttachments;
        for (MCOAttachment *attach in inAttach) {
            NSString * path = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_%@",msgParser.header.messageID,attach.filename]];
            NSData *data = [NSData dataWithContentsOfFile:path];
            if (data) {
                MCOAttachment *temp = [MCOAttachment attachmentWithData:data filename:attach.filename];
                temp.inlineAttachment = YES;
                [msgBuilder addRelatedAttachment:temp];
            }
        }
    }
    //看接口文档的意思,上面是把转发的邮件中的附件添加上,
    //可是并不起作用。。。采取的方法是,下面循环再添加一次。。。。🤧🤧🤧🤧🤧

    //附件
    if (attachs) {
        for (NSString *name in attachs.allKeys) {
            MCOAttachment *attach = [MCOAttachment attachmentWithData:[attachs objectForKey:name] filename:name];
            [msgBuilder addAttachment:attach];
        }
    }

    //send
    //--------见下
}
  • 4、发送邮件
    邮件也创建了,附件添加完,终于要发送了,但是要注意的是发送操作成功完成后,对方确实可以成功收到,但是在发送方的“已发送”是没有的,需要手动append一份过去
    执行append操作,需要用imapSession的,不要搞错了。😅
    “已发送”文件夹的filepath,可能是 Sent、Sent Messages等等,具体看你解析的邮箱服务器,不一定都是Sent 哦。
    //send
    NSData *rfc822 = [msgBuilder data];
    MCOSMTPSendOperation *send = [smtpSession sendOperationWithData:rfc822];
    [send start:^(NSError * _Nullable error) {
        if (error) {
            fail(error);
        }else {
            //发送成功后,手动添加到“已发送”;
            MCOIMAPAppendMessageOperation *op = [imapSession appendMessageOperationWithFolder:[MMIMAPTool getVirtualNameFor:@"Sent"] messageData:rfc822 flags:MCOMessageFlagMDNSent];
            [op start:^(NSError *error, uint32_t createdUID) {
                NSLog(@"create sent message :%@\nerror:%@", @(createdUID), error);
            }];
            complete();
        }
    }];

注:上一篇IMAP使用中提到过,创建草稿,过程和这个类似,不过最后执行append 是 放到 草稿箱,不是已发送了。

“就是这么不要脸”专用图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355