Ошибка при отправке электронной почты с использованием облачных функций Firebase с Vue Js - PullRequest
0 голосов
/ 01 апреля 2020

Я пытался отправить электронное письмо с помощью облачной функции Firebase из отправленных данных, а он вообще не отправлял.

Мой код функции

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const nodemailer = require('nodemailer');
const cors = require('cors')({
  origin: '*'
})

admin.initializeApp();

/**
 * Here we're using Gmail to send 
 */
let transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: 'youremail@gmail.com',
    pass: 'password'
  }
});

exports.sendEmail = functions.https.onCall((contact, context) => {
  cors(req, res, () => {
    const dest = req.body.dest

    console.log(dest)

    const mailOptions = {
      from: `Contact AET  ${contact.email}`,
      to: dest,
      subject: "AET Website Message ????", // Subject line
      html: `
        <div 
            style="padding: 10px; font-family:Gadaj; border: 2px solid #eee; border-radius: 10px ">
          <p style="font-size: 15px">You have a new message request</p>
            <h2>Contact Details</h2>
            <ul style="list-style-type: none">
               <li>Name: ${contact.name}</li>
               <li>Email: ${contact.email}</li>
            </ul>
            <h2>Message</h2>
            <p style="font-size: 16px;">${contact.message}</p>
            <img src="https://images.prod.meredith.com/product/fc8754735c8a9b4aebb786278e7265a5/1538025388228/l/rick-and-morty-pickle-rick-sticker" />
        </div>
   `
    };

    return transporter.sendMail(mailOptions, (err, info) => {
      if (err) {
        return console.log(err)
      }
      return console.log(`Message sent to ${info.messageId}`)
    })
  })

})

, а затем я подключился Это в моем FrontEnd. Вот так

sendMessage() {
      if (this.$refs.formEmail.validate()) {
        this.loading = true;
        const createMessage = {
          name: this.name,
          email: this.email,
          message: this.message
        };
        const sendEmail = functions.httpsCallable("sendEmail");
        sendEmail(createMessage)
          .then(res => {
            // eslint-disable-next-line no-console
            console.log(res.data);
          })
          .catch(err => {
            // eslint-disable-next-line no-console
            console.log(err);
          });
      }
    }

Я получаю это обратно как полный Это

 Error: Error: INTERNAL
    at new HttpsErrorImpl (index.cjs.js?001a:58)
    at _errorForResponse (index.cjs.js?001a:153)
    at Service.eval (index.cjs.js?001a:538)
    at step (tslib.es6.js?9ab4:99)
    at Object.eval [as next] (tslib.es6.js?9ab4:80)
    at fulfilled (tslib.es6.js?9ab4:70)

Пожалуйста, как мне это исправить, или, пожалуйста, предоставьте любое возможное решение как можно быстрее. насколько это возможно. Заранее спасибо

1 Ответ

1 голос
/ 01 апреля 2020

Невозможно выполнить следующее:

exports.sendEmail = functions.https.onCall((contact, context) => {
  cors(req, res, () => {...});
});

Вы смешиваете Функции вызываемого облака и HTTPS (которые принимают Node.js express req и res в качестве параметров). req и res не будут иметь никакого значения, и поэтому dest будет нулевым.

Я бы любезно предложил вам изучить документацию по функциям Callable Cloud.

Следующие действия должны помочь (не проверено):

exports.sendEmail = functions.https.onCall(async (data, context) => {

    try {

        const dest = data.email

        console.log(dest)

        const mailOptions = {
            from: `Contact AET  ${contact.email}`,
            to: dest,
            subject: "AET Website Message ????", // Subject line
            html: `
        <div 
            style="padding: 10px; font-family:Gadaj; border: 2px solid #eee; border-radius: 10px ">
          <p style="font-size: 15px">You have a new message request</p>
            <h2>Contact Details</h2>
            <ul style="list-style-type: none">
               <li>Name: ${contact.name}</li>
               <li>Email: ${contact.email}</li>
            </ul>
            <h2>Message</h2>
            <p style="font-size: 16px;">${contact.message}</p>
            <img src="https://images.prod.meredith.com/product/fc8754735c8a9b4aebb786278e7265a5/1538025388228/l/rick-and-morty-pickle-rick-sticker" />
        </div>
   `
        };

        await transporter.sendMail(mailOptions);

        return null;

    } catch (error) {

       // See the doc: https://firebase.google.com/docs/functions/callable#handle_errors

    }

})

Обратите внимание, что мы делаем const dest = data.email, поскольку в объекте createMessage, который вы используете для вызова CF, нет элемента dest.


Вы также можете изучить этот образец: https://github.com/firebase/functions-samples/blob/master/quickstarts/email-users/functions/index.js

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