起源见 mailcore2-ios 之一 IMAP
上一篇大致说了下IMAP协议中的简单使用,看到文章有人看,为了我的三个
👨💻👨💻👨💻粉丝,那我继续更新一下,
希望对你们有帮助,也做个沟通交流。
SMTP
1、登录/用户验证
不论哪种协议,都需要先验证邮箱地址/服务器、密码、端口等,SMTP也一样,你也可以不验证,大不了就是发不出去邮件。。。🤓🤓🤓🤓🤓
创建session,都类似的
1 2 3 4 5 6
| self.smtpSession.hostname = session.smtpHost; self.smtpSession.username = session.username; self.smtpSession.password = session.password; self.smtpSession.port = (unsigned int)session.smtpPort; self.smtpSession.connectionType = session.smtpIsSSL ? MCOConnectionTypeTLS: MCOConnectionTypeClear; self.smtpSession.authType = MCOAuthTypeSASLLogin;
|
校验邮箱信息
1 2 3 4 5 6 7 8 9
| MCOSMTPOperation *smtpOperation = [smtpSession loginOperation]; [smtpOperation start:^(NSError * error) { NSLog(@"finished checking SMTP account."); if (error == nil) { } 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!🙄🙄🙄🙄🙄🙄🙄🙄🙄🙄
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
| - (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 (displayName != nil) { msgBuilder.header.from = [MCOAddress addressWithDisplayName:displayName mailbox:mail]; }else{ msgBuilder.header.from = [MCOAddress addressWithMailbox:mail]; } msgBuilder.header.to = [self mailStringToMCOAddress:to]; msgBuilder.header.cc = [self mailStringToMCOAddress:cc]; msgBuilder.header.bcc = [self mailStringToMCOAddress:bcc]; msgBuilder.header.subject = subject;
[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、附件处理
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
| - (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]; } }
}
|
4、发送邮件
邮件也创建了,附件添加完,终于要发送了,但是要注意的是发送操作成功完成后,对方确实可以成功收到,但是在发送方的“已发送”是没有的,需要手动append一份过去
。
执行append操作,需要用imapSession
的,不要搞错了。😅
“已发送”文件夹的filepath,可能是 Sent、Sent Messages
等等,具体看你解析的邮箱服务器,不一定都是Sent 哦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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 是 放到 草稿箱
,不是已发送
了。