尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于Chrome扩展与Gmail API的邮箱自动化整理工具开发实战

基于Chrome扩展与Gmail API的邮箱自动化整理工具开发实战 大家好我是专注于提升开发效率的博主。在日常工作中Gmail 邮箱常常被各种订阅邮件、通知和推广信息淹没手动整理费时费力。本文将分享如何从零开发一个名为 “Lindy” 的 Chrome 扩展它能根据预设规则在夜间自动帮你整理 Gmail 收件箱实现邮件的自动分类、归档或加星标让你每天清晨都能看到一个清爽的邮箱。无论你是前端开发者想学习 Chrome 扩展开发还是对 Gmail API 和自动化感兴趣这篇文章都将带你走完全流程。我们将从扩展的 Manifest V3 规范讲起逐步实现 Gmail API 的授权、邮件读取与处理逻辑并最终打包发布。学完后你将掌握一个完整的、可运行的 Chrome 扩展项目。1. 背景与核心概念1.1 为什么需要自动整理邮箱对于重度使用 Gmail 的用户尤其是开发者、项目经理或商务人士收件箱管理是一个高频且耗时的任务。促销邮件、GitHub 通知、服务器报警、周报等邮件混杂在一起重要信息容易被淹没。手动创建过滤器Filter是一个办法但不够灵活无法处理复杂的、基于内容的判断例如识别出包含“紧急”字样的项目周报。一个能在后台静默运行按照我们编写的逻辑进行智能整理的扩展可以极大解放生产力。1.2 Chrome 扩展与 Manifest V3Chrome 扩展是一种用于定制和增强 Chrome 浏览器功能的小型软件程序。它由 HTML、CSS、JavaScript 和图片等资源组成。Manifest 文件manifest.json是扩展的“说明书”定义了扩展的基本信息、权限和功能。目前Chrome 官方主推Manifest V3规范。与 V2 相比V3 主要变化包括服务工作者Service Worker替代后台页面Background Page更省内存生命周期由事件驱动。远程代码限制所有代码必须打包在扩展内不能动态执行远程代码提升了安全性。权限模型细化权限声明更具体。 我们的 “Lindy” 扩展将基于 Manifest V3 开发以确保其长期兼容性。1.3 Gmail API 简介Gmail API 是 Google 提供的一套 RESTful API允许开发者以编程方式读取、发送、修改 Gmail 中的邮件和标签。通过 OAuth 2.0 授权后我们的扩展就可以代表用户在用户同意下安全地访问其邮箱数据。我们将使用它来获取邮件列表、读取邮件内容、修改邮件标签如归档、加星标。2. 环境准备与版本说明在开始编码前请确保你的开发环境已就绪。2.1 基础环境操作系统Windows 10/11, macOS, 或 Linux (本文示例在 macOS 下演示命令通用)。Chrome 浏览器版本 115 或更高确保支持 Manifest V3。你可以在 Chrome 的chrome://version/页面查看版本。代码编辑器VS Code推荐或任何你熟悉的编辑器。Node.js npm可选用于后续可能的构建工具。本文核心不依赖 Node。2.2 创建 Google Cloud 项目与启用 Gmail API这是扩展能与 Gmail 交互的关键前提。请严格遵循以下步骤访问 Google Cloud Console打开浏览器访问 Google Cloud Console 。创建新项目点击顶部项目下拉菜单选择“新建项目”为其命名例如 “Lindy-Gmail-Extension”然后点击“创建”。启用 Gmail API在项目仪表板中点击左侧导航栏的“API和服务” - “库”。在搜索框中输入“Gmail API”找到后点击进入然后点击“启用”。配置 OAuth 同意屏幕在“API和服务”下选择“OAuth 同意屏幕”。用户类型选择“外部”点击“创建”。填写应用名称如“Lindy Mail Organizer”、用户支持邮箱、开发者联系邮箱。在“已授权的域”部分添加chrome.google.com为后续上架商店准备本地测试可先跳过。在“范围”页面点击“添加或删除范围”。手动输入并添加以下两个范围https://www.googleapis.com/auth/gmail.readonly(读取邮件)https://www.googleapis.com/auth/gmail.modify(修改邮件如加标签、归档)添加你自己的邮箱为测试用户后续授权时需要。后续步骤可快速跳过直到保存。创建 OAuth 2.0 客户端凭据在“API和服务”下选择“凭据”。点击“创建凭据” - “OAuth 2.0 客户端 ID”。应用类型选择“Chrome 应用”。在“应用 ID”栏中你需要填写你的 Chrome 扩展 ID。对于本地测试可以先填写localhost或者先留空创建后再修改。更稳妥的做法是 a. 先创建一个基础的manifest.json文件见下一节。 b. 在 Chrome 中打开chrome://extensions/开启“开发者模式”。 c. 点击“加载已解压的扩展程序”选择你的项目文件夹。 d. 此时扩展会被加载并生成一个唯一的“扩展程序 ID”如abcdefghijklmnopqrstuvwxyzabcdef。 e. 回到 Google Cloud Console将这个 ID 填入“应用 ID”栏。点击“创建”。系统会生成客户端 IDClient ID。请妥善保存这个字符串我们稍后需要将它写入扩展的manifest.json文件。重要确保你启用的 API 和配置的 OAuth 范围与代码中请求的完全一致否则会导致授权失败。3. 项目结构与核心文件拆解一个典型的 Chrome 扩展项目包含以下核心文件。我们先创建项目文件夹lindy-gmail-organizer并在其中建立如下结构lindy-gmail-organizer/ ├── manifest.json # 扩展配置文件 ├── background.js # 后台服务工作者脚本 ├── popup.html # 扩展弹出窗口的界面 ├── popup.js # 弹出窗口的交互逻辑 ├── options.html # 扩展选项页面用于配置规则 ├── options.js # 选项页面的交互逻辑 ├── content.js # 内容脚本可选本例中可能不需要 ├── icons/ # 扩展图标文件夹 │ ├── icon16.png │ ├── icon48.png │ └── icon128.png └── _locales/ # 国际化文件夹可选 └── en/ └── messages.json3.1 Manifest.json 详解这是扩展的核心配置文件定义了扩展的元数据、权限和资源。{ manifest_version: 3, name: Lindy - Gmail Auto Organizer, version: 1.0.0, description: Automatically organizes your Gmail inbox at night based on custom rules., icons: { 16: icons/icon16.png, 48: icons/icon48.png, 128: icons/icon128.png }, action: { default_popup: popup.html, default_title: Lindy Gmail Organizer }, options_page: options.html, background: { service_worker: background.js, type: module }, permissions: [ identity, storage, alarms ], oauth2: { client_id: YOUR_GOOGLE_CLOUD_CLIENT_ID.apps.googleusercontent.com, scopes: [ https://www.googleapis.com/auth/gmail.readonly, https://www.googleapis.com/auth/gmail.modify ] }, host_permissions: [ https://www.googleapis.com/* ] }关键字段解释manifest_version: 必须为 3。permissions: 申请扩展所需权限。identity: 用于 OAuth 2.0 身份验证。storage: 用于在本地存储用户配置的整理规则。alarms: 用于创建定时任务触发夜间整理。oauth2: 包含从 Google Cloud Console 获取的client_id和所需的 API 范围 (scopes)。host_permissions: 声明扩展需要访问的远程主机这里是对 Gmail API 的请求地址。请务必将client_id替换为你自己在 Google Cloud Console 创建的实际 ID。3.2 后台服务工作者 (background.js)在 Manifest V3 中后台逻辑运行在一个独立的 Service Worker 中。它没有 DOM 访问权限但可以监听扩展事件、使用 Chrome API、发起网络请求。它的核心职责包括处理 OAuth 2.0 身份验证流程。管理定时任务chrome.alarms在指定时间如凌晨2点触发整理任务。执行整理任务调用 Gmail API应用规则处理邮件。// background.js // 存储访问令牌 let accessToken null; // 监听扩展安装事件 chrome.runtime.onInstalled.addListener(() { console.log(Lindy扩展已安装。); // 创建每日凌晨2点触发的闹钟 chrome.alarms.create(nightlyCleanup, { periodInMinutes: 24 * 60, // 每天一次 when: getNext2AM() // 下次凌晨2点的时间戳 }); }); // 计算下一个凌晨2点的时间戳 function getNext2AM() { const now new Date(); const next2AM new Date(now); next2AM.setHours(2, 0, 0, 0); if (now next2AM) { next2AM.setDate(next2AM.getDate() 1); } return next2AM.getTime(); } // 监听闹钟触发事件 chrome.alarms.onAlarm.addListener((alarm) { if (alarm.name nightlyCleanup) { console.log(夜间整理闹钟触发); startOrganizationProcess(); } }); // 主要的整理流程 async function startOrganizationProcess() { try { // 1. 获取访问令牌 accessToken await getValidAccessToken(); if (!accessToken) { console.error(无法获取有效的访问令牌。); return; } // 2. 从本地存储中获取用户定义的规则 const rules await getStoredRules(); if (!rules || rules.length 0) { console.log(未找到整理规则任务终止。); return; } // 3. 获取需要处理的邮件列表例如过去24小时内收到的未读邮件 const messages await fetchRecentEmails(accessToken); if (!messages || messages.length 0) { console.log(没有找到需要处理的邮件。); return; } // 4. 对每封邮件应用规则 for (const message of messages) { await processSingleEmail(message, rules, accessToken); } console.log(夜间整理完成共处理了 ${messages.length} 封邮件。); } catch (error) { console.error(整理过程发生错误, error); } } // 获取有效的 OAuth 访问令牌 function getValidAccessToken() { return new Promise((resolve) { chrome.identity.getAuthToken({ interactive: false }, (token) { if (chrome.runtime.lastError) { // 非交互式获取失败可能是用户未登录或令牌过期 console.log(尝试非交互式获取令牌失败, chrome.runtime.lastError); resolve(null); } else { resolve(token); } }); }); } // 从 chrome.storage 中获取规则 function getStoredRules() { return new Promise((resolve) { chrome.storage.sync.get([organizationRules], (result) { resolve(result.organizationRules || []); }); }); }background.js是扩展的大脑它协调了整个自动化流程。chrome.alarmsAPI 让我们可以可靠地执行定时任务即使浏览器关闭Service Worker 在下次启动时也会检查错过的闹钟。3.3 选项页面 (options.html options.js)用户需要通过一个界面来设置整理规则。我们将创建一个简单的选项页面。!-- options.html -- !DOCTYPE html html head meta charsetutf-8 titleLindy - 规则设置/title style body { font-family: sans-serif; padding: 20px; max-width: 800px; margin: auto; } .rule { border: 1px solid #ccc; padding: 15px; margin-bottom: 15px; border-radius: 5px; background: #f9f9f9; } input, select, button { margin: 5px; padding: 8px; } button { cursor: pointer; background-color: #4CAF50; color: white; border: none; border-radius: 4px; } button.delete { background-color: #f44336; } #addRule { background-color: #008CBA; } /style /head body h1 Lindy 邮箱整理规则/h1 p在这里创建规则Lindy 将在夜间自动处理匹配的邮件。/p div idrulesContainer !-- 规则将通过JS动态添加到这里 -- /div button idaddRule 添加新规则/button button idsaveRules 保存所有规则/button p idstatus/p script srcoptions.js/script /body /html// options.js document.addEventListener(DOMContentLoaded, loadRules); const ruleTemplate (rule {}) div classrule>// background.js (续) /** * 获取最近一段时间内的邮件例如过去24小时 * param {string} token - OAuth 访问令牌 * returns {PromiseArray} - 邮件对象数组包含id, threadId等 */ async function fetchRecentEmails(token) { // 计算24小时前的时间戳 const oneDayAgo new Date(); oneDayAgo.setDate(oneDayAgo.getDate() - 1); const afterTimestamp Math.floor(oneDayAgo.getTime() / 1000); // 转换为秒 // 构造查询字符串过去24小时内未读在收件箱中非已归档 const query after:${afterTimestamp} is:unread in:inbox; const url https://www.googleapis.com/gmail/v1/users/me/messages?q${encodeURIComponent(query)}maxResults50; try { const response await fetch(url, { headers: { Authorization: Bearer ${token}, Content-Type: application/json } }); if (!response.ok) { throw new Error(Gmail API 请求失败: ${response.status}); } const data await response.json(); return data.messages || []; // 返回邮件列表 } catch (error) { console.error(获取邮件列表失败, error); return []; } }4.2 获取单封邮件的详细内容并处理获取邮件列表后我们需要根据 ID 获取每封邮件的详细信息发件人、主题、正文片段等然后应用用户定义的规则。// background.js (续) /** * 获取单封邮件的详细信息 * param {string} messageId - 邮件ID * param {string} token - OAuth 访问令牌 * returns {PromiseObject} - 包含邮件头信息的对象 */ async function getEmailDetails(messageId, token) { const url https://www.googleapis.com/gmail/v1/users/me/messages/${messageId}?formatmetadatametadataHeadersFrommetadataHeadersSubject; const response await fetch(url, { headers: { Authorization: Bearer ${token}, } }); const data await response.json(); // 解析邮件头 const headers data.payload.headers; const from headers.find(h h.name From)?.value || ; const subject headers.find(h h.name Subject)?.value || ; // 获取正文片段snippet const snippet data.snippet || ; return { id: messageId, from, subject, snippet }; } /** * 处理单封邮件应用所有匹配的规则 * param {Object} message - 基础邮件对象含id * param {Array} rules - 用户定义的规则数组 * param {string} token - OAuth 访问令牌 */ async function processSingleEmail(message, rules, token) { // 1. 获取邮件详情 const emailDetails await getEmailDetails(message.id, token); console.log(处理邮件: ${emailDetails.subject}); // 2. 遍历所有规则检查是否匹配 for (const rule of rules) { if (isRuleMatch(emailDetails, rule)) { console.log( 匹配规则: ${rule.name}执行动作: ${rule.action}); // 3. 执行规则对应的动作 await executeAction(message.id, rule, token); // 一条规则匹配并执行后可以跳出避免同一邮件被多个规则重复处理 // 如果你想允许多个规则生效可以移除 break; break; } } } /** * 判断邮件是否匹配某条规则 * param {Object} email - 邮件详情对象 * param {Object} rule - 单条规则对象 * returns {boolean} */ function isRuleMatch(email, rule) { const keyword rule.matchKeyword.toLowerCase(); switch (rule.matchField) { case from: return email.from.toLowerCase().includes(keyword); case subject: return email.subject.toLowerCase().includes(keyword); case body: return email.snippet.toLowerCase().includes(keyword); default: return false; } } /** * 执行规则中定义的动作 * param {string} messageId - 邮件ID * param {Object} rule - 规则对象 * param {string} token - OAuth 访问令牌 */ async function executeAction(messageId, rule, token) { const baseUrl https://www.googleapis.com/gmail/v1/users/me/messages/${messageId}; switch (rule.action) { case archive: // 从收件箱中移除移动到“所有邮件” await modifyLabels(messageId, token, { removeLabelIds: [INBOX] }); break; case star: // 添加星标 await modifyLabels(messageId, token, { addLabelIds: [STARRED] }); break; case markRead: // 标记为已读移除 UNREAD 标签 await modifyLabels(messageId, token, { removeLabelIds: [UNREAD] }); break; case addLabel: // 添加自定义标签需要先获取或创建标签ID此处为简化假设标签已存在 // 实际项目中需要先调用 labels.list 获取标签ID或 labels.create 创建新标签 if (rule.labelName) { console.warn(添加自定义标签功能需要更复杂的实现标签名: ${rule.labelName}); // 此处留空作为高级功能扩展点 } break; default: console.warn(未知动作: ${rule.action}); } } /** * 修改邮件的标签通用函数 * param {string} messageId - 邮件ID * param {string} token - OAuth 访问令牌 * param {Object} changes - 标签变更对象 {addLabelIds: [], removeLabelIds: []} */ async function modifyLabels(messageId, token, changes) { const url https://www.googleapis.com/gmail/v1/users/me/messages/${messageId}/modify; try { const response await fetch(url, { method: POST, headers: { Authorization: Bearer ${token}, Content-Type: application/json }, body: JSON.stringify(changes) }); if (!response.ok) { throw new Error(修改标签失败: ${response.status}); } console.log( 邮件 ${messageId} 标签修改成功。); } catch (error) { console.error(修改邮件标签时出错:, error); } }至此扩展的核心自动化逻辑已经完成。它能够在设定的时间获取未读邮件根据用户设置的规则发件人、主题、正文关键词进行匹配并执行相应的归档、加星标等操作。5. 弹出窗口与用户交互虽然整理是自动的但我们仍需要一个简单的弹出窗口Popup让用户快速查看状态或手动触发整理。!-- popup.html -- !DOCTYPE html html head meta charsetutf-8 style body { width: 300px; padding: 15px; font-family: sans-serif; } button { width: 100%; padding: 10px; margin: 5px 0; background-color: #4285f4; color: white; border: none; border-radius: 4px; cursor: pointer; } button:hover { background-color: #3367d6; } #status { margin-top: 10px; padding: 10px; border-radius: 4px; text-align: center; } .success { background-color: #d4edda; color: #155724; } .error { background-color: #f8d7da; color: #721c24; } .info { background-color: #d1ecf1; color: #0c5460; } /style /head body h3 Lindy/h3 p自动整理你的 Gmail 收件箱。/p button idauthButton 登录并授权/button button idrunNowButton 立即运行整理/button button idopenOptions⚙️ 配置规则/button div idstatus/div script srcpopup.js/script /body /html// popup.js document.addEventListener(DOMContentLoaded, function() { document.getElementById(authButton).addEventListener(click, authenticate); document.getElementById(runNowButton).addEventListener(click, runOrganizationNow); document.getElementById(openOptions).addEventListener(click, () { chrome.runtime.openOptionsPage(); }); }); function showStatus(message, type info) { const statusEl document.getElementById(status); statusEl.textContent message; statusEl.className type; setTimeout(() { statusEl.textContent ; statusEl.className ; }, 5000); } function authenticate() { // 使用 interactive: true 触发交互式授权流程 chrome.identity.getAuthToken({ interactive: true }, (token) { if (chrome.runtime.lastError) { showStatus(授权失败: chrome.runtime.lastError.message, error); } else { showStatus(✅ 授权成功, success); } }); } function runOrganizationNow() { // 通过发送消息给后台服务工作者触发整理流程 chrome.runtime.sendMessage({ action: runOrganization }, (response) { if (chrome.runtime.lastError) { showStatus(请求失败: chrome.runtime.lastError.message, error); } else if (response response.success) { showStatus(整理任务已开始请查看后台日志。, success); } else { showStatus(整理任务启动失败。, error); } }); } // 在 background.js 中需要添加消息监听器 // chrome.runtime.onMessage.addListener((message, sender, sendResponse) { // if (message.action runOrganization) { // startOrganizationProcess(); // sendResponse({ success: true }); // } // });弹出窗口提供了便捷的入口。用户首次使用时需要点击“登录并授权”按钮完成 OAuth 流程。之后可以随时手动触发整理或跳转到选项页面修改规则。6. 加载、测试与调试6.1 加载扩展打开 Chrome进入chrome://extensions/。开启右上角的“开发者模式”。点击“加载已解压的扩展程序”。选择你项目所在的文件夹lindy-gmail-organizer。扩展将被加载并显示在扩展列表中。6.2 测试流程首次授权点击扩展图标在弹出窗口中点击“登录并授权”。会弹出一个新的 Google 登录和授权窗口请确保选择你配置了测试用户的账号并授予请求的权限。配置规则点击弹出窗口的“配置规则”或右键扩展图标选择“选项”进入选项页面。添加一条测试规则例如匹配字段“发件人”关键词“noreplygithub.com”动作“归档邮件”。点击保存。手动触发回到弹出窗口点击“立即运行整理”。这会让扩展立即处理过去24小时内来自 GitHub 的未读邮件。查看日志在chrome://extensions/页面找到你的扩展点击“服务工作者”链接或“背景页”打开开发者工具 Console查看background.js中console.log输出的执行日志。验证结果打开 Gmail检查对应的邮件是否已被归档从收件箱移走。6.3 调试技巧后台脚本日志如上所述通过扩展管理页面的“服务工作者”链接查看 Console。弹出窗口/选项页调试右键点击扩展的弹出窗口或选项页面选择“检查”即可打开针对该页面的开发者工具。网络请求在后台脚本的开发者工具中切换到“Network”标签可以看到扩展对https://www.googleapis.com/的 API 调用便于调试授权和请求问题。7. 常见问题与排查思路在开发和使用过程中你可能会遇到以下问题问题现象可能原因解决思路点击授权按钮无反应或报错1.manifest.json中的client_id配置错误。2. OAuth 同意屏幕未发布或测试用户未添加。3. 请求的 OAuth 范围未在 Cloud Console 启用。1. 检查client_id是否与 Cloud Console 中创建的完全一致。2. 确保 OAuth 同意屏幕已保存并将测试邮箱添加到“测试用户”列表。3. 在 Cloud Console 的“OAuth 同意屏幕”中确认已添加gmail.readonly和gmail.modify范围。扩展图标显示“程序包无效”manifest.json文件语法错误或关键字段缺失。检查manifest.json的 JSON 格式是否正确manifest_version是否为 3以及文件路径是否正确。后台脚本报错“Invalid scope”请求的 OAuth 范围与授权时同意的范围不匹配。确保manifest.json中oauth2.scopes数组与 Cloud Console 中启用的范围完全一致。定时任务不执行1. Service Worker 可能因不活动而被浏览器终止。2.chrome.alarms的时间计算有误。1. 这是 Manifest V3 Service Worker 的正常行为。可以监听chrome.runtime.onStartup事件检查是否有错过的闹钟。2. 调试getNext2AM()函数确保计算的时间戳正确。规则保存后不生效1. 规则未成功保存到chrome.storage。2.background.js中读取规则的逻辑有误。3. 规则匹配逻辑isRuleMatch有 bug。1. 在选项页面检查保存后的状态提示在弹出窗口右键“检查”查看 Console 有无存储错误。2. 在后台脚本 Console 中打印getStoredRules()的返回值。3. 在processSingleEmail函数中打印邮件详情和规则详情进行比对。API 请求返回 403 错误访问令牌已过期或权限不足。Chrome Identity API 会自动管理令牌刷新。如果持续失败尝试在弹出窗口重新进行交互式授权 (getAuthToken({ interactive: true }))。扩展图标不显示manifest.json中icons路径错误或图片缺失。检查icons文件夹是否存在且图片命名与manifest.json中配置一致。8. 最佳实践与进阶优化建议一个基础可用的扩展已经完成但要将其打磨得更健壮、更用户友好可以考虑以下优化8.1 安全性最小权限原则我们的permissions和host_permissions已经尽可能精确。不要申请不必要的权限。令牌安全访问令牌由 Chrome 管理并存储在加密区域相对安全。切勿将client_id或任何密钥硬编码在公开代码中本文为示例实际项目应避免将真实client_id提交到公开仓库。输入验证在选项页面对用户输入的规则关键词进行基本的清理和验证防止注入攻击虽然在本扩展上下文中风险较低。8.2 健壮性错误处理与重试Gmail API 调用可能会因网络或配额限制失败。为核心 API 调用如fetchRecentEmails,modifyLabels添加重试机制例如指数退避。日志与状态持久化将扩展的运行日志成功、失败、处理邮件数保存到chrome.storage.local中并可以在选项页面提供一个“查看日志”的选项卡方便用户排查问题。处理分页fetchRecentEmails函数目前只获取最多50封邮件。如果用户邮件量很大需要实现分页逻辑使用 API 返回的nextPageToken获取所有邮件。8.3 用户体验自定义标签管理实现“添加标签”动作的完整功能。这需要调用gmail.users.labels.createAPI 来创建不存在的标签并缓存标签 ID 以供后续使用。更复杂的规则引擎支持“且”、“或”逻辑组合例如发件人包含 A且主题包含 B。可以提供更直观的 UI 来创建复杂规则。白名单/黑名单除了关键词匹配可以增加基于发件人域名的白名单/黑名单功能。运行频率自定义允许用户在选项页面选择整理频率如每小时、每天、每周而不仅仅是凌晨2点。通知系统整理完成后使用chrome.notificationsAPI 向用户发送一个简单的桌面通知告知处理结果。8.4 性能批量操作Gmail API 支持批量操作batchModify。可以先将所有需要修改的邮件 ID 收集起来然后一次性调用messages.batchModify接口这比逐封邮件修改效率高得多。增量处理记录上次处理的时间戳下次只处理这个时间点之后的新邮件避免重复处理。限制处理量对于邮件量极大的用户可以设置单次运行的最大处理邮件数防止脚本运行时间过长被浏览器终止。8.5 发布准备制作图标准备符合 Chrome 应用商店要求的各种尺寸图标16x16, 32x32, 48x48, 128x128。编写描述与截图为应用商店准备清晰的应用描述、功能列表和高质量的截图。隐私政策如果你的扩展会处理用户数据如邮件通常需要提供隐私政策说明数据如何被使用本例中所有数据处理均在用户浏览器本地和其授权的 Gmail 账户内完成不涉及外部服务器。打包与上传在chrome://extensions/页面点击“打包扩展程序”生成.crx文件和.pem私钥文件。然后前往 Chrome 开发者信息中心 提交你的扩展。通过这个项目你不仅学会了 Chrome Manifest V3 扩展的开发流程还深入实践了 OAuth 2.0 授权、Gmail API 调用、浏览器存储、定时任务等核心技能。你可以以此为基础扩展出更多自动化功能比如自动回复特定邮件、生成邮件摘要等打造属于自己的效率工具。如果在实现过程中遇到任何问题欢迎在评论区交流讨论。
返回列表