使用 thunderbird 命令行,如何通过消息 ID 打开特定的电子邮件?

使用 thunderbird 命令行,如何通过消息 ID 打开特定的电子邮件?

Thunderbird 24.2.0 有一个-mail命令行参数,可以使用该参数从命令行打开特定的邮件:

$ thunderbird --help
-mail <URL>        Open the message specified by this URL.

我知道可以使用此功能通过imap://URI 打开特定电子邮件,但我希望能够通过其唯一的 Message-ID 打开特定邮件,无论哪个文件夹包含该邮件。这可能吗?如果可以,URI 是什么样的?

thunderlink 插件(https://addons.mozilla.org/en-us/thunderbird/addon/thunderlink/) 可以创建基于消息 ID 的电子邮件链接,然后使用参数打开这些链接-thunderlink,但我仍然想知道是否可以仅使用-mail参数来完成此操作。

答案1

...对于仍在寻找解决方案的人来说...
以下命令对我有用(thunderbird 102.6.1):

thunderbird mid:<the message ID>

为了使这变得简单和容易:

  1. 确保“thunderbird”命令在 PATH 中(例如,您可以在终端中执行它)
  2. 安装复制消息ID添加在
  3. 在首选项中添加以下内容字首: thunderbird mid:
    (确保前后没有空格!)
  4. 打开电子邮件并点击Copy Message ID按钮
  5. 在终端中运行复制的命令来打开邮件

答案2

更新 2021-03-18:下面提到的错误已经修复Thunderbird 版本 78.8.1. 无需进行任何调整即可使用命令行打开邮件thunderbird.exe -mail <URL>


使用命令行参数打开消息-mail在当前版本的 Thunderbird 上仍然可用(已在Windows 10带版本78.6.0,32 位)。

然而,这需要对模块进行一些小的改变MailNewsCommandLineHandler.jsm,因为否则仅 getter 错误调用 -mail 命令时发生。可以通过 Thunderbird 错误控制台跟踪此错误(见下文)。

调整模块:

  1. 将文件复制c:\Program Files (x86)\Mozilla Thunderbird\omni.ja到临时目录,将文件重命名为omni.zip并将其解压。

  2. 打开 MailNewsCommandLineHandler.jsm,插入

    set _messenger(value) {
        return value;
    }, 
    

    第 22 行并保存文件。

  3. 重新打包使用以下参数打包所有文件:zip.exe -0DXqr omni.ja *。将原始文件重命名为,omni.ja.bak并将重新打包的文件复制到c:\Program Files (x86)\Mozilla Thunderbird

  4. 然后可以使用以下命令行打开消息:

    thunderbird.exe -mail "mailbox-message://<folderLocation>#<messageKey>" (for local folders)
    thunderbird.exe -mail "imap-message://<folderLocation>#<messageKey>" (for IMAP folders)
    

找到正确的 URL:

  • 错误控制台打开 TB,选择一条消息并打开错误控制台(Ctrl + Shift + J)。输入以下行

    var hdr = gFolderDisplay.selectedMessage; alert(hdr.folder.getUriForMsg(hdr));
    

    然后按回车键。这将打开一个窗口,其中包含所选消息的 URL。

  • SQLite 数据库:如果你打算构建自己的搜索工具(例如通过编写 Python 插件来Wox桌面启动器),也许最好是动态创建 URL。

    Thunderbird 数据库位于%APPDATA%\Thunderbird\Profiles\<profile>\global-messages-db.sqlite。表格messagesText_content消息文件夹位置包含组装 URL 字符串所需的所有信息。

    可用于生成 URL 的简单 Python 脚本可能如下所示:

    import sqlite3
    import re
    import sys
    import os
    import json
    
    # Replace db_path with your profile location
    # (Help > Troubleshooting Information > Open Folder)
    db_path = r"%APPDATA%\Thunderbird\Profiles\xxxxxxxx.default"
    
    con = sqlite3.connect(os.path.join(db_path, "global-messages-db.sqlite"))
    cursor = con.cursor()
    
    query = """
        SELECT messagesText_content.*, 
               strftime('%Y-%m-%d, %H:%M', 
                        DATETIME(messages.date/1000000, 
                        "unixepoch", "localtime")),
               messages.folderID,
               messages.messageKey
        FROM messagesText_content
        JOIN messages ON messages.id=messagesText_content.docid
        WHERE messagesText_content.c3author NOT LIKE "%daemon%"
        OR messagesText_content.c3author NOT LIKE "%DAEMON%"
        ORDER BY messages.date DESC
        """
    
    def get_messages():
        messages = []
        cursor.execute(query)
        for i in cursor:
            messages.append({
                "text": i[1] if i[1] else "",
                "subject": i[2], 
                "attachments": f'attach:{i[3]}' if i[3] else "",
                "sender": i[4], 
                "receiver": i[5], 
                "date": i[6], 
                "folder_id": i[7],
                "message_key": i[8]
                })
        return messages
    
    def get_folders():
        cursor.execute("SELECT * FROM folderLocations")
        return {i[0]: i[1:] for i in cursor.fetchall()}
    
    def collect_urls(terms):
        r1 = "(mailbox|imap)(?=://)"
        r2 = "\\1-message"
        messages = get_messages()
        folders = get_folders()
        results = {}
        for msg in messages:
            msg_str = str(msg.values()).lower()
            if all(i.lower() in msg_str for i in terms):
                folder = folders.get(msg["folder_id"])[0]
                url = re.sub(r1, r2, folder)
                url = f'{url}#{msg["message_key"]}'
                msg["text"] = msg["text"][:50]
                results.update({url: msg})
        return json.dumps(
            results, 
            indent=4,
            ensure_ascii=False
            )
    
    if __name__ == "__main__":
        if len(sys.argv) > 1:
            print(collect_urls(sys.argv[1:]))
    

    像这样使用即可:

     <C:\>python collect_urls.py search terms test message
    
     {
         "imap-message://a%[email protected]/INBOX#28649": {
             "text": "Test message contains search terms",
             "subject": "Test message",
             "attachments": "",
             "sender": "John Doe <[email protected]>",
             "receiver": "[email protected]",
             "date": "2022-10-02, 14:20",
             "folder_id": 607,
             "message_key": 28649
         }
     }
    

相关内容