React + NodeJS - нодейлер облачных функций Google - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь создать приложение activJS и хотел бы, чтобы люди заполнили форму, чтобы отправить несколько писем.

для этого я сначала создал функцию 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 голосов
/ 19 октября 2019

Вместо использования версии обратного вызова метода 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 не использует Обещания внутри, но для удобства оборачивает возврат в Обещание. Если обратный вызов не определен для sendMail, тогда метод возвращает собственный объект Promise вместо

0 голосов
/ 19 октября 2019

Я предполагаю, что вы пытаетесь войти с логином / паролем, но вы создаете свой транспорт с настройками oauth2, более того, вы должны удалить ключ из опций, так как gmail переопределит его с вашей электронной почтой (я не знаю, еслиэто создает ошибку, хотя)Я также заметил, что вы используете текстовый ключ для своих параметров почты, но отправляете 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...