如何在OSX Swift中从message:// URL获取电子邮件主题

亚历克斯

我有一个桌面应用程序,该应用程序从拖放粘贴板接收电子邮件URL(“ message://”方案),我想从相关消息中获取主题。到目前为止,我唯一的线索是该QuickLook库可能会给我一个信息对象,我可以从中检索该信息。

由于目前QuickLook API似乎变化无常,并且大多数示例都说明了如何在iOS中使用它,因此我根本无法找到一种使用URL设置“预览”对象并从中获取信息的方法。

我想避免将我的项目设置为QuickLook插件,或设置整个预览窗格/视图脚手架;目前,我只想了解QuickLook在开始显示之前加载的内容,但是我无法理解Apple希望我在此处实现的范式。

XCode 7.3.1.
亚历克斯

事实证明,我将目录的内容误解draggingInfo.draggingPasteboard().types为仅包含一种类型的信息(在这种情况下为URL)的层次列表。必须订阅拖动的事件类型kUTTypeMessage as String并使用以下命令从粘贴板中检索电子邮件主题stringForType("public.url-name")

编辑:请注意,当您拖动电子邮件线程时,当前Mail.app有时会创建一堆邮件。尽管上面的方法仍然可以获取堆栈的主题,但是拖动信息中没有URL,并且由于没有可用的Message-ID列表,我不得不求助于用户的mbox目录:

        // See if we can resolve e-mail message meta data
        if let mboxPath = pboard.stringForType("com.apple.mail.PasteboardTypeMessageTransfer") {
            if let automatorPlist = pboard.propertyListForType("com.apple.mail.PasteboardTypeAutomator") {
                // Get the latest e-mail in the thread
                if let maxID = (automatorPlist.allObjects.flatMap({ $0["id"]! }) as AnyObject).valueForKeyPath("@max.self") as? Int {
                    // Read its meta data in the background
                    let emailItem = draggingEmailItem
                    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
                        // Find the e-mail file
                        if let path = Util.findEmlById(searchPath: mboxPath, id: maxID) {
                            // Read its contents
                            emailItem.properties = Util.metaDataFromEml(path)
                            dispatch_async(dispatch_get_main_queue(), {
                                // Update UI
                            });
                        }
                    }
                }
            }
        }

有用的功能:

/* Searches the given path for <id>.eml[x] and returns its URL if found
 */
static func findEmlById(searchPath searchPath: String, id: Int)-> NSURL? {
    let enumerator = NSFileManager.defaultManager().enumeratorAtPath(searchPath)
    while let element = enumerator?.nextObject() as? NSString {
        switch (element.lastPathComponent, element.pathExtension) {
            case (let lpc, "emlx") where lpc.hasPrefix("\(id)"):
                return NSURL(fileURLWithPath: searchPath).URLByAppendingPathComponent(element as String)!
            case (let lpc, "eml") where lpc.hasPrefix("\(id)"):
                return NSURL(fileURLWithPath: searchPath).URLByAppendingPathComponent(element as String)!
            default: ()
        }
    }
    return nil
}

/* Reads an eml[x] file and parses it, looking for e-mail meta data
 */
static func metaDataFromEml(path: NSURL)-> Dictionary<String, AnyObject> {

    // TODO Support more fields

    var properties: Dictionary<String, AnyObject> = [:]
    do {
        let emlxContent = try String(contentsOfURL: path, encoding: NSUTF8StringEncoding)
        // Parse message ID from "...\nMessage-ID: <...>"
        let messageIdStrMatches = emlxContent.regexMatches("[\\n\\r].*Message-ID:\\s*<([^\n\r]*)>")
        if !messageIdStrMatches.isEmpty {
            properties["messageId"] = messageIdStrMatches[0] as String
        }
    }
    catch {
        print("ERROR: Failed to open emlx file")
    }
    return properties
}

注意:如果您的应用是沙盒,则需要将com.apple.security.temporary-exception.files.home-relative-path.read-only权利设置为其中包含一个字符串的数组:/Library/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在 Docusign 中从 JSON 设置电子邮件主题行和电子邮件消息

来自分类Dev

如何列出GMail中的所有电子邮件主题?

来自分类Dev

如何在iOS中从Twitter获取电子邮件

来自分类Dev

如何在Redmine中获取当前用户的电子邮件?

来自分类Dev

MailKit:如何遍历最近的电子邮件以获取具有给定主题的电子邮件

来自分类Dev

如何使用php imap获取电子邮件的每个主题?

来自分类Dev

如何在NetSuite中设置高级PDF电子邮件模板的主题

来自分类Dev

如何在电子邮件主题行中添加注册符号

来自分类Dev

Outlook:如何在电子邮件中强制使用非空主题?

来自分类Dev

如何通过Jmeter获取特定电子邮件ID中收到的最新电子邮件

来自分类Dev

如何在Swift 3中获取Facebook用户ID,电子邮件,picture.type(大)

来自分类Dev

如何在odoo的电子邮件模板中获取用户公司和管理员的电子邮件ID

来自分类Dev

如何从生成的令牌中获取电子邮件

来自分类Dev

Microsoft Graph:如何从电子邮件中获取别名?

来自分类Dev

如何从生成的令牌中获取电子邮件

来自分类Dev

如何从电子邮件中获取收件人

来自分类Dev

如何防止SparkPost更改电子邮件中的URL?

来自分类Dev

IFTTT:如何避免在电子邮件通道中缩短URL?

来自分类Dev

在Powershell中,如何从电子邮件主题行中仅提取7位数字?

来自分类Dev

如何编辑在Mutt的邮箱列表中收到的电子邮件的主题?

来自分类Dev

如何从 CRM2016 的电子邮件主题行中删除令牌 CRM:XXXX000

来自分类Dev

如何通过Ruby on Rails中的营销电子邮件API获取sendgrid中的可用电子邮件配额

来自分类Dev

如何在flutter中的side-nav-bar中获取当前登录的用户电子邮件?

来自分类Dev

如何从字段中获取电子邮件ID并将电子邮件发送到该字段

来自分类Dev

给定SHA1,如何在git中获取(仅)作者姓名或电子邮件?

来自分类Dev

如何在go中获取电子邮件正文(使用imap)?

来自分类Dev

如何在Rails中获取电子邮件打开通知?

来自分类Dev

如何在Facebook C#SDK中获取用户的电子邮件

来自分类Dev

如何在iOS中通过Twitter API获取用户电子邮件地址?

Related 相关文章

  1. 1

    如何在 Docusign 中从 JSON 设置电子邮件主题行和电子邮件消息

  2. 2

    如何列出GMail中的所有电子邮件主题?

  3. 3

    如何在iOS中从Twitter获取电子邮件

  4. 4

    如何在Redmine中获取当前用户的电子邮件?

  5. 5

    MailKit:如何遍历最近的电子邮件以获取具有给定主题的电子邮件

  6. 6

    如何使用php imap获取电子邮件的每个主题?

  7. 7

    如何在NetSuite中设置高级PDF电子邮件模板的主题

  8. 8

    如何在电子邮件主题行中添加注册符号

  9. 9

    Outlook:如何在电子邮件中强制使用非空主题?

  10. 10

    如何通过Jmeter获取特定电子邮件ID中收到的最新电子邮件

  11. 11

    如何在Swift 3中获取Facebook用户ID,电子邮件,picture.type(大)

  12. 12

    如何在odoo的电子邮件模板中获取用户公司和管理员的电子邮件ID

  13. 13

    如何从生成的令牌中获取电子邮件

  14. 14

    Microsoft Graph:如何从电子邮件中获取别名?

  15. 15

    如何从生成的令牌中获取电子邮件

  16. 16

    如何从电子邮件中获取收件人

  17. 17

    如何防止SparkPost更改电子邮件中的URL?

  18. 18

    IFTTT:如何避免在电子邮件通道中缩短URL?

  19. 19

    在Powershell中,如何从电子邮件主题行中仅提取7位数字?

  20. 20

    如何编辑在Mutt的邮箱列表中收到的电子邮件的主题?

  21. 21

    如何从 CRM2016 的电子邮件主题行中删除令牌 CRM:XXXX000

  22. 22

    如何通过Ruby on Rails中的营销电子邮件API获取sendgrid中的可用电子邮件配额

  23. 23

    如何在flutter中的side-nav-bar中获取当前登录的用户电子邮件?

  24. 24

    如何从字段中获取电子邮件ID并将电子邮件发送到该字段

  25. 25

    给定SHA1,如何在git中获取(仅)作者姓名或电子邮件?

  26. 26

    如何在go中获取电子邮件正文(使用imap)?

  27. 27

    如何在Rails中获取电子邮件打开通知?

  28. 28

    如何在Facebook C#SDK中获取用户的电子邮件

  29. 29

    如何在iOS中通过Twitter API获取用户电子邮件地址?

热门标签

归档