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

Nodemailer对接Gmail发送邮件失败(含两种实现方式)求助

Gmail SMTP 发送邮件故障求助

我一开始尝试用非OAuth2的简单方式发送邮件,多次尝试后仅偶然成功发送2-3封;查阅资料后改用OAuth2方式实现,但仍然无法正常发送邮件,甚至试过SendGrid也无效,希望能得到解决帮助。

无OAuth2实现代码(已开启IMAP、双因素认证并创建自定义密码)

export const sendEmail = (options) => {

    
    const transporter = nodemailer.createTransport({
        service: "gmail",
        port: 587,
        type: "SMTP",
        host: "smtp.gmail.com",
        secure: true,// for port 587 it should be false but this worked a few times so i let it be
        auth: {
            
            user: EMAIL_FROM,
            pass: EMAIL_PASSWORD,
        },
    });

    const mailOptions = {
        from: EMAIL_FROM,
        to: options.to,
        subject: options.subject,
        html: options.text,
    };

    transporter.sendMail(mailOptions, function (err, info) {
        if (err) {
            console.log(err);
        } else {
            console.log(info);
        }
    });
};

OAuth2实现代码

const oAuth2Client = new google.auth.OAuth2(CLIENT_ID,CLIENT_SECRET,REDIRECT_URI);
oAuth2Client.setCredentials({refresh_token:REFRESH_TOKEN});

export const sendEmail = async(options) => {

    try {
        
        const accessToken = (await oAuth2Client.getAccessToken()).token
        console.log(accessToken,REDIRECT_URI,REFRESH_TOKEN,CLIENT_ID,CLIENT_SECRET)
        const transporter = nodemailer.createTransport({
            service: "gmail",
            host: "smtp.gmail.com",
            port: 587,
            //port: 465,
    
            secure : false, // true for 465, false for other ports
            //type: "SMTP",
            //secure: true,
            auth: {
                type:"OAuth2",
                user: "my email",
                clientId: CLIENT_ID,
                accessToken,
                clientSecret: CLIENT_SECRET,
                refreshToken: REFRESH_TOKEN,
                //pass: EMAIL_PASSWORD,
            },
        });
    
        const mailOptions = {
            from: "my email",
            to: options.to,
            subject: options.subject,
            text:"Password change",
            html: options.text,
        };
    
        const result = await transporter.sendMail(mailOptions);
        return result;
        
    } catch (error) {
        return error;
    }
    
};

当前遇到的错误

Error: connect ETIMEDOUT 74.125.68.109:465
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1300:16) {
errno: -4039,
code: 'ESOCKET',
syscall: 'connect',
address: '74.125.68.109',
port: 465,
command: 'CONN'
}

内容的提问来源于stack exchange,提问作者Moeez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:25:26