我将Mailcore库用于iOS电子邮件客户端。我想在有人查看电子邮件时将其标记为已查看(即为邮件设置IMAP SEEN flag)。
- (BOOL)isUnread {
struct mail_flags *flags = myMessage->msg_flags;
if (flags != NULL) {
BOOL flag_seen = (flags->fl_flags & MAIL_FLAG_SEEN);
return !flag_seen;
}
return NO;
}
这就是我将消息设置为read:
- (void)setIsRead {
struct mail_flags *flags = myMessage->msg_flags;
flags->fl_flags = (flags->fl_flags | MAIL_FLAG_SEEN);
}
(我确认它至少在同一个会话中工作..即如果我在未读消息上调用此消息,则调用[self isUnread]
它将返回false
)
我的问题是,这不会影响实际的IMAP服务器。即如果我在我的Gmail中查看相同的电子邮件,它仍然会显示为未读。
同样在CTCoreMessage documentation中:
CTCoreMessage是您处理邮件的方式。最简单的方法 实例化CTCoreMessage是首先设置CTCoreAccount对象 然后获取CTCoreFolder对象,然后使用它的方便 方法messageWithUID:获取可以使用的消息对象。
我做了这两件事(可能值得一提的是我一直保持IMAP连接活着......但是当我没有主动同步或发送时我保持idle电子邮件等..但在我打电话给[self setIsRead]
之前,我发送了IMAP done command)。
那么缺少什么?我的想法是,我只是改变了我已经从IMAP服务器获取的消息的本地结构..但我没有用新信息更新服务器。我怎么做?在Mailcore中,与服务器交互的唯一方法是通过+sendMessage:server:username:password:port:connectionType:useAuth:error: 但这就像发送电子邮件一样..这绝对不是我想要的。
想法?
更新的 基本上我只是希望能够像store IMAP command那样发布Telnet command line(我已确认它适用于{{3}}):
tag store %message_number% flags \Seen
* %message_number% FETCH (FLAGS (\Seen))
tag OK Success
答案 0 :(得分:1)
MailCore的作者。
我建议使用setFlags:forMessage
上的方法CTCoreFolder
,如下所示:http://libmailcore.com/api/Classes/CTCoreFolder.html#//api/name/setFlags:forMessage:
上面的内容将覆盖任何现有的标志。而是使用flagsForMessage:flags
获取当前标志,然后使用按位运算符更改您想要的标志。然后在服务器上设置标志
答案 1 :(得分:0)
事实证明..存储命令存在于libetpan中..这是我的实现:
- (void)setIsRead {
struct mailimap_set *set;
struct mailmessage *messageStruct = [self messageStruct];
struct mailimap_flag_list*flist;
struct mailimap_store_att_flags * store_flags;
int err;
set = mailimap_set_new_single(messageStruct->msg_index);
flist = mailimap_flag_list_new_empty();
mailimap_flag_list_add(flist,mailimap_flag_new_seen());
// TODO: ensure that we're not overwriting original flags of message
store_flags = mailimap_store_att_flags_new_set_flags(flist);
err = mailimap_store([self imapSession], set, store_flags);
mailimap_set_free(set);
mailimap_store_att_flags_free(store_flags);
if (err != MAILIMAP_NO_ERROR) {
NSException *exception = [NSException
exceptionWithName:CTUnknownError
reason:[NSString stringWithFormat:@"Err num: %d", err]
userInfo:nil];
[exception raise];
}
}
答案 2 :(得分:0)
您是否看过用于处理消息的CTCoreFolder API(包括设置标志)?