Здравствуй,
В пакете sendgrid nodejs npm я столкнулся с проблемой. Я могу отправлять электронные письма с заменами и шаблоном, но проблема заключается в электронной почте на стороне клиента, подстановки% name%,% company% и т. Д. Не заменяются значением.
Фрагмент кода
const sgMail = require ('@ sendgrid / mail');
sgMail.setApiKey (sendgrid_key);
var msg =
{
"персонализации": [{
"к": [{
"email": " [email protected] ",
"name": "Некоторая компания"
}],
"замены": {
"% name%": "Джон",
"% company%": "Некоторая компания",
"% business%": "Быстрее Pheny"
},
"subject": "Счет-фактура для какой-то компании!"
}],
"от": {
"email": "CompanyA [email protected] ",
"name": "CompanyA"
},
"ответить на": {
"электронная почта": " [email protected] ",
"name": "Служба поддержки клиентов"
},
"subject": "Счет для какой-то компании!",
"template_id": "93f052da-08d4-46f2-8f0c-f2a193bceea0"
};
sgMail
.send (сообщение)
.then (() => {
console.log ('SendGrid :: Response после успешной отправки электронного письма!');
})
.catch (error => {
console.error ('Ошибка SendGrid :::' + error.toString ());
});
Код выполняется и получает электронное письмо без замен для% name%,% business%,% company%
Теперь я попытался использовать веб-сайт sengrid https://sendgrid.com/docs/API_Reference/api_v3.html
Он отправляет электронную почту идеально, без каких-либо проблем, и все замены сделаны правильно.
Что не так в коде javascript npm, который я использую для установки значений в sgMail.send (msg)?
Запросите вашу помощь.
Похоже, вам не хватает оберток подстановки. Я просто использовал пример, который они использовали в этом случае с простым шаблоном, и он работает.
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
sgMail.setSubstitutionWrappers('{{', '}}'); // Configure the substitution tag wrappers globally
const msg = {
to: '[email protected]',
from: '[email protected]',
subject: 'Hello world',
text: 'Notification',
html: '<p></p>',
templateId: 'your-id-goes-here',
substitutions: {
name: 'John'
},
};
sgMail.send(msg);
Мой шаблон состоит только из этого фрагмента кода:
<%body%> {{name}}
Очевидно, часть <%body%>
является обязательной.
Возможно, вы можете попробовать установить для своих оболочек что-то вроде {{
, }}
или что-то еще (или %
, %
в вашем случае), также обратите внимание что пример не включает оболочки в объекте замены, а только имя замены.
Попробуйте что-то вроде этого:
"substitutions": {
name: "John",
company: "Some Company",
business: "Faster Pheny"
},
Фантастика. Это сработало. Благодаря тонну. Замена Wrapper это то, чего не хватало.
Спасибо за полный ответ. Удачного кодирования!
@adamreisnz ,
Возможно, нам следует по умолчанию вызвать sgMail.setSubstitutionWrappers('{{', '}}');
, чтобы избежать подобных проблем в будущем. Что вы думаете?
@thinkingserious Но мы делаем именно это; см. https://github.com/sendgrid/sendgrid-nodejs/blob/master/packages/mail/src/classes/mail-service.js#L21
@adamreisnz ,
Может быть, мы попытаемся обнаружить несколько распространенных оболочек, например% или _?
Это будет круто. Когда пользователь через портал Sendgrid создает / проектирует шаблон, портал по умолчанию вставляет замену% body% и% name%. Поэтому, естественно, пользователь подумает, что не следует менять символ%, и продолжит работу с шаблоном, поскольку он не полностью осведомлен о функциональности. Если Sendgrid может предложить, чтобы% можно было изменить на любой символ или функция предпочитает {{}}, тогда пользователь будет использовать его или шаблон, который загружает настройки по умолчанию, в первую очередь заменяет% на {{. Это позволит избежать проблемы, с которой я столкнулся.
Мне не нравится автоматическое обнаружение, если только это не очень надежный алгоритм. Проблема с попыткой сделать процесс слишком умным в том, что это может привести к потенциально трудным для отладки ошибкам. Что, если кто-то использует _
для выделения? Например, действительно подчеркнуто. Это не означает, что символ _
является оболочкой подстановки. То же самое с %
, вы можете использовать его для процентов, и это может обмануть алгоритм, заставив его думать, что вы используете его как оболочку подстановки, где это не так.
Поскольку Sendgrid переходит на шаблоны handlebars, которые используют {{
и }}
в качестве оберток подстановки, я думаю, что это разумный вариант по умолчанию. Есть причина, по которой эти символы используются в качестве оболочек подстановки в таких языках, как ручки, потому что они не очень распространены в обычном языке. Подчеркивание и процент встречаются чаще и, следовательно, могут быть неверно истолкованы.
Я думаю, что нужно просто хорошо задокументировать это, чтобы прояснить это. Имея возможность указать собственную оболочку, у пользователя должно быть все необходимое для ее работы.
Если у кого-то есть идея надежного автоматического обнаружения, я бы хотел увидеть псевдоалгоритм, который может хорошо обрабатывать все сценарии и все возможные оболочки, избегая при этом ложных срабатываний.
Мысли?
Согласен. Обновления документации будут лучшим вариантом.
@adamreisnz @vinvantest согласился, пожалуйста, просмотрите https://github.com/sendgrid/sendgrid-nodejs/issues/681 для получения информации о ходе работы.
Sendgrid v3 требует замены замен на dynamic_template_data примерно так:
const msg = {
to: email,
from: '[email protected]',
subject: 'Sample Email Subject',
templateId: 'your_template_id_here,
substitutionWrappers: ['{{', '}}'],
dynamic_template_data: {
"data_item": "value"
}
};
Очень сбивает с толку то, что вы должны использовать dynamic_template_data
Было бы неплохо обновить документацию https://sendgrid.com/docs/API_Reference/api_v3.html
Я пробовал следовать самому последнему примеру
Мой шаблон был создан с использованием вашего WYSIWYG-редактора, и я попытался вставить {{verifyUrl}} как в текстовый компонент, так и в URL-ссылку компонента кнопки. ни один не работает.
@shawnkoh Вы это решили? Я также создал шаблон с помощью визуального дизайнера, и замена не работает.
Самый полезный комментарий
Sendgrid v3 требует замены замен на dynamic_template_data примерно так: