Objective c 将邮件拖放到OS X应用程序中

Objective c 将邮件拖放到OS X应用程序中,objective-c,macos,drag-and-drop,Objective C,Macos,Drag And Drop,我希望能够从Outlook for Mac和Mail.app拖放和发送电子邮件到OS X应用程序。如果我从finder拖放并发送电子邮件(拖动文件),则称为: - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender -(nsdragooperation)draggingented:(id)发送方 但是,如果我从Outlook for Mac或Mail.app拖放,则不会调用该方法。我对如何实现这一目标有些茫然。

我希望能够从Outlook for Mac和Mail.app拖放和发送电子邮件到OS X应用程序。如果我从finder拖放并发送电子邮件(拖动文件),则称为:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
-(nsdragooperation)draggingented:(id)发送方
但是,如果我从Outlook for Mac或Mail.app拖放,则不会调用该方法。我对如何实现这一目标有些茫然。有什么想法吗?

来自:

若要接收拖动操作,必须通过向对象发送RegisterForDragedTypes:message(在NSWindow和NSView中定义)来注册窗口或视图将接受的粘贴板类型,并从NSDraggingDestination协议实现多个方法。在拖动会话期间,仅当目标注册为与正在拖动的粘贴板数据类型匹配的粘贴板类型时,候选目标才会接收NSDraggingDestination消息。当图像进入、在内部移动、然后退出或在目标边界内释放时,目标接收这些消息

为了接受邮件中的拖拽,您需要知道要注册的粘贴板类型。您可以使用ClipboardViewer来发现哪些类型的数据邮件放置在拖动粘贴板上(对于最新版本的Xcode,可在中找到)。启动ClipboardViewer并从工具栏的组合框中选择“拖动剪贴板”。切换回Mail并短暂拖动邮件,然后返回ClipboardViewer。您应该会在侧边栏中看到许多粘贴板类型。特别令人感兴趣的是
public.url
com.apple.pasteboard.promisted文件内容类型
类型。前者表示URL位于粘贴板上。后者表示粘贴板上有a。URL往往是一个很好的起点,但在这种特殊情况下,我们可以看到URL不像文件URL那样有用,它是一个相当不透明的消息URL。这意味着我们需要处理文件承诺,因此在配置视图以接收拖拽时,我们应该使用
NSFilesPromisePboardType
调用
registerForDraggedTypes:


文件的第二部分具体概述了如何处理收到承诺的问题。总之,您可以从
performDragOperation:
中对拖动的发送方调用
-namesOfPromisedFilesDroppedAtDestination:
,让他们将拖动的数据写入您选择的位置(例如,履行承诺)。拖动的发起人将在AppKit调用对象上的
ConclutedRagOperation:
之前将数据写入磁盘。在
结束的DragOperation:
转发的任何时候,您都可以从磁盘加载删除的文件,并按照您的意愿进行处理。

我想我会发布我对这个问题的答案,因为我已经挣扎了一段时间。这段代码处理一个承诺,并简单地将丢弃的邮件复制到用户文件夹中名为Drop Stuff的文件夹中。它也适用于任何文件,似乎适用于其他应用,包括通讯录和提醒等。它还不适用于复制多个文件(或邮件消息)


当然欢迎您提出任何改进此代码的建议:-)

Hi@Adriana我也面临同样的问题,您可以发布您的解决方案吗?@Nili很遗憾,我没有找到解决方案。这有助于导入整个eml文件。有没有办法将电子邮件的内容细分为“主题”、“发件人”等字段?
import Cocoa

class DropArea: NSImageView, NSDraggingDestination 
{

    override func drawRect(dirtyRect: NSRect) 
    {
        super.drawRect(dirtyRect)
    }

    required init?(coder: NSCoder)
    {
        let types = [NSFilenamesPboardType, NSURLPboardType, NSPasteboardTypeTIFF, NSFilesPromisePboardType]
        super.init(coder: coder)
        registerForDraggedTypes(types)
    }

    override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation
    {
        return .Copy
    }

    override func performDragOperation(sender: NSDraggingInfo) -> Bool
    {
        var error: NSError?

        var folderPath = NSHomeDirectory()+"/Drop Stuff/"
        if (!NSFileManager.defaultManager().fileExistsAtPath(folderPath))
        {
            NSFileManager.defaultManager().createDirectoryAtPath(folderPath, withIntermediateDirectories: true, attributes: nil, error: &error)
        }

        var folderURL = NSURL(fileURLWithPath: folderPath)
        var f = sender.namesOfPromisedFilesDroppedAtDestination(folderURL!)
        println("Copied to \(folderPath)")
        return true
    }
}