gpt4 book ai didi

objective-c - 将电子邮件从 mail.app 放入 NSWindow 对象

转载 作者:行者123 更新时间:2023-12-03 16:37:06 24 4
gpt4 key购买 nike

我有一个 cocoa 应用程序,我想接受来自 mail.app 的电子邮件,并将其拖到应用程序的主窗口中。我的应用程序中有DidFinishLaunching:

[_window registerForDraggedTypes:
[NSArray arrayWithObjects:
NSFilenamesPboardType,
(NSString *)kPasteboardTypeFileURLPromise, nil]]; //kUTTypeData
[_window setDelegate:(id) self];

这工作正常,我可以在我的performDragOperation中接收文档:使用

NSArray * files =  [sender namesOfPromisedFilesDroppedAtDestination:url];

但是,这只能让我一封一封地拖动电子邮件。如果我标记几封电子邮件,一切看起来都很好,直到我删除,然后什么也没有发生。甚至没有调用performDragOperation。

我尝试将 kUTTypeData 添加到 registerForDraggedTypes...,然后调用了 PerformDragOperation...,但随后我无法使用 namesOfPromisedFilesDroppedAtDestination:url,因为它返回一个 nil 指针。

当我将 kUTTypeData 包含在寄存器中时...我将其包含在 PerformDragOperation 中以查看拖动的类型:

pboard = [sender draggingPasteboard];
NSLog(@"perform drag entered, %@", [pboard types]);

结果如下:

2013-07-25 15:09:50.771 BO2ICAL[1672:303] perform drag entered, (
"dyn.ah62d4rv4gu8y4zvanr41a3pwfz30n25wqz4ca5pfsr30c35feb4he2pssrxgn6vasbu1g7dfqm10c6xeeb4hw6df",
"MV Super-secret message transfer pasteboard type",
"dyn.ah62d4rv4gu8zg7puqz3c465fqr3gn7bakf41k55rqf4g86vasbu1g7dfqm10c6xeeb4hw6df",
"Super-secret Automator pasteboard type"
)

单个电子邮件的列表是:

2013-07-25 15:14:30.096 BO2ICAL[1672:303] perform drag entered, ( "dyn.ah62d4rv4gu8y4zvanr41a3pwfz30n25wqz4ca5pfsr30c35feb4he2pssrxgn6vasbu1g7dfqm10c6xeeb4hw6df", "MV Super-secret message transfer pasteboard type", "dyn.ah62d4rv4gu8zg7puqz3c465fqr3gn7bakf41k55rqf4g86vasbu1g7dfqm10c6xeeb4hw6df", "Super-secret Automator pasteboard type", "dyn.ah62d4rv4gu8yc6durvwwa3xmrvw1gkdusm1044pxqyuha2pxsvw0e55bsmwca7d3sbwu", "Apple files promise pasteboard type", "public.url", "CorePasteboardFlavorType 0x75726C20", "dyn.ah62d4rv4gu8yc6durvwwaznwmuuha2pxsvw0e55bsmwca7d3sbwu", "Apple URL pasteboard type", "public.url-name", "CorePasteboardFlavorType 0x75726C6E", "com.apple.pasteboard.promised-file-content-type", "com.apple.pasteboard.promised-file-url", "dyn.ah62d4rv4gu8y6y4usm1044pxqzb085xyqz1hk64uqm10c6xenv61a3k", NSPromiseContentsPboardType )

有人对如何正确执行此操作以接受多封电子邮件有任何建议吗?

最佳答案

我已经找到了解决这个问题的方法。我发现“kUTTypeData”模式中提供的数据为我提供了足够的数据来直接从 mail.app 邮箱获取文件。

在mbox文件夹中,有一个带有一长串数字和破折号的文件夹,在邮箱层次结构中的任何地方都没有这个名称的痕迹,但由于它只包含这个文件夹和一个info.plist文件,所以我使用此函数可以获取该名称:更新:实现了正则表达式检查,因为该文件夹有时包含可能具有更长名称的子邮箱...

-(NSString*)FindCodedFolderInMailbox:(NSString*)mailboxpath {

NSString *uuid_regexp = @"[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}";
NSPredicate *uuid_test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", uuid_regexp];

NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *fileList = [fileManager contentsOfDirectoryAtPath:mailboxpath error:nil];
for (NSString * file in fileList) {
if ([uuid_test evaluateWithObject: file]){
return file;
}
}
return nil;
}

然后我发现没有“NSPromiseContentsPboardType”,而是“ super secret 自动化粘贴板类型”的部分,我写了以下部分(我打算删除一些 NSLog 条目,但这里是:

} else if ( [[pboard types] containsObject:@"Super-secret Automator pasteboard type"] ) {

NSFileManager *fileManager = [NSFileManager defaultManager];
// Create the URL for the destination folder and ensure it exists.
NSURL *applicationFilesDirectory = [self applicationFilesDirectory];
NSURL *url = [applicationFilesDirectory URLByAppendingPathComponent:@"documents"];
BOOL isDir;
if (!([fileManager fileExistsAtPath:[url path] isDirectory:&isDir] && isDir)) {
NSError * error = nil;
[ fileManager createDirectoryAtURL:url withIntermediateDirectories: YES attributes:nil error:&error];
if (error) {
[[NSApplication sharedApplication] presentError:error];
}
}
BOOL ok = false;

// locate the mailbox path....
NSString *mailboxpath = [pboard stringForType:@"MV Super-secret message transfer pasteboard type"];
NSLog(@"Mailboxpath: %@", mailboxpath);

NSString * codedFolder = [self FindCodedFolderInMailbox:mailboxpath];
if (codedFolder) {
NSString * codedpath = [NSString stringWithFormat:@"file://%@/%@/Data", mailboxpath, codedFolder];
NSURL * mb1 = [NSURL URLWithString:codedpath];
NSLog(@"Directory:%@", mb1);
NSArray *msgArray = [pboard propertyListForType:@"Super-secret Automator pasteboard type"];
if (msgArray) {
for (NSDictionary *msg in msgArray) {

// Locate the message....
NSNumber * msgID = [msg valueForKey:@"id"];
NSLog(@"Melding(%@):%@", msgID, msg);
NSString * filename = [NSString stringWithFormat:@"%@.emlx", msgID];

// second and first letter of id
NSString * idSec = [[msgID stringValue]substringWithRange:(NSRange){1, 1}];
NSString * idFirst = [[msgID stringValue]substringWithRange:(NSRange){0, 1}];
NSString * subpath = [NSString stringWithFormat:@"%@/%@/Messages/%@",idSec, idFirst, filename];

NSURL * thisFilePath = [mb1 URLByAppendingPathComponent:subpath];


if ([fileManager fileExistsAtPath:[thisFilePath path]]) {

NSURL *destpath = [url URLByAppendingPathComponent:filename];

NSError * error = nil;
[fileManager copyItemAtURL:thisFilePath toURL:destpath error:&error];
if (error) {
[[NSApplication sharedApplication]presentError:error];
} else {
[self ParseEmlMessageforPath:[destpath path] filename:filename];

}


}

}


}

}

我们开始吧...:-)

关于objective-c - 将电子邮件从 mail.app 放入 NSWindow 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17859184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com