【问题标题】:How to set email IMAP SEEN flag through Mailcore/Libetpan如何通过 Mailcore/Libetpan 设置电子邮件 IMAP SEEN 标志
【发布时间】:2013-04-18 23:53:11
【问题描述】:

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

这就是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

【问题讨论】:

    标签: ios objective-c imap email-client mailcore


    【解决方案1】:

    事实证明.. 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];
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我没有......可能有不止一种方法可以给猫剥皮......无论如何我solved我的问题
      【解决方案3】:

      这里是 MailCore 的作者。

      我建议在CTCoreFolder 上使用方法setFlags:forMessage,如下所述:http://libmailcore.com/api/Classes/CTCoreFolder.html#//api/name/setFlags:forMessage

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

      【讨论】:

        猜你喜欢
        • 2013-05-10
        • 1970-01-01
        • 2018-09-16
        • 2014-02-01
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-02
        相关资源
        最近更新 更多