0

我正在将Mailcore库用于 iOS 电子邮件客户端。每当有人查看电子邮件时,我想将电子邮件标记为已查看(即为邮件设置IMAP SEEN 标志)。

这就是 Mailcore指示消息已被阅读的方式:

- (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;
}

这就是我将消息设置为已读的操作:

- (void)setIsRead {
    struct mail_flags *flags = myMessage->msg_flags;
    flags->fl_flags = (flags->fl_flags | MAIL_FLAG_SEEN);
}

(我确认它至少在同一个会话中有效。即,如果我在未读消息上调用此消息,则调用[self isUnread]它返回false

我的问题是这不会影响实际的 IMAP 服务器。即,如果我在我的 gmail 中查看相同的电子邮件,它仍会显示为未读。

同样在 CTCoreMessage文档中:

CTCoreMessage 是您处理消息的方式。实例化 CTCoreMessage 的最简单方法是首先设置一个 CTCoreAccount 对象,然后获取一个 CTCoreFolder 对象,然后使用它的便捷方法 messageWithUID: 来获取一个可以使用的消息对象。

我做了这两件事(可能值得一提的是,我一直保持 IMAP 连接处于活动状态。但当我没有主动同步或发送电子邮件等时,我会保持空闲状态[self setIsRead]。但在我打电话给上面,我向它发送IMAP 完成命令)。

那么缺少什么?我的想法是,我只是在更改已经从 IMAP 服务器获取的消息的本地结构。但我没有用新信息更新服务器。我怎么做?在 Mailcore 中,与服务器交互的唯一方法是通过+sendMessage:server:username:password:port:connectionType:useAuth:error: 但这与发送电子邮件一样......这绝对不是我想要的。

想法?

更新: 基本上我只是希望能够像这样发出store IMAP 命令(我已经确认它可以在Telnet 命令行上运行):

tag store %message_number% flags \Seen
* %message_number% FETCH (FLAGS (\Seen))
tag OK Success
4

3 回答 3

1

MailCore 的作者在这里。

我建议使用此处记录setFlags:forMessage的方法:http://libmailcore.com/api/Classes/CTCoreFolder.html#//api/name/setFlags: forMessageCTCoreFolder

您上面的内容将覆盖任何现有的标志。而是使用按位运算符获取当前标志flagsForMessage:flags,然后使用按位运算符更改您想要的标志。然后在服务器上设置标志

于 2013-04-25T14:34:23.483 回答
0

事实证明.. store 命令存在于 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];
    }
}
于 2013-04-25T13:37:45.350 回答
0

您是否看过用于处理消息(包括设置标志)的 CTCoreFolder API?

于 2013-04-25T14:09:34.453 回答