2013-04-25 1 views
0

iOS 이메일 클라이언트에 Mailcore 라이브러리를 사용하고 있습니다. 다른 사람이 볼 때마다 본 이메일을 표시 (예 : IMAP SEEN flag을 메시지에 설정)하고 싶습니다. 이메일 설정 방법 Mailcore/Libetpan을 통한 IMAP SEK 플래그

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

(나는 그것이 적어도 작동하는지 확인 :

- (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를하고있다 Mailcore indicates 방법입니다 즉, 읽지 않은 메시지에서이 메시지를 호출하면 [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 

답변

1

여기에서 MailCore의 저자입니다. http://libmailcore.com/api/Classes/CTCoreFolder.html#//api/name/setFlags:forMessage를 : 여기에 설명 된대로

나는 CTCoreFolder에 방법 setFlags:forMessage를 사용하는 것이 좋습니다

당신이 위의 무엇을 가지고 기존의 플래그를 덮어 쓰게됩니다.대신 flagsForMessage:flags을 사용하여 현재 플래그를 가져온 다음 비트 연산자를 사용하여 원하는 플래그를 변경하십시오. 그럼 서버에 깃발을 설정

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

관련 문제