【问题标题】:How to Resolve Error Sending Email Using nodemailer googleapi?如何解决使用 nodemailer googleapi 发送电子邮件的错误?
【发布时间】:2022-06-14 03:12:12
【问题描述】:

上周我最初发布了这篇文章,寻求使用 nodemailer 和 googleapi 的帮助。我正在尝试使用nodemailergoogleapis 发送电子邮件。我已经在https://console.cloud.google.com/ 中设置了我的项目,并在 .env 中设置了我的 CLIENT_ID、CLIENT_SECRET、CLIENT_REDIRECT_URI 和 REFRESH_TOKEN,并确认正在填充这些值。在调试模式下,我在发送错误时注意到以下错误堆栈:

     'Error: invalid_grant\n    at Gaxios._request (/Users/ENV/Tutoring-Invoice-Management-System/node_modules/gaxios/build/src/gaxios.js:130:23)\n    at processTicksAndRejections 
(node:internal/process/task_queues:96:5)\n    
at async OAuth2Client.refreshTokenNoCache (/Users/ENV/Tutoring-Invoice-Management-System/node_modules/google-auth-library/build/src/auth/oauth2client.js:174:21)\n    
at async OAuth2Client.refreshAccessTokenAsync (/Users/ENV/Tutoring-Invoice-Management-System/node_modules/google-auth-library/build/src/auth/oauth2client.js:198:19)\n    
at async OAuth2Client.getAccessTokenAsync (/Users/ENV/Tutoring-Invoice-Management-System/node_modules/google-auth-library/build/src/auth/oauth2client.js:227:23)\n    
at async sendMail (/Users/ENV/Tutoring-Invoice-Management-System/service/send-email.js:17:29)'

代码如下。我已经根据问题的答案对其进行了编辑。我现在的问题是,为什么我会收到 invalid_grant 错误?根据正式文档,我在https://console.cloud.google.com/apis/credentials/oauthclient 中正确设置了所有内容。但也许那里有问题?

const nodemailer = require('nodemailer');
const { google } = require('googleapis');
require('dotenv').config();

console.log("CLIENT_ID: " + process.env.CLIENT_ID);
console.log("CLIENT_SECRET: " + process.env.CLIENT_SECRET);
console.log("CLIENT_REDIRECT_URI: " + process.env.REDIRECT_URI);
console.log("REFRESH_TOKEN: " + process.env.REFRESH_TOKEN);

const oAuth2Client = new google.auth.OAuth2(process.env.CLIENT_ID, process.env.CLIENT_SECRET, process.env.REDIRECT_URI);
console.log("oAuth2Client: " + oAuth2Client);

oAuth2Client.setCredentials({refresh_token: process.env.REFRESH_TOKEN})

async function sendMail() {
    try {
        const accessToken = await oAuth2Client.getAccessToken()
    
        const transport = nodemailer.createTransport({
          host: "smtp.gmail.com",
          port: 465,
          secure: true,
          auth: {
            type: 'OAuth2'
          }
        });
    
        const mailOptions = {
          from: 'envolonakis@gmail.com',
          to: 'envolonakis@gmail.com',
          subject: "Test Email API Subject",
          text: "Test Email API Text",
          html: "<h1> Test Email API HTML </h1>",
          auth: {
            user: process.env.OWNER_EMAIL,
            accessToken: accessToken.token
          }
        }
    
        const result = await transport.sendMail(mailOptions);
        return result;
      } catch (error) {
        console.log(error.stack);  
        return error;
      }
}

    
sendMail()

【问题讨论】:

    标签: node.js google-api nodemailer


    【解决方案1】:

    来自official documentation,这是你需要使用的:

      try {
    
        const accessToken = await oAuth2Client.getAccessToken()
    
        const transport = nodemailer.createTransport({
          host: "smtp.gmail.com",
          port: 465,
          secure: true,
          auth: {
            type: 'OAuth2'
          }
        });
    
        const mailOptions = {
          from: process.env.OWNER_EMAIL,
          to: process.env.RECIPIENT,
          subject: "Test Email API Subject",
          text: "Test Email API Text",
          html: "<h1> Test Email API HTML </h1>",
          auth: {
            user: process.env.OWNER_EMAIL,
            accessToken: accessToken.token
          }
        }
    
        const result = await transport.sendMail(mailOptions);
        return result;
      } catch (error) {
        return error;
      }
    

    您在使用 google api 身份验证库时遇到的一个错误是令牌。您将完整的令牌对象传递给 nodemailer 的身份验证配置,而不仅仅是访问令牌字符串。另外要记住的是,在 nodemailer 的 auth 配置中添加或删除参数会导致不同的错误。

    【讨论】:

    • 我试过这个,但我仍然得到一个错误,也就是说,我已经调试并看到以下错误:代码 400 'Error: invalid_grant\n at Gaxios._request'。我将在帖子中添加更多关于此的详细信息,但知道如何针对此错误正确设置吗?
    猜你喜欢
    • 2019-03-29
    • 2015-05-19
    • 1970-01-01
    • 2021-12-28
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多