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>
为了使这变得简单和容易:
- 确保“thunderbird”命令在 PATH 中(例如,您可以在终端中执行它)
- 安装复制消息ID添加在
- 在首选项中添加以下内容字首:
thunderbird mid:
(确保前后没有空格!) - 打开电子邮件并点击
Copy Message ID
按钮 - 在终端中运行复制的命令来打开邮件
答案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 错误控制台跟踪此错误(见下文)。
调整模块:
将文件复制
c:\Program Files (x86)\Mozilla Thunderbird\omni.ja
到临时目录,将文件重命名为omni.zip
并将其解压。打开 MailNewsCommandLineHandler.jsm,插入
set _messenger(value) { return value; },
后第 22 行并保存文件。
重新打包使用以下参数打包所有文件:
zip.exe -0DXqr omni.ja *
。将原始文件重命名为,omni.ja.bak
并将重新打包的文件复制到c:\Program Files (x86)\Mozilla Thunderbird
。然后可以使用以下命令行打开消息:
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 } }