// A wrapper function returning an async iterator for a MessageList. Derived from
// https://webextension-api.thunderbird.net/en/91/how-to/messageLists.html
async function* iterateMessagePages(page) {
for (let message of page.messages) {
page = await messenger.messages.continueList(page.id);
for (let message of page.messages) {
// Add a listener for the onNewMailReceived events.
await messenger.messages.onNewMailReceived.addListener(async (folder, messages) => {
let { messageLog } = await messenger.storage.local.get({ messageLog: [] });
for await (let message of iterateMessagePages(messages)) {
await messenger.storage.local.set({ messageLog });
// Create the menu entries.
let menu_id = await messenger.menus.create({
title: "Show received email",
// Register a listener for the menus.onClicked event.
await messenger.menus.onClicked.addListener(async (info, tab) => {
if (info.menuItemId == menu_id) {
// Our menu entry was clicked
let { messageLog } = await messenger.storage.local.get({ messageLog: [] });
let last24h = messageLog.filter(e => (now - e.time) < 24 * 60 * 1000);
for (let entry of last24h) {
messenger.notifications.create({
"iconUrl": "images/internet.png",
"title": `${entry.folder}: ${entry.message.author}`,
"message": entry.message.subject
* Add a handler for communication with other parts of the extension,
* like our message display script.
* Note: If this handler is defined async, there should be only one such
* handler in the background script for all incoming messages.
messenger.runtime.onMessage.addListener(async (message, sender) => {
// Check if the message includes our command member.
if (message && message.hasOwnProperty("command")) {
// Get the message currently displayed in the sending tab, abort if
const messageHeader = await messenger.messageDisplay.getDisplayedMessage(sender.tab.id);
// Check for known commands.
switch (message.command) {
// Create the information we want to return to our message display script.
return { text: `Mail subject is "${messageHeader.subject}"` };
// mark the message as unread
messenger.messages.update(messageHeader.id, {
// Register the message display script.
messenger.messageDisplayScripts.register({
js: [{ file: "messageDisplay/message-content-script.js" }],
css: [{ file: "messageDisplay/message-content-styles.css" }],
document.addEventListener("DOMContentLoaded", load);