Я разрабатываю расширение Thunderbird, которое может загружать прикрепленные файлы по почте. Поток расширения выглядит следующим образом:
- При нажатии на значок расширения отображается всплывающее окно для выбора одного из вариантов «Читать все», «Читать выбранное» и «Читать непрочитанное».
- Когда я выбираю электронное письмо, содержащее вложение, и выбираю опцию «Прочитать выбранное», запускается прослушиватель для события «Прочитать выбранное
onclick
». - Слушатель
onclick
отправляет сообщение фоновому сценарию для обработки загрузки.
Вот код, который у меня есть до сих пор:
всплывающее окно.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
});
}
}
фон.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: post1 и post2, но я не уверен, как это работает, поскольку оба сообщения предлагают использовать nsIFile
интерфейс, для которого требуется URI. Для предоставленных частей такого URI нет.
Если требуется дополнительная информация, спросите меня в комментарии, и я обновлю вопрос (остальная часть кода в основном обрабатывает вызовы для других параметров, как описано в (1) выше). Некоторые рекомендации и помощь будут высоко оценены. Спасибо.