Node.js 使用SMTP的Firebase函数在emulator中工作,但在部署时超时

Node.js 使用SMTP的Firebase函数在emulator中工作,但在部署时超时,node.js,firebase,google-cloud-functions,timeout,nodemailer,Node.js,Firebase,Google Cloud Functions,Timeout,Nodemailer,目前,我正在Firebase中编写一个云函数,用NodeEmailer发送电子邮件,其中包括一个二维码 如果我在Firebase emulator中模拟该项目,一切正常,邮件发送正确 然而,当我上传代码到Firebase时,函数总是在60秒后超时。我已经尝试将超时设置得更高,但它仍在发生 我的代码是: exports.emailSender = functions.https.onRequest(async (req, res) => { var { name, code, hash,

目前,我正在Firebase中编写一个云函数,用NodeEmailer发送电子邮件,其中包括一个二维码

如果我在Firebase emulator中模拟该项目,一切正常,邮件发送正确

然而,当我上传代码到Firebase时,函数总是在60秒后超时。我已经尝试将超时设置得更高,但它仍在发生

我的代码是:

exports.emailSender = functions.https.onRequest(async (req, res) => {
  var { name, code, hash, dest } = req.body;
  let transporter = nodemailer.createTransport({
    host: "smtp.test.com",
    port: 25,
    auth: {
      user: "username", 
      pass: "password",
    },
  });

  try {
    let qr = await create_qrcode(code+":"+hash,250,50);
    let qrBig = await create_qrcode(code+":"+hash,500,100);

    const mailOptions = {
      from: "no-reply@test.de",
      to: dest,
      subject: "Email Sent via Firebase",
      html: `<img src="${qr}" />`,
      attachments: [
        {
          filename: "QR-Code",
          path: qrBig,
        },
      ],
    };

    await transporter.sendMail(mailOptions, (err, info) => {
      if (err) {
        console.log(err);
        res.send({ error: err.message });
      } else {
        console.log(info);
        res.send("Erfolgreich");
      }
    });
  } catch (error) {
    res.send({ error: error.message });
  }
});
似乎函数在sendMail处冻结,因此不触发res.send,并且在60秒后达到超时


你知道为什么这是在模拟器上工作而不是在真正的云函数上吗?

作为一种抵制滥用的方法,GCP用于计算引擎,几乎可以肯定的是,同样的事情也发生在云函数上


您必须尝试另一种不使用出站端口25的方法。例如,您可以在邮件服务器上使用SMTP提交端口587而不是端口25来提交出站电子邮件。这将起作用,因为SMTP的587和465端口没有被GCP阻塞。

作为一种抵制滥用的方法,GCP用于计算引擎,几乎可以肯定,同样的事情也发生在云功能上


您必须尝试另一种不使用出站端口25的方法。例如,您可以在邮件服务器上使用SMTP提交端口587而不是端口25来提交出站电子邮件。这将起作用,因为GCP不会阻止SMTP的587和465端口。

我很确定,GCP会阻止来自云功能的出站端口25,您需要使用不同的方法。THX!!这就是问题所在。整晚都快把我逼疯了。587正常工作很高兴听到这个消息,我已经将其更新为一个正式的答案。我非常确定,GCP将阻止出站端口25与云功能,您需要使用不同的方法。THX!!这就是问题所在。整晚都快把我逼疯了。我很高兴听到587,我已经把它更新成一个正式的答案。
async function create_qrcode(dataForQRcode, width, cwidth {
  // grab data you want on qrcode here
  const cvs = createCanvas(1, 1);
  const url = await QRCode.toCanvas(cvs, dataForQRcode, {
    errorCorrectionLevel: "H", // LMQH
    margin: 1,
    color: {
      dark: "#000000", // black pixels
      light: "#ffffff", // white background
    },
  });
  const canvas = createCanvas(width, width);
  const ctx = canvas.getContext("2d");
  const img = await loadImage("./icon.png");
  ctx.drawImage(url, 0, 0, width, width);
  const center = (width - cwidth) / 2;
  ctx.drawImage(img, center, center, cwidth, cwidth);
  return canvas.toDataURL("image/png");
};