#javascript #typescript #google-cloud-firestore #sendgrid #sendgrid-api-v3
#javascript #typescript #google-облако-firestore #sendgrid #sendgrid-api-v3
Вопрос:
Запрошенное поведение:
Я хотел бы отправлять массовые электронные письма, используя облачные функции Sendgrid и Firestore вместе. В электронном письме должны отображаться некоторые индивидуальные пользовательские данные в зависимости от получателя (например, идентификатор пользователя и имя пользователя).
Текущее состояние
Я создал рабочую облачную функцию. Он получает пользовательские данные из firestore и отправляет электронные письма с помощью sendgrid API на указанные адреса электронной почты.
Проблема
Однако он отправляет идентификаторы всех пользователей на каждый адрес электронной почты, вместо того, чтобы отправлять только идентификатор, принадлежащий определенному подписчику. Пример:
В моей коллекции firestore есть 3 подписчика с 3 идентификаторами: «abc», «pqr», «xyz»
Функция должна доставлять три электронных письма, включая идентификатор, принадлежащий адресу электронной почты. Вместо этого функция отправляет «abcpqrxyz» на каждый адрес прямо сейчас.
Функция моего облака:
export const sendAllEmails = functions.https.onCall(async (event) => {
const subscriberSnapshots = await admin.firestore().collection('subscribers').get();
const emails = subscriberSnapshots.docs.map(snap => snap.data().email);
const ids = subscriberSnapshots.docs.map(snap => snap.id);
const individualMail = {
to: emails,
from: senderEmail,
templateId: TEMPLATE_ID,
dynamic_template_data: {
subject: event.subject,
text: event.text,
id: ids // sends all ids to everyone instead of a single id in every mail
}
await sendGridMail.send(individualMail);
return {success: true};
});
Нужно ли мне перебирать электронные письма и идентификаторы или у SendGrid API есть более разумная реализация для такого поведения?
Ответ №1:
Вы должны прочитать каждый из этих элементов, чтобы получить значение и построить объект.
Возможно, параметры неправильно включены в тело запроса. Пожалуйста, обратите внимание, что объект персонализации содержит данные, предоставленные для каждого из этих писем.
var data = JSON.stringify({
"personalizations": [
{
"to": [
{
"email": "john.doe@example.com",
"name": "John Doe"
}
],
"dynamic_template_data": {
"verb": "",
"adjective": "",
"noun": "",
"currentDayofWeek": ""
},
"subject": "Hello, World!"
}
],
"from": {
"email": "noreply@johndoe.com",
"name": "John Doe"
},
"reply_to": {
"email": "noreply@johndoe.com",
"name": "John Doe"
},
"template_id": "<<YOUR_TEMPLATE_ID>>"
});
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://api.sendgrid.com/v3/mail/send");
xhr.setRequestHeader("authorization", "Bearer <<YOUR_API_KEY_HERE>>");
xhr.setRequestHeader("content-type", "application/json");
xhr.send(data);
Комментарии:
1. Я не совсем понимаю. Не могли бы вы привести пример кода?
Ответ №2:
Вам нужно создать несколько объектов «персонализации» внутри данных. Я не уверен, каковы ограничения на максимальное количество электронных писем в одном запросе. Возможно, вам потребуется изучить это и проверить. Однако я тестировал со следующими данными json, и у меня это сработало:
let data = JSON.stringify({
"from": {
"email": senderEmail
},
"personalizations": [
{ //first individual starts here
"to": [
{
"email": "john.doe.1@example.com"
}
],
"dynamic_template_data": {
"subject": "The subject",
"text": "Event Text goes here",
"id": "abc" // the individual id you need goes here
}
},
{ //next individual starts here
"to": [
{
"email": "john.doe.2@example.com"
}
],
"dynamic_template_data": {
"subject": "The subject",
"text": "Event Text goes here",
"id": "pqr" // the individual id you need goes here
}
} //end - but one can add more indivuals
],
"template_id": "[your_template_id]" //add your template id here
});