Sendgrid API: как отправлять массовые электронные письма с данными отдельного шаблона?

#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:

Вы должны прочитать каждый из этих элементов, чтобы получить значение и построить объект.

Возможно, параметры неправильно включены в тело запроса. Пожалуйста, обратите внимание, что объект персонализации содержит данные, предоставленные для каждого из этих писем.

https://sendgrid.com/docs/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/#send-a-transactional-email

 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
});