2013-04-25 82 views
0

我对iOS电子邮件客户端使用Mailcore库。我想在有人查看时将电子邮件标记为已查看(即设置邮件的IMAP SEEN flag)。如何通过Mailcore/Libetpan设置电子邮件IMAP SEEN标志

这是Mailcore indicates消息已被read如何:

- (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 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):

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

回答

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]; 
    } 
} 
0

你见过用于处理消息(包括设置标志)的CTCoreFolder API吗?

+0

我没有..可能有多种方式来剥皮猫..反正我[解决](http://stackoverflow.com/a/16216282/766570)我的问题 – abbood 2013-04-25 14:13:39

相关问题