24.07.2018 наша команда публично запустила динамический контент для шаблонов транзакций. Теперь он доступен для всех клиентов, отправляющих более v3 нашего API отправки почты. Перебирайте списки, обрабатывайте условные выражения и многое другое благодаря встроенной поддержке подмножества синтаксиса Handlebars!
Более подробную информацию можно найти в нашем объявлении в
В настоящее время вы можете использовать эту функцию, вручную создав тело запроса, как показано здесь .
Теперь нам нужно создать вспомогательный код ( это готово ) и примеры для этого SDK.
Пожалуйста, обновите вашу документацию - я просто потратил час, пытаясь выяснить, почему замены не работают с 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 спасибо
Добавление того, что, я надеюсь, станет исчерпывающей документацией после того, как я потратил на это еще час своего времени. (Во-первых, спасибо всем, кто потратил впустую часы своего времени до меня.)
d-
, тогда substitutions
не будет работать, и вам следует использовать CAMEL-CASE dynamicTemplateData
(см. Здесь , где они все равно конвертируют ключи snake_case в camelCase )d-
, тогда setSubstitutionWrappers
игнорируется, и вы должны использовать {{
и }}
в своих шаблонах.Добавление того, что, я надеюсь, станет исчерпывающей документацией после того, как я потратил на это еще час своего времени. (Во-первых, спасибо всем, кто потратил впустую часы своего времени до меня.)
- Если ваш идентификатор шаблона начинается с
d-
, тогдаsubstitutions
не будет работать, и вам следует использовать CAMEL-CASEdynamicTemplateData
(см. Здесь , где они все равно конвертируют ключи snake_case в camelCase )- Если ваш шаблон начинается с
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.
По поводу имеющихся типов. Я нашел 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]"
}
]
}
]
Самый полезный комментарий
Пожалуйста, обновите вашу документацию - я просто потратил час, пытаясь выяснить, почему замены не работают с v3 API.