Node.js 使用SMTP的Firebase函数在emulator中工作,但在部署时超时
目前,我正在Firebase中编写一个云函数,用NodeEmailer发送电子邮件,其中包括一个二维码 如果我在Firebase emulator中模拟该项目,一切正常,邮件发送正确 然而,当我上传代码到Firebase时,函数总是在60秒后超时。我已经尝试将超时设置得更高,但它仍在发生 我的代码是: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,
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");
};