2013-04-25 79 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

相關問題