TS - NodeMailer OAuth2“auth”在“TransportOptions”类型中不存在

问题描述 投票:0回答:4

我有一个问题。我需要使用 Gmail api 来实现电子邮件发送功能。在文档中,它告诉我创建一个像这样的

createTransport
函数:

    const transport = nodemailer.createTransport({
      service: "gmail",
      auth: {
        type: "OAuth2",
        user: "[email protected]",
        clientId: CLIENT_ID,
        clientSecret: CLIENT_SECRET,
        refreshToken: REFRESH_TOKEN,
        accessToken: accessToken,
      },
    })

DOCS

但是全部变成红色并返回: Error

有什么解决办法吗?谢谢。

node.js typescript nodemailer
4个回答
2
投票

当您尝试传递accessToken时存在类型脚本问题,因为在google oauth2client中

getAccessToken()
的返回类型是https://github.com/googleapis/google-auth-library-nodejs/blob/b0ddb7512fb9ed1e51b6874b7376d7e1f26be644/ src/auth/oauth2client.ts#L331

应该是字符串的 Nodemailer 类型不支持: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/7827d853a1d623dd5345d9a11ced3e15eb5d3d8b/types/nodemailer/lib/xoauth2.d.ts#L24

通过查看 getAccessToken 的返回类型,您可以看到令牌位于字符串类型的内部,因此要修复该问题,只需从 accessToken 中解构您的令牌即可。

const transport = nodemailer.createTransport({
  service: "gmail",
  auth: {
    type: "OAuth2",
    user: "[email protected]",
    clientId: CLIENT_ID,
    clientSecret: CLIENT_SECRET,
    refreshToken: REFRESH_TOKEN,
    accessToken: accessToken.token,
  },
})

0
投票

1/

const transport = nodemailer.createTransport({
  service: String("gmail") || "",
  auth: {
    type: String("OAuth2"),
    user: String(SENDER_MAIL),
    clientId: String(CLIENT_ID),
    clientSecret: String(CLIENT_SECRET),
    refreshToken: String(REFRESH_TOKEN),
    access_token: String(access_token),
  },
});
and the ERRO WITH MSG :
    [ERROR] 14:02:23 ⨯ Unable to compile TypeScript:
    server/config/sendmail.ts(25,7): error TS2769: No overload matches this call.
      The last overload gave the following error.
    Argument of type '{ service: string; auth: { type: string; user: string; clientId:string; clientSecret:string; refreshToken:string; access_token:GetAccessTokenResponse; }; }' is not assignable to parameter of type 'TransportOptions | Transport<unknown>'.
    Object literal may only specify known properties, and 'service' does not exist in type 'TransportOptions | Transport<unknown>'.

0
投票

这对我有用:

import { createTransport, TransportOptions } from 'nodemailer';

...

const transporter = createTransport({
        service:'gmail',
        auth: {
            type: "OAuth2",
            user: process.env.NODEMAILER_EMAIL,
            clientId: process.env.NODEMAILER_CLIENT_ID,
            clientSecret: process.env.NODEMAILER_CLIENT_SECRET,
            refreshToken: process.env.NODEMAILER_REFRESH_TOKEN,
            accessToken: accessToken
        }
    } as TransportOptions);

-1
投票

nodemailer.createTransport中需要的accessToken可以为空

因此,为了避免错误,您必须通过提供空字符串或类似的内容来覆盖 accessToken 为 null 的情况,以避免 null 错误

const transport = nodemailer.createTransport({
            service: 'gmail',
            auth: {
                type: 'OAuth2',
                user: process.env.EMAIL_ADDRESS,
                clientId: process.env.CLIENT_ID,
                clientSecret: process.env.CLIENT_SECRET,
                refreshToken: process.env.REFRESH_TOKEN,
                accessToken: accessToken.token || '',
            },
        })

希望有帮助

© www.soinside.com 2019 - 2024. All rights reserved.