繁体   English   中英

使用 nodemailer,gmail(gcloud 主机,如果这很重要),电子邮件不会在生产中发送。 本地主机很好但是

[英]Emails aren't sending in production, using nodemailer, gmail (gcloud host if that matters). Localhost is fine however

我在这里尝试了很多对其他人有用的解决方案,但我已经解决了几天,仍然不知所措。 出于某种原因,通过 localhost 发送电子邮件效果很好,但是当站点处于活动状态时,它就不行了。 这是我的代码:

app.post('/contact', (req, res) => {

const CLIENT_ID = process.env.C_ID;
const CLIENT_SECRET = process.env.C_SECRET;
const REDIRECT_URI = 'https://developers.google.com/oauthplayground';
const REFRESH_TOKEN = process.env.R_TOKEN;

const oAuth2Client = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);

oAuth2Client.setCredentials({ refresh_token: REFRESH_TOKEN });

async function sendMail() {

    try {
        const accessToken = await oAuth2Client.getAccessToken();

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

        const mailOptions = {
            from: req.body.email,
            to: process.env.EMAIL_USER,
            subject: `Message from ${req.body.email}`,
            text: req.body.message
        };

        const result = await transport.sendMail(mailOptions)
        return result

    } catch (error) {
        return error
    }
}

sendMail()
    .then((result) => console.log('Email sent: ', result), res.send('success'))
    .catch((error) => console.log(error.message));

});

以下是我尝试过的主要解决方案:

有任何想法吗? 感谢您的阅读。

编辑:此外,无论我做什么,我都没有收到任何错误消息。 作为序言,我对此比较陌生。

编辑*:我尝试通过谷歌云 SDK(?)上的 web 服务器发送 email,结果如下:

错误:未设置刷新令牌。 这对我来说没有太大意义。

也看到了这个,我不明白:

错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头

在 nodemailer 网站上你有这样的:“尽管 Gmail 是开始发送电子邮件的最快方法,但除非您使用 OAuth2 身份验证,否则它绝不是一个更好的解决方案。Gmail 期望用户是实际用户而不是机器人因此它会为每次登录尝试运行大量启发式算法并阻止任何看起来可疑的内容以保护用户免受帐户劫持尝试例如,如果您的服务器位于另一个地理位置,您可能会遇到麻烦 – 一切都在您的开发机器上运行,但消息生产受阻。

更多关于在此处使用 gmail 和 nodemailer: https://nodemailer.com/usage/using-gmail/

我找到了一个适合我的解决方案:您必须使用 async/await 添加 Promise。 就我而言,我搬到了 Sendgrid,我有同样的错误,我用这个片段解决了它:

import nodemailer from "nodemailer";

export default async (req, res) => {
    require('dotenv').config()
    const nodemailer = require('nodemailer')

    const transporter = nodemailer.createTransport({
      host: 'smtp.sendgrid.net',
      port: 587,
      auth: {
        user: process.env.SENDGRID_USERNAME,
        pass: process.env.SENDGRID_PASSWORD,
      },
    })

    await new Promise((resolve, reject) => {
        // verify connection configuration
        transporter.verify(function (error, success) {
            if (error) {
                console.log(error);
                reject(error);
            } else {
                console.log("Server is ready to take our messages");
                resolve(success);
            }
        });
    });

    const mailData = {
      from: process.env.SENDGRID_SENDER,
      to:  "xxxxx@gmail.com",
      subject: `Message du site par ${req.body.name}`,
      text: req.body.message + " | Envoyé par: " + req.body.email + " | Numéro de tel: " + req.body.tel,
      html: `<div>${req.body.message}</div>
      <p>Envoyé par:${req.body.email}</p>
      <p>Numéro de tel:${req.body.tel}</p>`
    }
    
    await new Promise((resolve, reject) => {
        // send mail
        transporter.sendMail(mailData, (err, info) => {
            if (err) {
                console.error(err);
                reject(err);
            } else {
                console.log(info);
                resolve(info);
            }
        });
    });

    return res.status(200).json({ status: "OK" });
  }

原来的答案在这里:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM