微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从Thunderbird中的后台脚本将文件上传到远程服务器

如何解决从Thunderbird中的后台脚本将文件上传到远程服务器

我正在开发Thunderbird扩展程序,可以上传邮件中的附件。扩展流程如下:

  1. 单击扩展程序图标将显示一个弹出窗口,用于选择“全部读取”,“已读选定内容”和“未读读取”选项之一
  2. 当我选择包含附件的电子邮件并选择“读取所选”选项时,将触发“读取所选” onclick事件的侦听器。
  3. 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对象的数组。我可以看到附件的名称(在我的情况下,所选邮件将DOCX文件作为附件)。问题是,如何获取文件?我需要二进制文件数据,因为在将其上传到远程服务器之前,需要将其转换为Base64字符串。我查看了以下SO帖子:post1post2,但是由于这些帖子都建议使用需要URI的nsIFile接口,因此我不确定其工作原理。提供的部分没有此类URI。

如果需要更多信息,请在评论中问我,我将更新问题(其余代码大部分用于处理对上面(1)中讨论的其他选项的调用)。一些准则和帮助将不胜感激。谢谢。

解决方法

在撰写本文时,我认为这是不可能的。好吧,您仍然有messages.getRaw()可以向您返回承诺中消息的完整来源,包括附件,但是您必须再次解析消息,这并非易事。

我建议关注或评论相关的雷鸟问题。我发现this one也许还有that one与您的问题有关。

注意:链接的其他问题是指较旧的加载项类型,而不是基于WebExtensions API。尽管不建议在现代附加组件中使用它(因为旧版组件可能会在任何升级中损坏),但可能可以通过所谓的experiments访问旧版API,但是我对这些方面的经验很少告诉您他们是否可以帮助您完成您想要的事情。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。