我有一个问题。我需要使用 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,
},
})
有什么解决办法吗?谢谢。
当您尝试传递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,
},
})
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>'.
这对我有用:
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);
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 || '',
},
})
希望有帮助