Mac Spotlight-API:如何搜索电子邮件的“收件人",“来自"或“主题"领域 [英] Mac Spotlight-API: how to search email's "to", "from" or "subject" fields

查看:134
本文介绍了Mac Spotlight-API:如何搜索电子邮件的“收件人",“来自"或“主题"领域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

目前,我有用于搜索电子邮件正文的Spotlight-api代码.我正在使用NSMetadataQuery并为"kMDItemTextContent like[c] %@"创建谓词.在电子邮件正文中请求搜索词"时,此方法可以正常工作.

At the moment I have spotlight-api code which searches email's body. I'm using NSMetadataQuery and creating predicate for "kMDItemTextContent like[c] %@". This works fine when requested "search-term" is in body of email.

在Spotlight应用程序中(右上角的放大镜图标),如果我输入"to:john",我将获得电子邮件列表,其中"to"字段包含单词"john"(例如,某些电子邮件地址john @ something的一部分). com).

In Spotlight App (magnifier icon in top right) if I enter "to: john" I'll get list of emails in which "to" field contains word "john" (e.g. part of some email address john@something.com).

我尝试通过添加"kMDItemRecipients""kMDItemRecipientEmailAddresses""kMDItemAuthors""kMDItemAuthorEmailAddresses""kMDItemSubject"类型的其他谓词来使用[NSCompoundPredicate orPredicateWithSubpredicates:]实现此目的. 不幸的是,这不会返回所需的电子邮件.

I tried to achieve this with [NSCompoundPredicate orPredicateWithSubpredicates:] by adding additional predicates of type "kMDItemRecipients", "kMDItemRecipientEmailAddresses", "kMDItemAuthors", "kMDItemAuthorEmailAddresses" and "kMDItemSubject". Unfortunately this doesn't return desired emails.

有人知道如何通过使用Spotlight-API来实现这一目标吗?

下面是我的代码:

NSString *predicateFormat = @"kMDItemTextContent like[c] %@";
NSPredicate *predicateToRun = [NSPredicate predicateWithFormat:predicateFormat, self.searchKey];

NSString *predicateFormat1 = @"kMDItemTitle like[c] %@";
NSPredicate *predicateToRun1 = [NSPredicate predicateWithFormat:predicateFormat1, self.searchKey];

NSString *predicateFormat2 = @"kMDItemAuthorEmailAddresses like[c] %@";
NSPredicate *predicateToRun2 = [NSPredicate predicateWithFormat:predicateFormat2, self.searchKey];

NSString *predicateFormat3 = @"kMDItemAuthors like[c] %@";
NSPredicate *predicateToRun3 = [NSPredicate predicateWithFormat:predicateFormat3, self.searchKey];

NSString *predicateFormat4 = @"kMDItemRecipientEmailAddresses like[c] %@";
NSPredicate *predicateToRun4 = [NSPredicate predicateWithFormat:predicateFormat4, self.searchKey];

NSString *predicateFormat5 = @"kMDItemRecipients like[c] %@";
NSPredicate *predicateToRun5 = [NSPredicate predicateWithFormat:predicateFormat5, self.searchKey];

NSString *predicateFormat6 = @"kMDItemSubject like[c] %@";
NSPredicate *predicateToRun6 = [NSPredicate predicateWithFormat:predicateFormat6, self.searchKey];

NSUInteger options = (NSCaseInsensitivePredicateOption|NSDiacriticInsensitivePredicateOption);
NSPredicate *compPred = [NSComparisonPredicate
                         predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"*"]
                         rightExpression:[NSExpression expressionForConstantValue:self.searchKey]
                         modifier:NSDirectPredicateModifier
                         type:NSLikePredicateOperatorType
                         options:options];

predicateToRun = [NSCompoundPredicate orPredicateWithSubpredicates:
                     [NSArray arrayWithObjects:
                      compPred, 
                      predicateToRun, predicateToRun1, predicateToRun2, predicateToRun3, predicateToRun4,   
                      predicateToRun5, predicateToRun6, nil]];

predicateToRun = [NSCompoundPredicate andPredicateWithSubpredicates:
                  [NSArray arrayWithObjects:predicateToRun, [NSPredicate predicateWithFormat:@"(kMDItemContentType != 'public.vcard')"], nil]];

[self.query setPredicate:predicateToRun]; 

[self.query startQuery];

推荐答案

我知道如何使用MDQuery做到这一点-我认为这更简单.

I know how to do this with MDQuery - which in my opinion is simpler.

您可以使用与从命令行在mdfind中使用的查询基本相同的查询.

You can use basically the same queries as you can use in mdfind from the command line.

输入类似以下内容的搜索字符串:(未测试)

make a search string like: (NOT tested)

((((kMDItemAuthorEmailAddresses == "*john*"cd)) || ((kMDItemAuthors == "*john*"cd))) && (kMDItemContentType == 'com.apple.mail.emlx'))

也在终端中 mdls/path/to/library/mail/v2/24324.emlx 将显示搜索电子邮件的内容.它是你的朋友

also in terminal mdls /path/to/library/mail/v2/24324.emlx will show what to search on for emails. Its your friend

请注意如何连接目标c通知.

Note how you can hook up objective c notifications.

NSString* query = some string ;

MDQueryRef mdQuery = MDQueryCreate(nil, (CFStringRef)query, nil, nil);

// if something is goofy, we won't get the query back, and all calls involving a mil MDQuery crash. So return:
if (mdQuery == nil)
    return;

NSNotificationCenter* nf = [NSNotificationCenter defaultCenter];
[nf addObserver:self selector:@selector(progressUpradeQuery:) name:(NSString*)kMDQueryProgressNotification object:(id) mdQuery];
[nf addObserver:self selector:@selector(finishedUpradeQuery:) name:(NSString*)kMDQueryDidFinishNotification object:(id) mdQuery];
[nf addObserver:self selector:@selector(updatedUpradeQuery:) name:(NSString*)kMDQueryDidUpdateNotification object:(id) mdQuery];

// Should I run this query on the network too? Difficult decision, as I think that this will slow stuff way down.
// But i think it will only query leopard servers so perhaps ok
//MDQuerySetSearchScope(mdQuery, (CFArrayRef)[NSArray arrayWithObjects:(NSString*)kMDQueryScopeComputer, (NSString*)kMDQueryScopeNetwork, nil], 0);

// start it
BOOL queryRunning = MDQueryExecute(mdQuery, kMDQueryWantsUpdates); 
if (!queryRunning)
{
    CFRelease(mdQuery);
    mdQuery = nil;
    // leave this log message in...
    NSLog(@"MDQuery failed to start.");
    return;
}

汤姆

这篇关于Mac Spotlight-API:如何搜索电子邮件的“收件人",“来自"或“主题"领域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆