You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:35:00