如何通过Thunderbird扩展处理订阅源文件夹?开发自动恢复暂停RSS订阅的扩展是否可行?
Thunderbird doesn’t offer a dedicated RSS-focused MailExtensions API, but combining the existing folders and alarms APIs (plus a few workarounds to identify RSS folders) lets you fully implement auto-resume for error-paused feeds. Here’s a practical, step-by-step solution:
Core Approach
- Identify RSS folders: Use indirect folder properties (like
typeor URI patterns) to spot RSS folders, since there’s no explicit flag in the official API. - Catch auto-pause events: Listen for when an RSS folder gets marked as "Pause Updates" due to fetch errors.
- Schedule auto-resume: Use the
alarmsAPI to set a delayed task that re-enables updates for the paused folder.
Step 1: Set Up Extension Permissions
First, define the permissions your extension needs in manifest.json:
{ "manifest_version": 2, "name": "RSS Auto-Resume", "version": "1.0", "description": "Automatically resume RSS feeds paused by fetch errors", "permissions": ["folders", "alarms", "storage"], "background": { "scripts": ["background.js"] } }
Step 2: Detect RSS Folders
Thunderbird tags RSS folders with unique attributes we can leverage. This helper function checks if a folder is an RSS feed container:
async function isRssFolder(folderId) { const folder = await messenger.folders.getFolder(folderId); // RSS folders typically have a "rss" type or a URI starting with "rss:" return folder.type === "rss" || folder.uri.startsWith("rss:"); }
Step 3: Listen for Paused Folders & Schedule Resumes
Add a listener to detect when a folder’s update status changes. When an RSS folder gets paused, we create an alarm to trigger the resume:
// Listen for changes to folder properties messenger.folders.onFolderUpdated.addListener(async (folderUpdate) => { // Only react when a folder is set to pause updates const pauseChange = folderUpdate.changes.pauseUpdates; if (pauseChange && pauseChange.newValue === true) { const folderId = folderUpdate.folderId; if (await isRssFolder(folderId)) { // Create an alarm to resume after 30 minutes (customize this as needed) const alarmName = `resume-rss-${folderId}`; await messenger.alarms.create(alarmName, { delayInMinutes: 30 }); // Store the folder ID linked to this alarm to avoid duplicates await messenger.storage.local.set({ [alarmName]: folderId }); } } });
Step 4: Handle Alarm Triggers to Resume Updates
When the alarm fires, we use the folders.update API to re-enable updates for the paused folder:
// Listen for alarm triggers messenger.alarms.onAlarm.addListener(async (alarm) => { if (alarm.name.startsWith("resume-rss-")) { // Retrieve the linked folder ID from storage const storedData = await messenger.storage.local.get(alarm.name); const folderId = storedData[alarm.name]; if (folderId) { // Resume updates for the folder await messenger.folders.update(folderId, { pauseUpdates: false }); // Clean up the stored entry await messenger.storage.local.remove(alarm.name); } } });
Bonus: Target Only Error-Induced Pauses
If you want to avoid resuming folders users paused manually, add a listener to track RSS fetch errors and only target those folders:
// Track folders that had recent fetch errors const erroredFeedFolders = new Set(); // Listen for RSS fetch errors (Thunderbird 91+) messenger.messages.onFeedError.addListener((errorDetails) => { erroredFeedFolders.add(errorDetails.folderId); }); // Update the folder pause listener to only target error-paused folders messenger.folders.onFolderUpdated.addListener(async (folderUpdate) => { const pauseChange = folderUpdate.changes.pauseUpdates; if (pauseChange && pauseChange.newValue === true) { const folderId = folderUpdate.folderId; if (await isRssFolder(folderId) && erroredFeedFolders.has(folderId)) { // Schedule resume as before... const alarmName = `resume-rss-${folderId}`; await messenger.alarms.create(alarmName, { delayInMinutes: 30 }); await messenger.storage.local.set({ [alarmName]: folderId }); // Remove the folder from our error list so we don't reprocess it erroredFeedFolders.delete(folderId); } } });
Key Notes
- Test with Thunderbird 91 or newer (some API features aren’t available in older versions)
- Let users customize the resume delay using the
storageAPI (add a simple options UI) - If
folders.updatedoesn’t work forpauseUpdatesin rare cases, try fetching the full folder object withmessenger.folders.getFolderand modifying it directly (though the standard update method should work for most versions)
内容的提问来源于stack exchange,提问作者Someone

