# #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. Я обновил ответ с настройками, как они «должны» быть