Sendgrid-nodejs: Добавить поддержку динамических шаблонов

Созданный на 24 июл. 2018  ·  30Комментарии  ·  Источник: sendgrid/sendgrid-nodejs

Резюме проблемы

24.07.2018 наша команда публично запустила динамический контент для шаблонов транзакций. Теперь он доступен для всех клиентов, отправляющих более v3 нашего API отправки почты. Перебирайте списки, обрабатывайте условные выражения и многое другое благодаря встроенной поддержке подмножества синтаксиса Handlebars!

Более подробную информацию можно найти в нашем объявлении в

В настоящее время вы можете использовать эту функцию, вручную создав тело запроса, как показано здесь .

Теперь нам нужно создать вспомогательный код ( это готово ) и примеры для этого SDK.

Критерии приемки

  • [[ВЫПОЛНЕНО] (https://github.com/sendgrid/sendgrid-nodejs/pull/691#issuecomment-407490342)] [Реализуйте помощник, аналогичный тому, что у нас есть для старых шаблонов] (https://github.com /sendgrid/sendgrid-nodejs/blob/master/packages/mail/USE_CASES.md#transactional-templates)
  • Обновите пример USE_CASES.md, чтобы продемонстрировать новые динамические шаблоны с помощью помощника, и переименуйте текущий пример в Legacy.

Документация

medium docs update

Самый полезный комментарий

Пожалуйста, обновите вашу документацию - я просто потратил час, пытаясь выяснить, почему замены не работают с v3 API.

Все 30 Комментарий

Пожалуйста, обновите вашу документацию - я просто потратил час, пытаясь выяснить, почему замены не работают с v3 API.

Приношу свои извинения за плохой опыт @ jharris-code.

Я добавил ваш голос к этому вопросу, чтобы сделать его приоритетным. Я думаю, что он скоро будет обновлен, потому что у нас есть PR # 711.

Очень глупо, что отсутствие документации блокирует выпуск актуального кода.

Привет @ катамфетамин!

Код был выпущен в v6.3.1 . Надеюсь, это поможет, спасибо!

С наилучшими пожеланиями,

Элмер

@thinkingserious О, круто, вообще-то мне и в голову не пришло обновить версию библиотеки.
Я попробую это, спасибо.

Примечание для пользователей: при использовании шаблонов передайте dynamic_template_data вместо substitutions .

Теперь вам нужно изменить "substitutions:" на "dynamic_template_data:"

И в шаблонах используются ручки, больше не нужно указывать "substitutionWrappers"

В этом примере в ваших вариантах использования по-прежнему используются подстановки, а не dynamic_template_data. Пожалуйста, обновите, мне определенно потребовалось несколько часов поиграть с SDK и поискать, прежде чем я нашел эту ветку. (Также в ваших api-документах ничего не упоминается об этом, что тоже не помогло.
Кроме того, substitutionWrappers вообще не работает с dynamic_template_data. Независимо от включения пары ключ-значение substitutionWrappers: ['*|', '|*'] в мой объект сообщения, были заполнены только переменные шаблона, заключенные в фигурные скобки. (Вы, ребята, теперь намеренно заставляете всех использовать синтаксис руля для шаблонов?)

Мои извинения @ josh-yonomi,

Я обновил документацию на основе ваших отзывов.

Для наших новых шаблонов они используют синтаксис ручек. Устаревшие шаблоны по-прежнему работают.

С наилучшими пожеланиями,

Элмер

Я получаю письмо, но замены не работают. Что может вызвать проблему?

const msg = {
    to: email,
    from: sendGridMail,
    templateId: emailTemplate.confirmationEmail,
    dynamic_template_data: {
      firstName: firstName,
      lastName: lastName,
      link: link
    }
  };

EDIT через @thinkingserious

Не могли бы вы сообщить нам, в чем проблема? Мы хотели бы понять ваше разочарование, чтобы мы могли исправиться.

@ drav96 ,

Не могли бы вы поделиться тем, как выглядит ваш шаблон?

С наилучшими пожеланиями,

Элмер

почему вы убираете спецсимволы в substitutionWrappers ??

dynamic_template_data: {
      'foo-bar': 'wtf',
      'bar_baz': 'wtf',
      'baz.bro': 'wtf',
      'foo': 'wtf'
    }

только {{foo}} возвращает строку wtf в электронных письмах.

Я не уверен, что @larafale , но это определенно не кажется разумным. Глядя на исходный код этого SDK, я не вижу, где меняются эти ключи.

Не могли бы вы создать отдельную проблему для этой проблемы и указать, как выглядит ваш HTML-шаблон? Я отмечу новую проблему как ошибку и при необходимости постараюсь воспроизвести и исправить.

Привет,

Итак, я пытаюсь отправить электронное письмо с динамическим шаблоном, однако мне не удалось использовать замены или dynamic_template_data .
В моем шаблоне есть такие теги, как {{fullname}} или {{date}} и эти свойства были отправлены в функцию send :

const msg = {
        to,
        from,
        templateId: template.id,
        dynamic_template_data: substitutions,
    };

    return sgMail.send(msg)

Я подтвердил, что объект substitutions имеет правильные свойства с правильными значениями, но подстановка не работает.

Есть идеи, что я делаю не так?

Спасибо.

@ gianfelipe93
Структура правильная. У меня такая же проблема.
Мое решение заключалось в том, чтобы удалить пакет @sendgrid из моего проекта и снова установить его.
Сообщите мне, если это сработает для вас
const msg= { to: email, from: sendGridMail, templateId: emailTemplate.requestDemoEmail, dynamic_template_data: { name: data.name, email: data.email, } };

@ drav96 спасибо

Добавление того, что, я надеюсь, станет исчерпывающей документацией после того, как я потратил на это еще час своего времени. (Во-первых, спасибо всем, кто потратил впустую часы своего времени до меня.)

  1. Если ваш идентификатор шаблона начинается с d- , тогда substitutions не будет работать, и вам следует использовать CAMEL-CASE dynamicTemplateData (см. Здесь , где они все равно конвертируют ключи snake_case в camelCase )
  2. Если ваш шаблон начинается с d- , тогда setSubstitutionWrappers игнорируется, и вы должны использовать {{ и }} в своих шаблонах.

Добавление того, что, я надеюсь, станет исчерпывающей документацией после того, как я потратил на это еще час своего времени. (Во-первых, спасибо всем, кто потратил впустую часы своего времени до меня.)

  1. Если ваш идентификатор шаблона начинается с d- , тогда substitutions не будет работать, и вам следует использовать CAMEL-CASE dynamicTemplateData (см. Здесь , где они все равно конвертируют ключи snake_case в camelCase )
  2. Если ваш шаблон начинается с d- , тогда setSubstitutionWrappers игнорируется, и вы должны использовать {{ и }} в своих шаблонах.

В моем случае он работает с dynamic_template_data даже если в идентификаторе шаблона есть буква d-

Да, он работает с ключами кейса змейки, но похоже, что разработчики внутренне взяли на себя обязательства по кейсу с верблюдом (см. Строку, на которую я ссылался в своем отчете выше). Таким образом, я бы рекомендовал всему новому коду использовать случай верблюда.

Привет @ kael-shipman,

Спасибо, что нашли время помочь, мы очень ценим это!

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

С наилучшими пожеланиями,

Элмер

@thinkingserious , спасибо за понимание и готовность исправить ситуацию. И извините за то, что получил отрывок наверху. Был уооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо

Во всяком случае, проблема не столько в том, что где-то существует правильная (иш) документация, а в том, что многие старые документы все еще попадают в поисковые запросы Google. Я выполнил поиск по запросу «поля шаблона sendgrid» (только что), и первым результатом, не связанным с рекламой, стал этот , который, судя по всему, является официальной документацией, но явно устарел. Кроме того, он также имеет два разных формата подстановки ( -firstName- и %firstName% ) и говорит только «то, что вы используете, может зависеть от библиотеки SDK, которую вы используете», что кажется действительно неуместным, учитывая что все библиотеки SDK предположительно будут указывать на один и тот же храм (который имеет только один стиль тегов подстановки).

По моему опыту работы с sendgrid, хотя я очень ценю то, что было создано, эта путаница в документации на самом деле является правилом, а не исключением. Я знаю, что он, вероятно, продвигается вперед так же, как и весь остальной мир программного обеспечения, но было бы неплохо потратить месяц или около того, чтобы просто нормализовать всю документацию, добавить в нее номера версий и т. Д., И, возможно, что-то сделать с лучшие хиты Google.

В любом случае, еще раз спасибо!

Кроме того, связанная вами документация по-прежнему показывает dynamic_template_data в случае змеи, и если это правильно, то я не уверен, почему сам код, похоже, преобразует его в camelCase. Как отмечалось выше, я признаю, что чехол для змеи работает, но, учитывая код, не похоже, что документация должна рекомендовать его использовать.

Привет @ kael-shipman,

Спасибо, что нашли время предоставить подробный отзыв!

Что касается предоставленной вами ссылки, эта документация относится к нашему SMTP API SendGrid, а не к REST API SendGrid v3, который поддерживает этот SDK. Тем не менее, вы не должны ожидать этого. Я доведу эту проблему до сведения нашей группы документации, чтобы посмотреть, есть ли способ прояснить ее.

Мы недавно обновили и повторно запустили нашу документацию с открытым исходным кодом . Надеюсь, вам будет проще ориентироваться.

Я исправлю README, чтобы использовать camelCase для единообразия. Спасибо, что заметили это и обратили наше внимание!

Еще раз спасибо и в знак признательности за подробный отзыв, мы хотели бы предложить вам немного подарков . Наслаждаться!

С наилучшими пожеланиями,

Элмер

Привет, круто, спасибо: D

Во вторник, 18 сентября 2018 г., в 18:09 Элмер Томас [email protected]
написал:

Привет @ kael-shipman https://github.com/kael-shipman ,

Спасибо, что нашли время предоставить подробный отзыв!

Что касается предоставленной вами ссылки, эта документация является справочной.
к нашему SMTP API SendGrid, а не к REST API SendGrid v3, который этот SDK
поддерживает. Тем не менее, вы не должны ожидать этого. Я принесу
эту проблему следует обратить внимание нашей группы документации, чтобы проверить, есть ли
способ прояснить это.

Недавно мы обновили и повторно запустили нашу документацию с открытым исходным кодом.
https://sendgrid.com/blog/how-to-get-the-most-from-sendgrids-new-knowledge-center/ .
Надеюсь, вам будет проще ориентироваться.

Я исправлю README, чтобы использовать camelCase для единообразия. Спасибо за
поймав это и доведя до нашего сведения!

Еще раз спасибо и в знак признательности за ваш подробный
обратная связь, мы хотели бы предложить вам немного подарков
https://dx.sendgrid.com/swag . Наслаждаться!

С наилучшими пожеланиями,

Элмер

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/sendgrid/sendgrid-nodejs/issues/703#issuecomment-422588492 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ADUIglZIH2d7imy-H7dekTo5A-v2Xau8ks5ucX0agaJpZM4Vev8b
.

Я могу заставить dynamic_template_data работать с общими переменными электронной почты, но что, если нам также нужно добавить динамические данные для каждого получателя? Например, номера заказов, количество заказов и т. Д. Я не вижу варианта использования этого в документации, но, возможно, я упускаю его из виду.

Примечание для пользователей: при использовании шаблонов передайте dynamic_template_data вместо substitutions .

@catamphetamine К сожалению, я отклонил ваш комментарий, потому что я просто потратил слишком много времени, пытаясь понять, почему общий код, похоже, работает с dynamicTemplateData , но в моем случае замены просто удаляются. Я просто надеюсь, что у других будет лучший опыт.

Моя версия:
"@sendgrid/mail": "^6.3.1"

Оказалось, что мне пришлось сделать следующее (противоположное тому, что говорят люди):

// This seems to be the default, however, to avoid unexpected API changes,
// I'd rather set this manually
setSubstitutionWrappers("{{", "}}");

{
      subject: EMAIL_SUBJECT_ONBOARDING,
      templateId: "templateId",
      personalizations: [{
        to,
        // NOT WORKING WITH THIS ❌
        // dynamicTemplateData: {
        //   senderName: EMAIL_FROM_NAME,
        //   senderAddress: "an actual adress",
        // },

        // WORKS WITH THIS ✅
        substitutions: {
            senderName: EMAIL_FROM_NAME,
            senderAddress: "an actual adress",
        },
    }],
}

@thinkingserious люблю этот инструмент. Продолжайте улучшать документацию, закрывать крайние случаи и т. Д. 🎉❤️


ОБНОВИТЬ:

Спасибо @catamphetamine за substitutions сработало, потому что я сделал setSubstitutionWrappers("{{", "}}"); . Увы, нет. Я не знаю, что случилось. Возможно, я устал, но dynamicTemplateData действительно работает . Обратите внимание, что это camelCase _ (см. Комментарий @ kael-shipman) _ Я вижу большинство примеров snake case. Также я использую типы TS для sendgrid. В определении нет доступного ключа snake_case.


ОБНОВЛЕНИЕ 2:

По поводу имеющихся типов. Я нашел dynamic_template_data в типе PersonalizationJSON . Если вы используете следующее:
import { send } from "@sendgrid/mail";
то после проверки первого параметра для отправки вы увидите MailData которое имеет следующее определение:

export interface MailData {
  // ...
  personalizations?: PersonalizationData[],
  // ...
}

Тогда я натыкаюсь на следующие 2 типа:

export interface PersonalizationData {
  // omitted keys...
  dynamicTemplateData?: { [key: string]: string; };
  customArgs?: { [key: string]: string };
  sendAt?: number;
}

export interface PersonalizationJSON {
  // same omitted keys...
  dynamic_template_data?: { [key: string]: string; };
  custom_args?: { [key: string]: string; };
  send_at?: number;
}

Наконец, я получаю dynamic_template_data для последовательной работы следующим образом:

{
    templateId: "d-templateId",
    dynamic_template_data: { name: "elton yet again"}, // <-- either here
    personalizations: [{
        to,
        dynamic_template_data: { name: "Elton again" }, // <-- or here
    }],
}

@thinkingserious Очевидно, что есть проблемы с определением типов, которые необходимо исправить. Я могу создать пиар позже.

Хорошо, мне нужно снова провести расследование. Я ошеломлен, потому что теперь у меня не работают ни dynamicTemplateData и substitutions .

ОБНОВИТЬ:
Перевернул некоторые таблицы, но заставил их работать и обновил мой предыдущий комментарий.

Наконец, я получаю dynamic_template_data для последовательной работы следующим образом:

{
    templateId: "d-templateId",
    dynamic_template_data: { name: "elton yet again"}, // <-- either here
    personalizations: [{
        to,
        dynamic_template_data: { name: "Elton again" }, // <-- or here
    }],
}

Для меня это было важным моментом. Я пытался установить тему в шаблоне транзакции, отличную от электронной почты vs cc. Это сработало, когда я поместил свойство dynamic_template_data внутрь массива персонализации, как описано выше.

    const msg = {


         personalizations: [
            {
              to: req.body.to,
              dynamic_template_data : {
                subject: "Just to adsf...",
                full_name_from: req.body.full_name_from,
                full_name_to: req.body.full_name_to,
                manager: req.body.manager,
                message: req.body.message,
                badge: req.body.badge,
                badge_image: 'https://asdf' + req.body.badge_image
             }
            },
            {
              to: req.body.manager,
              dynamic_template_data : {
                subject: req.body.full_name_from + ' received a asdf asdf',
                full_name_from: req.body.full_name_from,
                full_name_to: req.body.full_name_to,
                manager: req.body.manager,
                message: req.body.message,
                badge: req.body.badge,
                badge_image: 'https://asdf' + req.body.badge_image
             }
            }
          ]
    };

Решение, которое сработало для меня, заключается в размещении dynamic_template_data внутри объекта персонализации точно так, как показано ниже:

    "personalizations": [
        {
              "dynamic_template_data": {
            "fullname": "full Name",
            "useremail": ":[email protected]",
            "userphone": "56456",
            "usermsg": "tex fdsfgasdf t"
    },
            "to": [
                {
                    "email": "[email protected]"
                }
            ],
            "cc": [
                {
                    "email": "[email protected]"
                }
            ]
        }
]
Была ли эта страница полезной?
0 / 5 - 0 рейтинги