为什么我收到错误:在使用nodemailer和googleapis设置3LO身份验证时缺少"PLAIN"凭据?



我正在使用nodemailer和googleapi从我的Next.js API路由发送电子邮件,但我收到以下错误:错误:缺少"的凭据;PLAIN";

我按照本教程进行了设置:https://blog.devgenius.io/correct-way-in-setting-up-nodemailer-for-email-service-946f6bfd73e8

我还查看了nodemailer文档,以确保一切都是最新的。3LO身份验证设置的Nodemailer文档示例:https://nodemailer.com/smtp/oauth2/#example-3

这是我的代码:

const handleSendVerificationEmail = async (req: NextApiRequest, res: NextApiResponse) => {
const { body } = req
const { email }: { email: string } = body
const user = process.env.GOOGLE_EMAIL_ADDRESS
const clientId = process.env.GOOGLE_CLIENT_ID_MAIL
const clientSecret = process.env.GOOGLE_CLIENT_SECRET_MAIL
const refreshToken = process.env.GOOGLE_REFRESH_TOKEN
const redirectURI = process.env.GOOGLE_REDIRECT_URI
const oAuth2Client = new google.auth.OAuth2(clientId, clientSecret, redirectURI)
oAuth2Client.setCredentials({ refresh_token: refreshToken })
try {
const accessToken = await oAuth2Client.getAccessToken()
const transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
type: '0Auth2',
user,
clientId,
clientSecret,
refreshToken,
accessToken
},
tls: {
rejectUnauthorized: false
}
})
const mailOptions = {
from: `YourTable <${user}>`,
to: email,
subject: 'Hello from gmail using API',
text: 'Hello from gmail email using API',
html: '<h1>Hello from gmail email using API</h1>'
}
const result = await transporter.sendMail(mailOptions)
res.status(200).json({ email })
} catch (error) {
console.log(error)
res.status(500).json({ error: 'Unable to send verification email' })
}
}
export default handleSendVerificationEmail

我还按照我发现的一些教程中的建议,将tls属性添加到了transport中,尽管它并没有解决问题。

我还尝试跳过主机、端口和安全属性,并用服务替换它们。同样,这也没什么区别。

正如评论中所建议的那样,我遵循了说明,并相应地将我的代码更改为:

const user = process.env.GOOGLE_EMAIL
const pass = process.env.GOOGLE_APP_PASSWORD
const transporter = nodemailer.createTransport({
port: 465,
host: "smtp.gmail.com",
auth: {
user: user,
pass: pass
},
secure: true
})
const mailOptions = {
from: `YourTable <${user}>`,
to: email,
subject: 'Hello from gmail using API',
text: 'Hello from gmail email using API',
html: '<h1>Hello from gmail email using API</h1>'
}
const result = await transporter.sendMail(mailOptions)

但同样的错误再次出现:

Error: Missing credentials for "PLAIN"
at SMTPConnection._formatError (H:DokumenteProgramming_Projectsyourtablenode_modulesnodemailerlibsmtp-connectionindex.js:790:19)
at SMTPConnection.login (H:DokumenteProgramming_Projectsyourtablenode_modulesnodemailerlibsmtp-connectionindex.js:444:38)
at H:DokumenteProgramming_Projectsyourtablenode_modulesnodemailerlibsmtp-transportindex.js:272:32
at SMTPConnection.<anonymous> (H:DokumenteProgramming_Projectsyourtablenode_modulesnodemailerlibsmtp-connectionindex.js:213:17)
at Object.onceWrapper (node:events:641:28)
at SMTPConnection.emit (node:events:527:28)
at SMTPConnection.emit (node:domain:475:12)
at SMTPConnection._actionEHLO (H:DokumenteProgramming_Projectsyourtablenode_modulesnodemailerlibsmtp-connectionindex.js:1325:14)
at SMTPConnection._processResponse (H:DokumenteProgramming_Projectsyourtablenode_modulesnodemailerlibsmtp-connectionindex.js:953:20)
at SMTPConnection._onData (H:DokumenteProgramming_Projectsyourtablenode_modulesnodemailerlibsmtp-connectionindex.js:755:14) {
code: 'EAUTH',
command: 'API'
}

我遇到了同样的问题,以下是我如何解决的。因为我使用Gmail,我必须启用2因素身份验证,然后添加Nodemailer应用程序密码应用程序密码设置,然后使用生成的密码作为身份验证的密码

const transporter = nodemailer.createTransport({
port: 465,
host: "smtp.gmail.com",
auth: {
user: GMAIL_FROM,
pass: PASSWORD, // generated from the App Passwords
},
secure: true,
})

我把transporter改成了这个,它终于起作用了:

const transporter = nodemailer.createTransport({
Service: 'gmail',
auth: {
user: user,
pass: pass
},
port: 465,
host: "smtp.gmail.com"
})

然而,我仍然没有找到一个通过Google API使其与0Auth 2.0协同工作的解决方案。

相关内容

最新更新