Персонализация выпуска¶
Данные для персонализации¶
Текст выпуска может быть персонализирован для каждого получателя его личными данными.
Для Экспресс-выпуска данные для персонализации указываются совместно со списком получателей.
Для Транзакционных писем данные могут быть взяты или из хранимых в системе или указаны при выпуске.
Для прочих рассылок данные персонализации берутся из сохранённых в системе при импорте подписчиков (member.import) и индивидуально внесённых для отдельных адресов (member.set).
Для управления персонализацией создан язык ProScript - простой, но эффективный язык персонализации с богатыми возможностями.
Для простой подстановки данных воспользуйтесь командами подстановки[% anketa.ключ-данных %].
В руководстве о ProScript, размещённом на сайтеhttps://sendsay.ru, описаны более продвинутые возможности - условные операторы, циклы, вызовы функций, работа с датой и временем.
Данные персонализации могут быть дополнены из внешнего источника (например, с вашего сайта) прямо во время выпуска - это описано ниже в этой главе.
Также при выпуске можно указать уникальные для всего выпуска данные для персонализации - параметр выпуска extra.
Раздача промокодов¶
Для подстановки промокода в выпуск используются команда подстановки
[% get_promocode() %]
или
[% get_promocode("url") %]
Если url не задан, то коды берутся из файла promocodes.txt который должен быть загружен в корень раздела "Загрузки".
В раздел "Загрузки" можно загрузить файлы с промокодами с другими названиями и ссылать на них используя url записаный какrfs://upload/название-файла
Для максимального быстродействия рекомендуется размещать файлы с кодами в разделе "Загрузки" - получить их оттуда значительно быстрее чем сходить наружу по https-ссылке.
Все кода равнозначны - без разницы из какого источника выдан код. Т.е. промокод ХХХ, ранее полученный из одного источника, не получится выдать из другого.
Повторное использование в шаблоне подстановки кода с теми же параметрами допустимо - даст тот же код.
Если подстановка кода внутри IF, который НЕ сработал, то код всё равно расходуется.
При использовании команды подстановки и отсутствии файла выпуск не выйдет.
Одна строка файла воспринимается как один промокод (хоть даже с пробелами внутри).
Пустые строки игнорируются.
Строки, начинающиеся с # игнорируются.
Коды длиннее 64 байт игнорируются.
Коды одноразовые.
При использовании кода запоминается кому конкретно он был выдан.
Если получателю не достанется промокода - он отсеивается из выпуска с кодом доставки -100019
Статистика раздачи кодов доступна в Универсальной статистике через объект promocode.
Если письмо или часть выпуска были отменены, то выданные этой части писем промокоды освобождаются для повторной выдачи.
Если письмо не было доставлено, то промокод остаётся выданным.
В тестовых письмах и при просмотре "как будет выглядеть" коды подставляются, но не расходуются.
Персональные Excel-документы¶
Каждый получатель выпуска рассылки может иметь в письме лично для него сформированные и персонализированные его данными электронные таблицы Excel.
Для этого при выпуске просто указывается, что требуется прикреплять индивидуальные Excel-файлы, и на базе какого html-черновика их строить.
Система автоматически сгенерирует из черновика персонализированную электронную таблицу и превратит её в уникальный для каждого Excel-файл.
Правила формирования¶
Из персонализированного html-кода черновика извлекается каждая таблица и размещается в одной таблице на лист документа.
Таблицы со всеми пустыми ячейками игнорируются.
Вложенные таблицы игнорируются.
Из ячейки берётся только текст вне тегов. Все html стили и атрибуты оформления ячейки и текста игнорируются, но поддерживает colspan и rowspan у ячейки.
Свойствами документа, листа, строки и ячейки можно управлять через атрибуты data-xlsx-* тегов table/tr/th/td как описано далее.
Свойства документа¶
Свойства документа устанавливаются в любом теге table. Повторное указание свойства в другой таблице заменяет предыдущее.
data-xlsx-title - заголовок
data-xlsx-subject - тема
data-xlsx-author - автор
data-xlsx-manager - менеджер
data-xlsx-company - компания
data-xlsx-category - категория
data-xlsx-keywords - ключевые слова
data-xlsx-comments - комментарий
data-xlsx-status - статус
Свойства листа¶
Свойства листа устанавливаются в теге table
data-xlsx-name - название листа (по умолчанию порядковый номер таблицы с единицы)
data-xlsx-infocus - 1 если этот лист должен быть отображён при открытии документа. По умолчанию - первый лист
data-xlsx-selection - пусто или координаты ячейки, которая будет выбрана при открытии документа (два числа через запятую - строка, столбец. счёт от нуля)
data-xlsx-autofilter - пусто или диапазоны выделения для автофильтра (диапазон - две координаты через запятую) т.е. строка чисел через запятую, которая разбивается на четвёрки (диапазоны), которые разбиваются на пары (координаты). Пример: data-xlsx-autofilter="2,3,6,8,34,6,38,9" - два диапазона: от 2,3 до 6,8 и от 34,6 до 38,9
Свойства строки¶
Свойства строки устанавливаются в теге tr.
data-xlsx-row_height - высота строки (по умолчанию - автоподбор)
Свойства ячейки¶
Свойства ячейки устанавливаются в тегах th и td.
data-xlsx-contents - если задано, то заменяет содержимое, полученное из html-ячейки
data-xlsx-type - тип ячейки. String (по умолчанию), number, data_type. Для data_type содержимое должно быть вида YYYY-MM-DD hh:mm:ss
data-xlsx-display_format - формат отображения для number и data_type. Для data_type по умолчанию "DD/MM/YYYY HH:MM:SS"
data-xlsx-formula - формула для вычисления содержимого ячейки при просмотре документа
data-xlsx-column_width - ширина строки (по умолчанию - автоподбор)
data-xlsx-format-bold - жирный шрифт (1, по умолчанию для th) или нет (0, по умолчанию для tr)
data-xlsx-format-italic - наклонный шрифт (1) или нет (0, по умолчанию)
data-xlsx-format-color - цвет шрифта. Прямое указание вида "#RRGGBB" или одно из black, white, red, lime, blue, yellow, magenta, cyan, brown, green, navy, purple, silver, gray, pink, orange
data-xlsx-format-size - размер шрифта
data-xlsx-format-align - горизонтальное выравнивание содержимого ячейки: none (по умолчанию), left, center, right, fill, justify, center_across
data-xlsx-format-valign - вертикальное выравнивание содержимого ячейки: bottom (по умолчанию), top, vcenter, vjustify
data-xlsx-format-text_wrap - разрешить (1) перенос длинного текста или нет (0, по умолчанию)
data-xlsx-format-pattern - фон ячейки: none (по умолчанию), solid, medium_gray, dark_gray.light_gray, dark_horizontal, dark_vertical, dark_down, dark_up, dark_grid, dark_trellis, light_horizontal, light_vertical, light_down, light_up, light_grid, light_trellis, gray_125, gray_0625
data-xlsx-format-fg_color - цвет переднего плана ячейки (имеет смысл, только если pattern не none)
data-xlsx-format-bg_color - цвет фона ячейки (имеет смысл, только если pattern не none)
data-xlsx-format-border - четыре стиля бордюра для сторон ячейки через запятую в порядке лево, право, верх, низ: none, thin, medium, dashed, dotted. thick, double, hair, medium_dashed, dash_dot, medium_dash_dot, dash_dot_dot, medium_dash_dot_dot, slant_dash_dot
data-xlsx-format-border_color - четыре цвета бордюра для сторон ячеек через запятую
Персональные PDF-документы¶
Каждый получатель выпуска рассылки может иметь в письме лично для него сформированные и персонализированные его данными pdf-файлы.
Для этого при выпуске просто указывается, что требуется прикреплять индивидуальные pdf, и на базе какого html-черновика их строить.
Система автоматически сгенерирует из черновика персонализированный документ и превратит его в уникальный для каждого pdf-файл.
Для подключения этой возможности обратитесь в Службу поддержки.
Персональные прикрепляемые файлы¶
Каждый получатель выпуска рассылки может иметь в письме прикрепляемые файлы получаемые по ссылке, которая персонализируется в момент формирования письма.
Такая ссылка различается по наличию команд(ы) ProScript в ссылке на прикрепляемый файл.
Например
Система автоматически получит каждый файл и прикрепит его к нужному письму.
При невозможности получать файл, он будет проигнорирован и письмо сформируется без него.
Если невозможность получить файл должна приводить к отмене высылки письма, то начните url в со знака "!".
Тогда при ошибке письмо выслано не будет, а в доставке получит статус -4 - письмо отменено.
Если начать url с "!?", то всё будет как и при "!", но если url будет полностью пустым, то это не будет ошибкой и такой файл будет проигнорирован.
Для подключения этой возможности обратитесь в Службу поддержки. Обратите внимание, что: - формирование писем рассылок происходит параллельно в несколько десятков потоков - готов ли ваш сайт к этому? - размер письма увеличится на 4/3 размера файла - используется кодирование base64 - параметры mime-тип и кодировка берутся из заголовка Content-Type ответа http - название файла берется из параметра filename заголовка Content-Disposition ответа, а если его нет, то в качестве названия используется последний компонент пути ссылки, а если он пуст (например ссылка заканчивается на "/"), то используется слово "attachment" - при проблемах с получением файла, письмо всё равно выйдет - содержимым файла будет описание возникшей ошибки - скорость выхода писем практически на 100% будет зависеть от вашей скорости ответа на запросы файлов - готов ли ваш сайт к этому?
Вставка QR-кода¶
В текст письма можно вставить штрих-код.
Для вставки QR-кода используйте функцию шаблонизатора qr_code().
где
txt - текст для генерации QR-кода
p - настройки, параметр необязателен
Например
Настройки QR code
Version - размер изображения в точках QR-кода. От этого зависит сколько байт информации поместится на изображении. По умолчанию 0 - автоопределение. Таблица допустимых значений размера в точках и сколько помещается в байтах приведена ниже. Не забывайте, что не-ASCII символы занимают более одного байта (например, русская буква - это два байта)
Ecc - уровень коррекции ошибок. 'M', 'L', 'H' or 'Q. по умолчанию 'M'
ModuleSize - размер блока - количество пикселей на элементарную точку кода QR (количество точек определяет Version). По умолчанию 4
| Version | Точек QR | Сколько бит информации позволяет закодировать | Максимальное количество байт которое можно закодировать |
|---|---|---|---|
| 1 | 21x21 | 112 | 14 |
| 2 | 25x25 | 208 | 26 |
| 3 | 29x29 | 336 | 42 |
| 4 | 33x33 | 496 | 62 |
| 5 | 37x37 | 672 | 84 |
| 6 | 41x41 | 848 | 106 |
| 7 | 45x45 | 976 | 122 |
| 8 | 49x49 | 1216 | 152 |
| 9 | 53x53 | 1440 | 180 |
| 10 | 57x57 | 1704 | 213 |
| 11 | 61x61 | 2008 | 251 |
| 12 | 65x65 | 2296 | 287 |
| 13 | 69x69 | 2648 | 331 |
| 14 | 73x73 | 2896 | 362 |
| 15 | 77x77 | 3296 | 412 |
| 16 | 81x81 | 3600 | 450 |
| 17 | 85x85 | 4032 | 504 |
| 18 | 89x89 | 4480 | 560 |
| 19 | 93x93 | 4992 | 624 |
| 20 | 97x97 | 5328 | 666 |
| 21 | 101x101 | 5688 | 711 |
| 22 | 105x105 | 6232 | 779 |
| 23 | 109x109 | 6856 | 857 |
| 24 | 113x113 | 7288 | 911 |
| 25 | 117x117 | 7976 | 997 |
| 26 | 121x121 | 8472 | 1059 |
| 27 | 125x125 | 9000 | 1125 |
| 28 | 129x129 | 9520 | 1190 |
| 29 | 133x133 | 10112 | 1264 |
| 30 | 137x137 | 10960 | 1370 |
| 31 | 141x141 | 11616 | 1452 |
| 32 | 145x145 | 12304 | 1538 |
| 33 | 149x149 | 13024 | 1628 |
| 34 | 153x153 | 13776 | 1722 |
| 35 | 157x157 | 14472 | 1809 |
| 36 | 161x161 | 15288 | 1911 |
| 37 | 165x165 | 15912 | 1989 |
| 38 | 169x169 | 16792 | 2099 |
| 39 | 173x173 | 17704 | 2213 |
| 40 | 177x177 | 18648 | 2331 |
Вставка штрих-кода¶
В текст письма можно вставить штрих-код формата Code128.
Такой штрих-код используется на многих платёжных документах и понимается платёжными терминалами.
Для вставки штрих-кода используйте функцию шаблонизатора barcode_code128().
[% barcode_code128(код) %]
[% barcode_code128(код, параметр1, значение1, параметр2, значение2, ... ) %]
Пример с настройками по умолчанию проверенный на реальных платёжных терминалах.
где anketa.barcode.T - это переменная, содержащая код для штрих-кода. Замените её имя на настоящее, используемое у вас.
Вы можете влиять на внешний вид штрих-кода с помощью следующих параметров:
width (автоматически) - Ширина изображения в пикселах
height (автоматически) - Высота изображения в пикселах
border (0) - Размер чёрного бордюра вокруг штрих-кода
scale (1) - Масштаб одного штриха кода в пикселах
font ("medium") - Шрифт текста ("giant", "large", "medium", "small", "tiny")
show_text (1) - Повторить цифры штрих-кода текстом под изображением
font_margin (2) - Отступ в пикселах вокруг текста
font_align ("center") - Выравнивание текста ("left", "right", "center")
top_margin (2) - Отступ в пикселах выше штрих-кода
bottom_margin (2) - Отступ в пикселах ниже штрих-кода и текста
left_margin (5) - Отступ в пикселах ниже штрих-кода и текста
right_margin (5) - Отступ в пикселах ниже штрих-кода и текста
padding (20) - Размер в пикселах белой рамки до и после штрих-код
Внешние данные персонализации выпуска¶
Зачем это надо? Например, раздача пользователям уникальных кодов для последующего их использования на вашем сайте или магазине.
Для персонализации выпуска данные из анкет подписчиков и данные общих параметров (extra) можно дополнить данными из внешнего источника, получаемыми динамически по ходу выпуска рассылки.
Это реализуется путём использования специальной функций шаблонизатора в тексте и/или шаблоне выпуска или указанием в специальном ключе параметра выпуска extra:
Кроме указания в тексте выпуска, возможно указать, какие внешние данные подключить прямо в api-вызове выпуска рассылки. Это описано ниже.
Указание в шаблоне¶
- для дополнения анкетных данных
- для дополнения общих параметров
если ответ json
[% external_extra("url","ignore_error","0|1","timeout","секунды","prefix","префикс") %]
[% external_extra("url","method","get","ignore_error","0|1","timeout","секунды","prefix","префикс") %]
если ответ csv
[% external_extra("url","format","csv","ignore_error","0|1","timeout","секунды","prefix","префикс") %]
[% external_extra("url","format","csv","method","get","ignore_error","0|1","timeout","секунды","prefix","префикс") %]
Кавычки у всех параметров обязательны.
Сами параметры (кроме url) - необязательны
-
ignore_error - игнорировать или нет ошибки обработки. По умолчанию любая ошибка прекращает формирование выпуска рассылки.
-
timeout - время на получение ответа. по умолчанию 3 минуты, максимально - 10 минут.
-
prefix - полученные данные добавляются в общие параметры не как есть, а под указанным ключом. для json по умолчанию пусто - добавляются как есть для csv по умолчанию "csv" - добавляются под ключом csv
-
method - http-метод вызова. По умолчанию post, так как передаются данные о том, что за выпуск формируется. Возможно указать "get"
С точки зрения шаблонизатора эти функции возвращают пустой результат, но меняют набор данных для использования в персонализации.
Указание при выпуске в extra¶
Кроме указания в тексте выпуска, возможно указать, какие внешние данные подключить прямо в api-вызове выпуска рассылки.
{
"action" : "issue.send"
.....
"extra" : {
..........
--- указание дополнительных ссылок для внешних данных для общих параметров
--- аналогично функции шаблонизатора текста выпуска [% external_extra() %]
--- однако обрабатывает до него и можно использовать шаблонизатор
--- доступны данные "extra" с уже добавленным туда ключjм param содержащим информацию о выпуске
-- + туда с обработкой с каждого url добавляются его данные
--- т.е. при обработке url-1 для шаблонизатора доступны данные issue.send:extra,
--- а при обработке url-2 для шаблонизатора уже доступны данные issue.send:extra + данные url-1
"external_extra" : [
{
"url" : "урл-1"
,"method" : ..
,"ignore_error" : ...
-- и прочие возможные параметры external_extra()
-- обязателен так же только url
}
,{
"url" : "урл-2"
.....
}
.....
]
..........
--- указание дополнительных ссылок для внешних анкетных данных
--- аналогично функции шаблонизатора текста выпуска [% external_anketa() %]
--- и по порядку вызов идут до url, полученных из external_anketa()
"external_anketa" : [
{
"url" : "урл-1"
,"method" : ..
,"ignore_error" : ...
и прочие возможные параметры external_extra()
}
,{
"url" : "урл-2"
.....
}
.....
]
}
}
Вызов получения внешних данных¶
Вызовы указанных адресов производятся методом POST с передачей cgi-параметра request, содержащего json-utf8 данные о текущем выпуске.
Ошибка получения данных, или разбора полученных данных, или не соответствия типа json фатальна - выпуск прекращается.
Это можно отменить параметром "ignore_error","1".
При вызове передаются (если не указан метод get) следующие данные, позволяющие идентифицировать, что это за выпуск:
{
"some.id" : "......." - некая строка до 32 символов, однозначно идентифицирующая выпуск (это НЕ номер выпуска, который он получит позже)
,"login" : "..." - аккаунт, для которого формируется выпуск
,"group.id" : "..." - код группы, для которой формируется выпуск
,"track.id" : 123 - номер трекера для track.get, присвоенный выпуску
,"draft.id" : 123 - номер черновика, на основе которого формируется выпуск или null
,"class.id" : 123 - номер класса выпуска
,"seq.id" : 123 - номер последовательности, вызвавшей этот выпуск или null
,"variant.id" : 123 - номер варианта А/Б-тестирования, вызвавшего этот выпуск или null
,"form.id" : 123 - номер формы, вызвавшей этот выпуск или null
,"campaign.id" : 123 - номер кампании, в рамках которой выходит этот выпуск или null
,"extra": { ... } -- данные параметра extra вызова issue.send или null
- только для external_anketa
-- без параметра dk
,"users.list" : [
список адресов, для которых ожидаются дополнительные анкетные данные
]
-- c параметром dk
-- данные персонализации для адресов для ключей данных, указанных в dk,
-- позволяет производить более подробный анализ на стороне клиента
-- (например, выдавать промокоды не всем в списке, а только в зависимости от какой-то переменной)
-- в dk через пробел перечисляются ключ данных, информация по которым интересует
-- не забывайте ключ member.email для получения собственно адреса :)
,"users.list" : [
[ "email1-dk1-data", "email1-dk2-data", ... ]
[ "email2-dk1-data", "email2-dk2-data", ... ]
,[ ... ]
.........
]
}
Если вам не нужны данные о текущем выпуске, то можно указать использование метода get.
Ответ в json¶
В ответ ожидается json-utf8, описывающий объект.
Этот объект будет включён в общие параметры выпуска или непосредственно, или под ключом, указанным в параметре "prefix".
Ответ в csv¶
Указывается параметром "format":"csv".
В ответ ожидается csv в utf8.
Результат-массив будет включён в общие параметры выпуска под ключом "csv", если иной не указан в параметре "prefix".
Первая строка ответа очень похожа на такую же строку в импорте подписчиков и разбирается как строка-заголовок, содержащая ключи данных для каждой колонки. Остальные строки - данные для формирования объектов, одна строка один объект. В отличии от импорта ключи данных не ограничены глубиной два ("x.y") и не проверяются на соответствие имеющимся кодам анкет и кодам ответов этих анкет.
Разделитель колонок подбирается автоматически.
получится
Дополнение общих параметров¶
Общие параметры, указываемые в ключе extra вызова issue.send, дополняются результатами обработки external_extra().
В выпуске может быть несколько использований external_extra() - все они будут обработаны один раз перед началом формирования писем по порядку расположения в тексте. Место расположения в данный момент неважно. Дополненные параметры действуют с самого начала текста.
Результаты всех external_extra() сначала объединяются между собой по ключам первого уровня. Более поздние данные имеют приоритет и заменяют собой имеющиеся.
Итоговый результат объединяется по ключам первого уровня с данными указанными в extra. Данные уже имеющиеся в extra, имеют приоритет и не заменятся внешними.
Пример для выпуска с двумя вызовами:
данные extra из issue.send { "nol" : "ноль" }
данные первого вызова external_extra()
{
"odin" : "адын"
,"dva" : "ещё адын"
,"abv" : {
"a" : "А"
,"b" : "Б"
,"v" : "В"
}
,"gde" : {
"g" : "Г"
,"d" : "Д"
,"e" : "Е"
}
}
данные второго вызова external_extra()
результат
{
"nol" : "ноль" -- данные их extra приоритетнее
,"odin" : "адын" -- нет во втором вызове external_extra()
,"dva" : "два" -- есть во втором вызове external_extra()
,"abv" : { -- нет во втором вызове external_extra()
"a" : "А"
,"b" : "Б"
,"v" : "В"
}
,"gde" : { -- есть во втором вызове external_extra() - просто замена без попыток объединения ключей
"х" : "Х"
}
}
Дополнение анкетных данных¶
Не работает в тестовых копиях.
Анкетные данные пользователей дополняются результатами обработки external_anketa().
В выпуске может быть несколько использований external_anketa() - все они будет обработаны один раз перед началом формирования писем по порядку расположения в тексте. Место расположения в данный момент не важно. Дополненные параметры действуют с самого начала текста.
Ошибка получения данных или разбора полученного json или не соответствия типа json фатальна для группы получателей указанных в выпуске, но сам выпуск продолжается в предположении что проблема разовая и следующие получатели смогут успешно пополнить свои данные.
Однако ошибка при получении данных для первой группы фатальна и выпуск прекращается.
Для одного выпуска вызовов каждого external_anketa() может быть несколько и они могут поступать одновременно - в зависимости от количества получателей выпуск формируется в несколько потоков, а получатели обрабатываются порциями. В данный момент обычный размер порции составляет 1000 адресов.
В параметре users.list передаются адреса текущей группы получателей или указанные данные на основе списка из параметра dk.
Ответ должен быть json-массивом содержащим json-объекты или null.
Внешние данные для пользователя могут быть любой структуры - не обязательно двухуровневые объекты как у анкетных данных.
Данные приписываются пользователю по порядку их расположения в массиве - первому адресу в users.list добавляются данные первого элемента массива ответа, второму - второго и так далее.
Элементом массива может быть null - соответствующий получатель не получит дополнительных данных.
Массив в ответе может быть короче исходного - оставшиеся адреса не получат дополнительных данных.
Массив в ответе может быть длиннее исходного - лишние элементы игнорируются.
Пример:
users.list ответ
[ [
"1@test.ru" { данные для 1@test.ru }
,"2@test.ru" ,null -- нет данных для 2@test.ru
,"3@test.ru" { данные для 3@test.ru }
]
,"4@test.ru" -- нет данных для 4@test.ru так как ответ короче
]
Результаты всех external_anketa() для каждого получателя сначала объединяются между собой по ключам первого уровня. Более поздние данные имеют приоритет и заменяют собой имеющиеся.
Если значение из внешних данных для какого-то ключа скаляр или массив, то берётся оно.
Если объект, то объект данных анкета и объект из внешних данных объединяются по ключам первого уровня. Данные уже имеющиеся в анкете менее приоритетны и заменятся внешними при их наличии. Внешние данные для анкеты member игнорируются.
Пример для выпуска:
данные анкеты одного пользователя { "member" : { "email" : "test@test.ru" ,"id" : 123 } ,"info" : { "firstname" : "Имя" ,"lastname" : "Фамилия" } ,"param" : { "raz" : "Раз" "dva" : "Два" } }
данные вызова external_anketa() для этого пользователя
{
"member" : {
"email" : "xxxx@test.ru"
}
,"info" : {
,"lastname" : "фамилиЁ"
}
,"param" : [ "Три", "Четыре" ]
,"secret" : "12345"
}
результат
{
"member" : {
"email" : "test@test.ru" -- не заменено, так как member не изменяем
,"id" : 123
}
,"info" : {
"firstname" : "Имя"
,"lastname" : "фамилиЁ" -- внешние данные при объединение объектов по ключам второго уровня
}
,"param" : [ "Три", "Четыре" ] -- полностью заменено внешними данными так как внешние данные не объект
,"secret" : "12345" -- новые внешние данные
}
Данные о товарах Яндекс.Маркет (формат YML)¶
Если у вас есть данные о ваших товарах в формате YML (Яндекс.Маркет), то вы можете сделать их доступными в выпуске одной командой
[% external_extra("url","format","yml") %] -- простой вариант когда в выпуск подключается один YML
[% external_extra("url","format","yml","prefix","xxx") %] -- когда в выпуск подключается больше одного YML их надо снабдить разными префиксами
(url может быть задан только константой)
Для ускорения работы и выпуска рассылки необходимо заказать в Службе Поддержки подключение каждого уникального веб-адреса с данными yml (это бесплатно).
В результате ваши данные о товарах станут доступны в шаблонизаторе с префиксом yml.
Каждый конкретный товар будет доступен как
[% yml.<id>.* %] -- если prefix не был указан
[% yml.xxx.<id>.* %] -- если указан не пустой prefix (в примере xxx)
где
все значения параметров тега offer и значения всех тегов внутри offer доступны как одноимённые параметры товара
все значения тега param доступны как yml. где транслитерированное значение параметра name тега param Товары у пустым url при импорте игнорируются Категории товаров доступны через где Описание подарков доступно через где Описание акций доступно через где Будет доступен через yml.123 Его параметр type тего offer через yml.123.type Его значение тега model через yml.123.model Его значение Размер через yml.123.param.Razmer Его значение дополнительного параметра unit у параметра Размер через yml.123.param.Razmer_unit Динамический контент позволяет вам задавать содержимое части выпуска или всего выпуска как текст забираемый готовым со страницы какого-либо сайта или собираемый на основе новостей из различных видов источников с помощью Лент Новостей. Во всех ссылках поддерживается аутентификация HTTP-Basic - укажите её обычным образов в самой ссылке. Во всём содержимом подставляемым в текст письма с помощью динамического контента работает шаблонизатор - подставляемы части могут содержать любые его команды. "Готовая страница сайта" это доступная веб-страница любого сайта. При использовании в выпуске рассылки команды шаблонизатора [% wget("url") %], указанная страница забирается с сайта и подставляется в текст письма. Это происходит в момент формирования текста выпуска рассылки и поэтому адрес страницы может быть задан только как константа. От страницы используется только содержимое между тегами Дополнительно секция категорий¶
Дополнительно секция подарков¶
Дополнительно секция акций¶
Пример одного товара подробнее¶
<offer id="123" type="vendor.model" available="true" bid="1" group_id="136010368">
<url>http://www.xxxxxx.ru/xxxx</url>
<price>1749.0000</price>
<currencyId>RUR</currencyId>
<caategoryId>490</categoryId>
<market_category>Дом и дача/Дом и интерьер/Текстиль/Шторы</market_category>
<picture>http://media.xxxxx.xx/products/641by641/13/60/10/XXXXXXXXXXXXXX.jpg</picture>
<delivery>true</delivery>
<local_delivery_cost>0</local_delivery_cost>
<typePrefix>Шторы, занавески</typePrefix>
<vendor>La Interieurs</vendor>
<vendorCode>136010368</vendorCode>
<model>Занавеска с вышивкой по низу</model>
<description>- Качество VALEUR SURE. Качественная отделка. Со сборкой 60 мм (3 варианта высоты). 91% полиэстера, 9% льна. Красивая вышивка по низу. Простои уход: стирка при 40°, не нужно гладить. Расстояние от отделки до низа 30 см (для размеров 240 и 260 см). Размер в см.</description>
<sales_notes>Минимальный заказ 1500 руб</sales_notes>
<manufacturer_warranty>true</manufacturer_warranty>
<param name="country_of_origin">Франция</param>
<param name="Пол">OTHER</param>
<param name="Возраст">OTHER</param>
<param name="Цвет">белый</param>
<param name="Размер" unit="FR">240 x 175 см</param>
</offer>
Пример структуры со всеми секциями¶
{
"299337" : {
"available" : "false",
"categoryId" : "40",
"currencyId" : "RUR",
"delivery" : "true",
"delivery-options" : {
"option" : {
"cost" : "0",
"days" : "32"
}
},
"description" : "\n",
"id" : "299337",
"manufacturer_warranty" : "true",
"model" : "Galaxy S10 8/128Gb",
"param" : {
"DiagonalEkrana" : "6.1ʺ",
"EmkostAkkumulyatora" : "3400мАч",
"KolichestvoYader" : "8",
"Razreshenie" : "Quad HD+",
"StandartySotovoySvyazi" : "LTE",
"Tip" : "Изогнутый с двух сторон",
"Tsvet" : "Аквамарин"
},
"pickup" : "false",
"picture" : "https://shop.mts.ru/upload/iblock/06a/s10green.jpg/resize/1500x1500/",
"price" : "68990",
"sales_notes" : "Кэшбэк 3500 через сервис МТС Cashback",
"store" : "false",
"type" : "vendor.model",
"typePrefix" : "Смартфон",
"url" : "https://shop.mts.ru/product/smartfon-samsung-g973-galaxy-s10-8-128gb-akvamarin",
"vendor" : "Samsung"
},
"CATEGORY" : {
"11" : {
"name" : "Смартфоны",
"parent" : null,
"partnum" : "11",
"url" : null
},
"40" : {
"name" : "Samsung",
"parent" : "11",
"partnum" : "40",
"url" : null
}
},
"GIFT" : {
"1234567" : {
"id" : "1234567",
"name" : "Samsung Galaxy Buds",
"picture" : "https://cdn1.savepice.ru/uploads/2019/2/22/1be40e49b646a53117e887a530419793-full.jpg"
}
},
"PROMO" : {
"03" : {
"description" : "Получи беспроводные наушники Galaxy Buds в подарок",
"end-date" : "2019-03-07 23:59:59",
"id" : "03",
"promo-gifts" : [
"1234567"
],
"purchase" : {
"product" : {
"299313" : 1,
"299319" : 1,
"299325" : 1,
"299331" : 1,
"299337" : 1,
"299343" : 1,
"299349" : 1,
"299355" : 1,
"299361" : 1,
"299367" : 1
},
"required-quantity" : "1"
},
"start-date" : "2018-02-21 00:00:00",
"type" : "gift with purchase"
}
}
}
Динамический контент¶
Описание динамического контента¶
Готовые страницы сайта¶
На странице можно дополнительно расставить метки фильтрации позволяющие указать только определённyю часть/части которую надо использовать в выпуске.
Такие части отмечаются в своём начале добавлением строки начинающейся с и в конце добавлением строки начинающейся с
В случае неудачи при получении страницы (не найдена, проблема связи и т.д.) выпуск не выйдет.
Лента Новостей¶
"Лента новостей" это набор от одного до бесконечности каналов новостей, сообщения из которых собираются и могут быть использованы для формирования индивидуальных писем или общих рассылок.
Один источник новостей может входить в несколько лент - фактически он опрашивается один раз в 1-2 часа и все найденные свежие новости собираются в базу и становятся независимо доступны во всех лента и использование определенной новости в одной из них никак не повлияет на ее состояние в другой ленте.
Одна и та же лента может использоваться в выпуске несколько раз. Например первый раз для формирования "меню" из списка заголовков новостей, а второй для вывода полной новости.
В выпуске может быть использовано несколько лент.
Лента хранит отметку времени последнего использования в рассылке и основываясь на нём система включает в письма только те новости, которые были получены после этой даты.
После формирования рассылки (или индивидуального письма) отметка времени у всех использованных в рассылке лент устанавливается в текущее время. Таким образом новости одной ленты уже использованные в рассылке повторно использованы не будут.
Старые новости регулярно удаляются из базы как только проходит 15 дней с момента получения новости.
Использование лент новостей в Индивидуальных письмах¶
Индивидуальные письма подписчикам формируются из новостей накопившихся в их личных лентах которые к подписчикам привязаны владельцем ПРО при их создании (lenta.set).
Письмо формируется по указанному в ленте расписанию с оформлением по указанному шаблону выпуска с использованием новостей накопившихся с прошлой рассылки.
Если свежих новостей нет, то письмо не высылается.
Это позволяет организовать индивидуальное оповещение клиентов персонализированными подборками информации. Например, организовать на сайт подписку на результаты поиска по каталогу товаром - пользователи будут автоматически получать обновления в интересующих их разделах.
Предоставляются простые базовые шаблоны которые можно модифицировать на свой вкус. Они доступны по адресуhttps://docs.sendsay.ru/proscript/rss
Использование лент новостей в рассылках¶
Для использовании в рассылке новостей одной или нескольких лент надо воспользоваться функциям шаблонизатора news_get() или lenta_get().
Функция news_get() не требует специальной обработки и результатом её работы становится содержимое полей "content" всех свежих новостей. Это упрощает работу с лентами если готового источника у вас ещё нет и вы можете легко формировать его как нравится. Или когда имеющийся источник выдаёт в "content" новости то, что надо для выпуска.
Функция lenta_get() только присваивает переменной lenta специальную структуру данных описывающую все свежие на данный момент новости и их источники. Для их отображение требуется использование в теле письма оператора [% FOREACH %] для обработки каждой новости. Это сложнее, но вы можете оформить вывод новостей самым гибким образом.
Обе функции могут работать как с заранее созданной лентой новостей (указывается её номер[% lenta_get(123) %]), так и напрямую с каналом новостей (указывается его url, не применимо к выпускам personal -[% lenta_get("http://test.ru/index.rss") %]).
При указании url механизм исключения уже использованных новостей не применим и в выпуск всегда попадают все новости канала имеющиеся в нём на момент выпуска.
Если свежих новостей нет ни в одной используемой в шаблоне ленте и новостей нет вообще ни в одном используемом в шаблоне источнике указанным напрямую, то выпуск рассылки не высылается.
Кроме периодического обновления новостей в всех настроенных лентах, система автоматически проверяет все источники используемых в рассылке лент непосредственно в момент выпуска. Но один источник проверяет не чаще чем раз в 15 минут.
По умолчанию новости отсортированы в порядке убывания и даты публикации. Задать свой порядок и группировку по источникам можно с помощью шаблонизатора - рассмотрите пример "Новости по источникам" по адресуhttps://docs.sendsay.ru/proscript/rss
Базовые шаблоны от индивидуальных писем применимы и тут - как отправная точка для кастомизации под ваши нужды.
Доступные источники новостей для лент новостей¶
-
RSS и Atom каналы- задаются обычной ссылкой (http,https,ftp,ftps)
-
Поиск по блогам Google- задаётся ссылкой вида search://gblogs/поисковый-запрос
-
Поиск по блогам Яндекс- задаётся ссылкой вида search://yblogs/поисковый-запрос
-
Поиск по Twitter- задаётся ссылкой вида search://tsearch/поисковый-запрос
-
LiveJournal пользователя- Лента записей пользователя задаётся ссылкой вида lj://user/ник-пользователя
-
LiveJournal сообщества- Лента записей сообщества задаётся ссылкой вида lj://user/ник-сообщества
-
Twitter- Лента записей пользователя задаётся ссылкой вида tw://id-пользователя
-
Facebook пользователя или сообщества- Лента записей пользователя или сообщества задаётся ссылкой вида fb://id-пользователя-или-сообщества
-
Facebook друзей пользователя- Лента записей друзей пользователя задаётся ссылкой вида fb://id-пользователя/friends
-
ВКонтакте пользователя или сообщества- Лента записей пользователя или сообщества задаётся ссылкой вида vk://id-пользователя-или-сообщества
-
ВКонтакте друзей пользователя- Лента записей друзей пользователя задаётся ссылкой вида vk://id-пользователя/friends
-
Я.Ру пользователя или сообщества- Лента записей пользователя или сообщества задаётся ссылкой вида ya://ник-пользователя-или-сообщества
-
Я.Ру друзей пользователя- Лента записей друзей пользователя задаётся ссылкой вида ya://ник-пользователя/friends
-
МойМир пользователя или сообщества- Лента записей пользователя или сообщества задаётся ссылкой вида mm://id-пользователя-или-сообщества
Структура переменной lenta¶
Структура данных ленты в индивидуальных письмах и после вызовов lenta_get() и news_get() содержит информацию о ленте новостей, всех источниках новостей новости которых попали в ленту и содержимое всех свежих новостей.
Лента новостей¶
"lenta" : {
"id" : id ленты в базе
,"name" : "название ленты"
-- описания всех источников ленты, чьи новости попали в письмо
,"sources" : {
id-источника : { описание источника }
,id-источника : { описание источника }
......
}
-- id источников упорядоченные так же как упорядочены новости
,"sources_order" : [ id-источника, id-источника .........]
-- описание новостей в заказанном порядке (по умолчанию по убыванию даты публикации новости)
,"news" : [
{ описание новости }
,{ описание новости }
,{ описание новости }
]
}
Описание одного источника¶
{
"id" : id источника в базе
-- индексы в lenta.news[] новостей именно этого источника в порядке совпадающем с порядком lenta.news[]
,"news" : [ индекс, индекс, индекс ....]
-- параметры источника как получены из описания RSS/Atom-канала при его последнем анализе
-- названия параметров совпадают с названиями тегов XML
,"title" : "название источника"
,"descr" : "описание источника"
,"link" : "ссылка на обычную версию источника"
,"logo" : "ссылка на логотип источника"
,"author" : "информация об авторе"
,"copyright" : "информация об авторских правах"
}
Описание одной новости¶
{
"ID" : id новости в базе
,"source" : "id в базе источника из которого получена новость. ключ в lenta.sources{}"
,"n" : "номер по порядку в lenta.news[]"
-- параметры новости как получены из описания RSS/Atom-канала при его последнем анализе
-- названия параметров в основном совпадают с названиями тегов XML
,"title" : "название источника",
,"content" : "содержимое новости" -- тег <description> или <yandex:full-text>
,"link" : "ссылка на обычную версию новости" -- тег <link>, если пусто и isPermaLink="true" и guid похож на урл, то guid
,"dt" : "YYYY-MM-DD hh:mm:ss" -- дата публикации новости (тег <pubDate> или <dc:creator>)
,"id" : "идентификатор новости" -- тег <guid>
,"author" : "информация об авторе новости"
,"category" : { -- категории новости
"домен" : {
"категория" : "метка"
,....
}
,...
}
,"enclosure" : [ -- приложения к новости на основании тегов <enclosure> и <media:thumbnail>
-- обычно так указывают картинки и звуковые файлы
{
"url" : "ссылка"
,"type" : "mime-type"
,"length" : "длина"
}
,....
]
-- дополнительные параметры, полученные из dt
,"ymd" : "YYYY-MM-DD"
,"hm" : "hh:mm"
}