如何用Gmail API与OAuth访问次级邮箱获取邮件主题?解决相关报错
问题描述
我对Google Apps Script和OAuth流程不太熟悉,正在编写脚本以通过Gmail API读取次级邮箱的邮件主题或完整内容。已完成OAuth配置,调试后生成了授权URL,但后续报错提示脚本缺少doGet函数,查阅同类案例时未提及该函数,不确定当前方向是否正确。
修改脚本中的一个术语后,成功生成授权URL,使用目标次级账号访问该URL解决了URI重定向不匹配错误,但点击“允许”后出现Script Function not found: doGet报错。授权完成后又提示“脚本已完成但未返回任何内容”,预期应返回最新邮件的主题信息(编辑于2023年7月19日)。
当前代码如下:
function authorize() { var oauth2 = OAuth2.createService('Gmail') .setClientId(CLIENT_ID) .setClientSecret(CLIENT_SECRET) .setRedirectUri(REDIRECT_URI) .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth') .setTokenUrl('https://accounts.google.com/o/oauth2/token') .setScope(SCOPES.join(' ')) .setParam('access_type', 'offline') .setParam('approval_prompt', 'force') .setCallbackFunction('authCallback'); var authorizationUrl = oauth2.getAuthorizationUrl(); } function authCallback(request) { var oauth2 = OAuth2.createService('Gmail') .setClientId(CLIENT_ID) .setClientSecret(CLIENT_SECRET) .setRedirectUri(REDIRECT_URI) .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth') .setTokenUrl('https://accounts.google.com/o/oauth2/token') .setScope(SCOPES.join(' ')) .setParam('access_type', 'offline') .setParam('approval_prompt', 'force'); var authorized = oauth2.handleCallback(request); if (authorized) { var accessToken = oauth2.getAccessToken(); var threads = Gmail.Users.Threads.list('secondaryemailaccount.com', { accessToken: accessToken }); } else { Logger.log('Authorization denied.'); } }
解决方案
1. 补充doGet函数解决缺失报错
Google Apps Script的Web应用依赖doGet函数处理所有GET请求,包括OAuth授权后的回调请求。添加该函数并整合授权流程:
function doGet(e) { // 处理授权回调请求 if (e && e.parameter.code) { return authCallback(e); } else { // 首次访问时生成授权链接并返回引导页面 var authUrl = authorize(); return HtmlService.createHtmlOutput('<a href="' + authUrl + '">点击授权以访问次级邮箱</a>'); } }
同时修改authorize函数,让它返回授权URL供doGet使用:
function authorize() { var oauth2 = OAuth2.createService('Gmail') .setClientId(CLIENT_ID) .setClientSecret(CLIENT_SECRET) .setRedirectUri(REDIRECT_URI) .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth') .setTokenUrl('https://accounts.google.com/o/oauth2/token') .setScope(SCOPES.join(' ')) .setParam('access_type', 'offline') .setParam('approval_prompt', 'force') .setCallbackFunction('authCallback'); return oauth2.getAuthorizationUrl(); }
2. 修复授权后无内容返回的问题
修改authCallback函数,在授权成功后获取邮件主题并返回可视化结果:
function authCallback(request) { var oauth2 = OAuth2.createService('Gmail') .setClientId(CLIENT_ID) .setClientSecret(CLIENT_SECRET) .setRedirectUri(REDIRECT_URI) .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth') .setTokenUrl('https://accounts.google.com/o/oauth2/token') .setScope(SCOPES.join(' ')) .setParam('access_type', 'offline') .setParam('approval_prompt', 'force'); var authorized = oauth2.handleCallback(request); if (authorized) { var accessToken = oauth2.getAccessToken(); // 替换为你的次级邮箱完整地址,获取收件箱最新10条邮件线程 var threads = Gmail.Users.Threads.list('secondaryemailaccount@yourdomain.com', { accessToken: accessToken, maxResults: 10, labelIds: 'INBOX' }); if (threads.threads && threads.threads.length > 0) { var subjectList = []; // 遍历线程提取邮件主题 threads.threads.forEach(thread => { var threadDetails = Gmail.Users.Threads.get('secondaryemailaccount@yourdomain.com', thread.id, {accessToken: accessToken}); var subject = threadDetails.messages[0].payload.headers.find(h => h.name === 'Subject').value; subjectList.push(subject); }); // 返回包含主题列表的HTML页面 return HtmlService.createHtmlOutput(` <h3>最新邮件主题</h3> <ul>${subjectList.map(s => `<li>${s}</li>`).join('')}</ul> `); } else { return HtmlService.createHtmlOutput('<p>未找到任何邮件</p>'); } } else { return HtmlService.createHtmlOutput('<p>授权被拒绝</p>'); } }
3. 关键注意事项
- 确保
REDIRECT_URI与Google Cloud Console中OAuth客户端配置的重定向URI一致,且为你部署Web应用后的完整URL。 SCOPES需包含https://www.googleapis.com/auth/gmail.readonly(只读权限)或更高权限,根据需求调整。- 部署Web应用时,访问权限选择“任何人,甚至匿名”(或按需调整),部署类型选择“Web应用”。
内容的提问来源于stack exchange,提问作者Matthew Kapfer
相关产品推荐
相关产品推荐

