iOS MailCore:如何下载电子邮件附件并在Webview中显示?

4
我是iOS开发的新手。我正在使用MailCore在我的应用程序中获取电子邮件。我的xcode版本为4.6.3,iOS版本为6.1和5.1。有人可以帮我解决问题吗?我可以从我的服务器获取带有附件计数和描述的邮件,但我找不到下载此文件或如何获取附加文件的方法。
请帮助我。
谢谢!
2个回答

3
很简单: 首先 - 获取消息的UID。
MCOIndexSet *uidSet = [MCOIndexSet indexSetWithRange:MCORangeMake(1,UINT64_MAX)];//for all msgs
MCOIMAPSession *session = <new or reuse IMAP session, i reuse this>
MCOIMAPFetchMessagesOperation *fetchOp =
[session fetchMessagesByUIDOperationWithFolder:@"INBOX"
                                    requestKind:MCOIMAPMessagesRequestKindFullHeaders
                                           uids:uidSet];

[fetchOp start:^(NSError *err, NSArray *messagesList, MCOIndexSet *vanished) {
    if (!err) {            
        NSLog(@"Receive %i messages",(int)[messagesList count]);
        NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"header.date" ascending:NO];
//upd UI
        [[NSNotificationCenter defaultCenter] postNotificationName:kNotif_postCollector_ReceiveMessages object:nil];
//store msgs
        [[DataSingleton sharedSingleton] updateMessageListWithMessages:[messagesList sortedArrayUsingDescriptors:@[sort]]];
    }else{
        //oh no
    }
}];

second - 获取消息结构(不是全部,只需要数组messagesList中的内容)

MCOIndexSet *uidSet = [MCOIndexSet indexSet];
for (Message *message in messagesList)// i use this class to store msgs. mcUid = MailCore Uid
    [uidSet addIndex:[[message mcUid] integerValue]];

MCOIMAPSession *session = <new or reuse IMAP session, i reuse this>
MCOIMAPFetchMessagesOperation *fetchOp =
[session fetchMessagesByUIDOperationWithFolder:@"INBOX"//or another folder
                                   requestKind:MCOIMAPMessagesRequestKindStructure
                                          uids:uidSet];

[fetchOp start:^(NSError *err, NSArray *messagesList, MCOIndexSet *vanished) {

    if (!err) {

        NSLog(@"Receive %i messages with structures",(int)[messagesList count]);
        NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"header.date" ascending:NO];
        //store attachment precence
        [[DataSingleton sharedSingleton] updateAttachmentsPresenceForMessages:[messagesList sortedArrayUsingDescriptors:@[sort]]
                                                            forAccount:acc];
/* You get array of this objects:
MCOIMAPPart : MCOAbstractPart
//A part identifier looks like 1.2.1
@property (nonatomic, copy) NSString * partID;
//The size of the single part in bytes
@property (nonatomic, nonatomic) unsigned int size;
//It's the encoding of the single part
@property (nonatomic, nonatomic) MCOEncoding encoding;
*/
    }
}];

第三步也是最后一步:
MCOIMAPSession *session = <new or reuse IMAP session, i reuse this>
int uid = [[message mcUid] intValue];
NSString *partID = [attachment mcPartID];//we stored it on step 2
MCOIMAPFetchContentOperation * op = [session     fetchMessageAttachmentByUIDOperationWithFolder:@"INBOX"
  uid:uid
  partID:partID
  encoding:(MCOEncoding)[[attachment mcEncoding] integerValue]];

NSLog(@"download att %i part %@",uid,partID);
[op start:^(NSError * error, NSData * messageData) {

    if (error) {

    }else{
        TRACE(@"receive att %i part %@",uid,partID);
        //save attachment fo local disc
        [[DataSingleton sharedSingleton] updateDownloadedAttachment:attachment
                                                           withData:messageData];
    }
}];

更多关于GitHub和官方页面libmailcore.com的信息请参阅。


你好,能否发布一下你的DataSingleton类?谢谢。 - sundsx
抱歉,@sundsx。不行,因为它受到NDA保护。你想知道什么? - WINSergey
你好,winsergey。我想跟随你的存储附件示例。那么,例如:updateAttachmentsPresenceForMessages和updateDownloadedAttachment是数组还是NSData对象? - sundsx
@sundsx回答了你的问题:https://gist.github.com/b5684c470e877af75880 https://gist.github.com/ba53ef49818ea6db79be - WINSergey
你是个伟大的人!谢谢WINSergey。 - sundsx
显示剩余4条评论

0
            MCOMessageParser * msg = [MCOMessageParser messageParserWithData:data];

            if ([_message.attachments count] > 0)
            {
                for (int i=0; i<[_message.attachments count]; ++i)
                {
                    MCOIMAPPart *part = [_message.attachments objectAtIndex:i];

                    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                    NSString *docDir = [paths objectAtIndex:0];
                    NSString *filePath = [NSString stringWithFormat:@"%@/%@",
                                          docDir, [part filename]];
                    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath];
                    if (NO == fileExists) {
                        [data writeToFile:filePath atomically:YES];
                    }
                }
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接