从 Thunderbird 中的后台脚本上传文件到远程服务器
Uploading a file to remote server from background script in Thunderbird
我正在开发一个可以在邮件中上传附件的 Thunderbird 扩展。分机流程如下:
- 单击扩展程序图标会显示select“阅读全部”、“阅读所选”和“阅读未读”选项之一的弹出窗口
- 当我 select 一封包含附件的电子邮件并选择“阅读所选内容”选项时,“阅读所选内容”
onclick
事件的监听器被触发。
onclick
监听器向后台脚本发送消息处理上传
这是我目前的代码:
popup.js
async function readSelected() {
// this function is invoked by the listener
const msgList = await browser.mailTabs.getSelectedMessages();
if(msgList.messages) {
await browser.runtime.sendMessage({
caller: 'readSelected',
messages: msgList.messages
});
}
}
background.js
browser.runtime.onMessage.addListener((req, sender, res) => {
// messages is an Array of MessageHeader objects
const { caller, accounts, all, messages } = req;
// ... code for handling other cases
console.log('Reading selected');
console.log(messages);
const ids = [];
for(const msg of messages) {
ids.push(msg.id);
}
// maps all ids to promises that resolves to MessagePart objects
Promise.all(ids.map(id => browser.messages.getFull(id)))
.then(messages => {
console.log(messages);
}).catch(e => console.error(e));
});
在 background.js
的控制台中,我看到每个 MessagePart
对象都有一个 parts
数组,该数组又是 MessagePart
对象的数组。我可以看到附件的名称(在我的例子中,selected 消息有一个 DOCX 文件作为附件)。问题是,如何获取文件?我需要二进制文件数据,因为我需要先将其转换为 Base64 字符串,然后才能上传到远程服务器。我查看了以下 SO 帖子:post1 and post2 但我不确定它是如何工作的,因为这两篇帖子都建议使用 nsIFile
接口,它需要一个 URI。提供的部分没有这样的 URI。
如果需要更多信息,请在评论中询问我,我会更新问题(其余代码主要处理上面 (1) 中讨论的其他选项的调用)。一些指南和帮助将受到高度赞赏。谢谢。
在撰写本文时,我认为这是不可能的。好吧,您仍然 messages.getRaw()
returns 您是承诺中消息的完整来源,包括附件,但您必须再次解析消息,这并非易事。
我建议关注相关的 Thunderbird 问题,或者评论。我发现 this one and maybe that one 似乎与您的问题有关。
注意:您链接的其他问题指的是旧类型的附加组件,而不是基于 WebExtensions API。虽然不建议现代附加组件这样做(因为遗留组件可能会在任何升级时损坏),但可以通过所谓的 experiments 访问遗留 API,但我也有很少有经验告诉你他们是否会帮助你做你想做的事。
我正在开发一个可以在邮件中上传附件的 Thunderbird 扩展。分机流程如下:
- 单击扩展程序图标会显示select“阅读全部”、“阅读所选”和“阅读未读”选项之一的弹出窗口
- 当我 select 一封包含附件的电子邮件并选择“阅读所选内容”选项时,“阅读所选内容”
onclick
事件的监听器被触发。 onclick
监听器向后台脚本发送消息处理上传
这是我目前的代码:
popup.js
async function readSelected() {
// this function is invoked by the listener
const msgList = await browser.mailTabs.getSelectedMessages();
if(msgList.messages) {
await browser.runtime.sendMessage({
caller: 'readSelected',
messages: msgList.messages
});
}
}
background.js
browser.runtime.onMessage.addListener((req, sender, res) => {
// messages is an Array of MessageHeader objects
const { caller, accounts, all, messages } = req;
// ... code for handling other cases
console.log('Reading selected');
console.log(messages);
const ids = [];
for(const msg of messages) {
ids.push(msg.id);
}
// maps all ids to promises that resolves to MessagePart objects
Promise.all(ids.map(id => browser.messages.getFull(id)))
.then(messages => {
console.log(messages);
}).catch(e => console.error(e));
});
在 background.js
的控制台中,我看到每个 MessagePart
对象都有一个 parts
数组,该数组又是 MessagePart
对象的数组。我可以看到附件的名称(在我的例子中,selected 消息有一个 DOCX 文件作为附件)。问题是,如何获取文件?我需要二进制文件数据,因为我需要先将其转换为 Base64 字符串,然后才能上传到远程服务器。我查看了以下 SO 帖子:post1 and post2 但我不确定它是如何工作的,因为这两篇帖子都建议使用 nsIFile
接口,它需要一个 URI。提供的部分没有这样的 URI。
如果需要更多信息,请在评论中询问我,我会更新问题(其余代码主要处理上面 (1) 中讨论的其他选项的调用)。一些指南和帮助将受到高度赞赏。谢谢。
在撰写本文时,我认为这是不可能的。好吧,您仍然 messages.getRaw()
returns 您是承诺中消息的完整来源,包括附件,但您必须再次解析消息,这并非易事。
我建议关注相关的 Thunderbird 问题,或者评论。我发现 this one and maybe that one 似乎与您的问题有关。
注意:您链接的其他问题指的是旧类型的附加组件,而不是基于 WebExtensions API。虽然不建议现代附加组件这样做(因为遗留组件可能会在任何升级时损坏),但可以通过所谓的 experiments 访问遗留 API,但我也有很少有经验告诉你他们是否会帮助你做你想做的事。