React + NodeJS-nodemailer谷歌云功能

时间:2019-10-19 08:07:56

标签: node.js reactjs firebase google-cloud-functions nodemailer

我正在尝试制作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');
      });
  });    
});

有人可以帮我解决什么问题吗?

2 个答案:

答案 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云功能控制台gcp / functions中查看错误,这有助于我调试相同的问题。 enter image description here

答案 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对象