Как я могу использовать nodemailer с облачными функциями для Firebase?

Я пытаюсь использовать nodemailer в Облачные функции для Firebase, но продолжают появляться ошибки, связанные с тем, что сервер smpt не может быть достигнут или найден. Я пробовал Gmail, Outlook и обычный размещенный сервис smpt. Он хорошо работает с моим локальным сервером узлов.

Это зарегистрированная ошибка, которую я получаю при неудачной попытке отправить электронное письмо:

{
  Error: getaddrinfoENOTFOUNDsmtp-mail.outlook.comsmtp-mail.outlook.com: 587aterrnoException(dns.js: 28: 10)atGetAddrInfoReqWrap.onlookup[
    asoncomplete
  ](dns.js: 76: 26)code: 'ECONNECTION',
  errno: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'smtp-mail.outlook.com',
  host: 'smtp-mail.outlook.com',
  port: '587',
  command: 'CONN'
}

person Tim    schedule 09.04.2017    source источник
comment
Этот тег не существует. См. stackoverflow.com/questions/42854865/   -  person Frank van Puffelen    schedule 09.04.2017
comment
Является ли проект, в котором вы выполняете эту функцию, платным? Проекты с тарифным планом Free / Spark не могут обращаться к внешним службам (для предотвращения возможных злоупотреблений).   -  person Frank van Puffelen    schedule 09.04.2017
comment
@FrankvanPuffelen Это бесплатно / Spark, так что, вероятно, проблема в этом. К сожалению, это не работало с Gmail.   -  person Tim    schedule 10.04.2017


Ответы (1)


Я создал облачную функцию (событие http) для отправки писем из раздела контактной формы моего сайта следующим образом:

const functions = require('firebase-functions');
const nodemailer = require('nodemailer');
const rp = require('request-promise');

//google account credentials used to send email
const mailTransport = nodemailer.createTransport(
    `smtps://[email protected]:[email protected]`);

exports.sendEmailCF = functions.https.onRequest((req, res) => {

  //recaptcha validation
  rp({
        uri: 'https://recaptcha.google.com/recaptcha/api/siteverify',
        method: 'POST',
        formData: {
            secret: 'your_secret_key',
            response: req.body['g-recaptcha-response']
        },
        json: true
    }).then(result => {
        if (result.success) {
            sendEmail('[email protected]', req.body).then(()=> { 
              res.status(200).send(true);
            });
        }
        else {
            res.status(500).send("Recaptcha failed.")
        }
    }).catch(reason => {
        res.status(500).send("Recaptcha req failed.")
    })

});

// Send email function
function sendEmail(email, body) {
  const mailOptions = {
    from: `<[email protected]>`,
    to: email
  };
  // hmtl message constructions
  mailOptions.subject = 'contact form message';
  mailOptions.html = `<p><b>Name: </b>${body.rsName}</p>
                      <p><b>Email: </b>${body.rsEmail}</p>
                      <p><b>Subject: </b>${body.rsSubject}</p>
                      <p><b>Message: </b>${body.rsMessage}</p>`;
  return mailTransport.sendMail(mailOptions);
}
person Carlos Casallas    schedule 16.09.2017
comment
Вы это тестировали? Я делаю что-то подобное и это не работает - person Ronye Vernaes; 03.05.2019
comment
Да, получилось. См. Более подробный ответ здесь: stackoverflow.com/questions/44833384/ - person Carlos Casallas; 06.05.2019