我正在尝试制作reactJS应用,并希望人们最终填写表格后发送一些电子邮件。
为此,我首先创建了一个sendGrid函数,但我不太喜欢延迟和电子邮件模板(以及每天超过100封邮件的事实。
然后,我读到可以使用Nodemailer +(或不带Express)+ firebase和google cloud功能。我写了这个函数:
exports.mailSun = functions.https.onRequest((req, res) => {
const { name, dest } = req.query;
var transporter = nodemailer.createTransport({
service: 'Gmail',
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
user: 'xxx@gmail.com',
pass: 'xxx'
}
});
const mailOptions = {
from: 'hello@sunny.com', // sender address
to: 'pedrospecter@gmail.com', // list of receivers
subject: 'Elavtal', // Subject line
html: '<p>Grattis för ditt nya avtal. Elbolag kommer att kontakta dig inom kort.</p>'// plain text body
};
return transporter.sendMail(mailOptions, function (err, info) {
if(err)
console.log(err)
else
console.log(info);
});
});
然后我尝试了
exports.sendMail= functions.https.onRequest((req, res) => {
cors(req, res, () => {
// getting dest email by query string
const { name, dest } = req.query;
var transporter = nodemailer.createTransport({
service: 'Gmail',
host: "smtp.gmail.com",
port: 465,
secure: true,
auth: {
user: 'xxx@gmail.com',
pass: 'xxx'
}
});
const mailOptions = {
from: 'Sunny <xxxb@gmail.com>', // Something like: Jane Doe <janedoe@gmail.com>
to: 'xxx@mail.com',
subject: 'nytt Avtal', // email subject
text: `<p Ni har fått ett nytt avtal. Logga in på Sunny för att se kunddetaljer.</p> ` // email content in HTML
};
// returning result
return transporter.sendMail(mailOptions, (erro, info) => {
if(erro){
return res.send(erro.toString());
}
return res.send('Sent');
});
});
});
有人可以帮我解决什么问题吗?
答案 0 :(得分:0)
我猜您正在尝试使用登录名/密码登录,但是您正在使用oauth2设置创建传输方式,此外,您还应该删除选项中的from键,因为gmail将覆盖您的电子邮件(我不知道是否它会产生错误(tho)。 我还注意到,您将文本键用于邮件选项,但是在有可用的html键的情况下发送html(可能会导致某些问题)。
const gmailEmail = functions.config().gmail.email;
const gmailPassword = functions.config().gmail.password;
// create transport
const mailTransport = nodemailer.createTransport({
service: "gmail",
auth: {
user: gmailEmail,
pass: gmailPassword
}
});
exports.sendMail= functions.https.onRequest((req, res) => {
cors(req, res, () => {
const mailOptions = {
to: 'xxx@mail.com',
subject: 'nytt Avtal', // email subject
text: `<p Ni har fått ett nytt avtal. Logga in på Sunny för att se kunddetaljer.</p> ` // email content in HTML
};
// returning result
return transporter.sendMail(mailOptions, (erro, info) => {
if(erro){
return res.send(erro.toString());
}
return res.send('Sent');
});
});
});
还有一些与您的Google帐户有关的配置
接受安全性较低的应用google security
关闭capatcha unlock captcha
您可以测试您的功能,并在Google云功能控制台gcp / functions中查看错误,这有助于我调试相同的问题。
答案 1 :(得分:0)
代替使用sendMail()
方法的回调版本,而使用Promise版本,如下所示:
exports.mailSun = functions.https.onRequest((req, res) => {
const { name, dest } = req.query;
var transporter = nodemailer.createTransport({
service: 'Gmail',
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
user: 'xxx@gmail.com',
pass: 'xxx'
}
});
const mailOptions = {
from: 'hello@sunny.com', // sender address
to: 'pedrospecter@gmail.com', // list of receivers
subject: 'Elavtal', // Subject line
html: '<p>Grattis för ditt nya avtal. Elbolag kommer att kontakta dig inom kort.</p>'// plain text body
};
return transporter.sendMail(mailOptions)
.then(info => {
res.send("email sent");
})
.catch(err => {
console.log(err);
res.status(500).send("Error sending mail")
})
});
请参见doc
如果未设置回调参数,则该方法返回Promise 宾语。 Nodemailer本身不在内部使用Promises,但它在内部使用 为了方便起见,将退货包装到Promise中。 如果未为sendMail定义回调,则该方法将返回本地Promise对象