Отправьте электронное письмо с помощью облачных функций Firebase в React Native

# #firebase #react-native #google-cloud-functions

Вопрос:

Я хотел бы отправлять электронные письма в своем родном языке React, используя облачные функции Firebase. Пользователи должны иметь возможность отправлять электронное письмо для сообщений о проблемах/отзывах в приложении. Я создал ввод текста и кнопку в своем приложении react native. Пользователь должен иметь возможность указать свою проблему/отзыв в поле ввода текста, и когда он нажмет кнопку, я получу его ответ в виде электронного письма в своей учетной записи gmail или hotmail. Могу ли я добиться этого с помощью onCreate в облачных функциях Firebase? Если да, то как я могу этого достичь? Как будет выглядеть метод onCreate, а также функция кнопки в react native? Я очень новичок в облачных функциях react native и firebase. К сожалению, я не видел никаких ссылок на эту тему.

Спасибо.

Пожалуйста, смотрите ниже:

 const nodemailer = require('nodemailer');
const email = functions.config().email_credentials.email;
const password = functions.config().email_credentials.password;
const mailTransport = nodemailer.createTransport(`smtps://${email}:${password}@smtp.gmail.com`);

functions.database.ref('/feedbacks/{currentId}').onCreate((snapshot, context) => {
      const feedback = snapshot.val().feedback;
      const name = snapshot.val().name;
      
      const mailOptions = {
        from: snapshot.val().email,
        replyTo: snapshot.val().email,
        to: functions.config().email_credentials.email,
        subject: `Feedback from ` name,
        html: feedback,
      };
      
          try {
               mailTransport.sendMail(mailOptions);
          } catch(error) {
              console.log(error);
          }
      
      return null;
      
  });
 

База данных в реальном времени:

введите описание изображения здесь

Ответ №1:

Ваша облачная функция может выглядеть следующим образом:

 import * as functions from "firebase-functions";
import admin from "firebase-admin";
import nodemailer from "nodemailer";
const { email, password } = functions.config().gmail;
const mailTransport = nodemailer.createTransport(
  `smtps://${email}:${password}@smtp.gmail.com`
);

export default functions.database
  .ref("/feedbacks/{uid}")
  .onCreate(async (eventSnapshot, context) => {
    const data = eventSnapshot.val();
    const { feedback } = data;

      const mailOptions = {
        from: functions.config().email_credentials.email,
        replyTo: functions.config().email_credentials.email,
        to: snapshot.val().email,
        subject: `Feedback from ` name,
        html: feedback,
      };

    await mailTransport.sendMail(mailOptions);
    return null;
  });
 

Убедитесь, что вы сохранили свои учетные данные электронной почты в настройках облачной функции firebase, а НЕ в коде. Если вы поместите его в любом месте кода, он потенциально может быть прочитан кем-то через некоторое время. Это очень важно.

В вашем Gmail убедитесь, что включены «Небезопасные приложения». Подробнее об этом здесь.

Теперь, если кто-то добавит некоторые данные в путь feeds , будет отправлено электронное письмо.

Не забудьте истощить свою функцию с помощью конфигураций.

Комментарии:

1. Спасибо. Мне также пришлось включить DisplayUnlockCaptcha, чтобы заставить его работать. Одна вещь, которую я заметил, заключается в том, что если я попытаюсь использовать электронную почту пользователей из моей базы данных в поле от, например, snapshot.val().email, он возвращает мой адрес электронной почты gmail вместо электронной почты пользователей. Но поле ответа возвращает адрес электронной почты пользователей, когда я использую snapshot.val().email. Ты знаешь, почему? Это при использовании симулятора на моем ноутбуке.

2. Не могли бы вы поделиться с нами каким-нибудь кодом, чтобы взглянуть на него. Может быть, там просто небольшая опечатка или что-то в этом роде.

3. Пожалуйста, смотрите выше. Я вижу электронную почту пользователей из базы данных в реальном времени в поле «Ответить», но не в поле » От » в моем почтовом ящике. Вместо этого в поле » От » используется моя электронная почта.

4. Вы не можете отправить электронное письмо с электронной почты своих пользователей. Вы можете установить replyTo на любой адрес электронной почты, но вы всегда отправляете электронное from письмо на свой адрес электронной почты. В этой from части вы можете указать свое имя и адрес электронной почты. Любое другое электронное письмо, кроме вашего, будет проигнорировано. Если бы это было возможно, мы все могли бы отправлять электронные письма от кого-то другого 😉

5. Я обновил ответ с настройками, как они «должны» быть