Добрый день, Коллеги!
Допустим, есть задача, сформировать программное электронное письмо шаблон и в него вставлять какой-то свободно изменяемый текст в зависимости от ситуации а-ля официальный бланк на бумаге. Разберём на примере поздравления с новым годом наших горячо любимых клиентов! УРА! И сделаем мы это без помощи дизайнеров и верстальщиков! УРА!
1. Создаем шаблон HTML в виде строкового типа 1С
Допустим, у вас есть некий официальный или фирменный бланк в WORD (не реклама).
А если нет, то вы я думаю, легко его сможете в том же WORD создать. Для примера я создал:
Понял, что меня устраивает такой дизайн, делаю его пригодным для внутрипрограммного «парсинга». Т.е. раставляю метки, которые позже буду использовать.
Для себя нашел самый простой способ конвертировать его в HTML в том же WORDе. Просто сохраняем его в HTML и открываем с помощью браузера CHROME (не реклама).
А затем подготавливаем небольшую обработку. Чтобы легко и быстро конвертировать код HTML в строку 1С. Может можно иначе, но я решил так.
Создал внешнею обработку, на форме два реквизита оба строковые «Исходный» и «Конвертированный», одна команда «Конвертировать».
Код команды "Конвертировать":
&НаКлиенте
Процедура Конвертировать(Команда)
БуферКод = СтрЗаменить(Исходный,Символы.ПС,Символы.ПС + "|");
БуферКод = СтрЗаменить(БуферКод,"""","""""");
Конвертированный = БуферКод;
КонецПроцедуры
Теперь мы готовы и возвращаемся в CHROME к нашей заготовке. Правой кнопкой по самому полю страницы вызываем контекстное меню и выбираем пункт «Просмотреть код страницы».
Копируем его весь, не парьтесь вы же ни верстальщик и ни дизайнер, по этому просто пока бездумно всё забираем (но конечно можете блеснуть знанием HTML и сверстать так как вам угодно, но мне это не интересно пока), вставляем в нашу свежеиспеченную обработку и конвертируем 😉
Всё текст готов для вставки в код.
2. Создаем рассыльщик с поддержкой HTML
Теперь займёмся написанием процедуры отправки почты. В примере создадим обработку, через которую будет производиться отправка почты.
Реквизиты все строкового типа: Адреса, Должность, ЗаголовокПисьма, Подпись, ТекстПисьма, ТемаПисьма и ФИО.
Обработка готова, теперь нам нужно написать типовой код подключения к почте и отправке письма. В качестве электронной почты, с которой будет производиться рассылка, выступит YANDEX.RU (не реклама).
&НаКлиенте
Процедура ОтправитьПочту(Команда)
ТекстДляОтправки = СформироватьТекстПисьма();
//Настройки почты
АдресСервераSMTP = "smtp.yandex.ru";
ПортSMTP = "465";
Email = "ВАШАПОЧТА@yandex.ru";
Пароль = "ВАШПАРОЛЬ!!!";
//Создаем профиль подключения
//Тестировал, этого достаточно для работы с YANDEX.RU
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = АдресСервераSMTP;
Профиль.ПортSMTP = ПортSMTP;
Профиль.ПользовательSMTP = Email;
Профиль.ПарольSMTP = Пароль;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
Профиль.ИспользоватьSSLSMTP = Истина;
//Можно так определиться в каком форма слать письмо, мы конечно выберем HTML
HTML = ИСТИНА;
ТипТекста = ?(HTML,ТипТекстаПочтовогоСообщения.HTML,ТипТекстаПочтовогоСообщения.ПростойТекст);
//Создаем письмо
ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;
ПочтовоеСообщение.Тема = ТемаПисьма;
ПочтовоеСообщение.ИмяОтправителя="Дед Мороз";
ПочтовоеСообщение.Отправитель = Email;
АдресаСписком = СтрЗаменить(СокрЛП(Адреса),",",Символы.ПС);
//Участок кода ответственный за массовую рассылку.
//Если все адреса ввести через запятую!
//Есть минус, все получатели увидят других получателей.
//Если не хотите чтобы получатели видели весь список,
//отправляйте каждому индивидуально много раз вызывая данную процедуру.
Для Индекс = 1 По СтрЧислоСтрок(АдресаСписком) Цикл
ТекущийАдрес = СтрПолучитьСтроку(АдресаСписком, Индекс);
ПочтовоеСообщение.Получатели.Добавить(СокрЛП(ТекущийАдрес));
КонецЦикла;
ПочтовоеСообщение.Тексты.Добавить(ТекстДляОтправки,ТипТекста);
ПочтовоеСообщение.ОбработатьТексты();
Почта = Новый ИнтернетПочта;
//Подключаемся к почте
Попытка
Почта.Подключиться(Профиль);
ОшибкаПодключения = "";
Исключение
ОшибкаПодключения = ОписаниеОшибки();
КонецПопытки;
//Отправляем письмо
Попытка
Почта.Послать(ПочтовоеСообщение);
ОшибкаПриОтправке = "";
Исключение
ОшибкаПриОтправке = ОписаниеОшибки();
//Сообщить(ОшибкаПриОтправке);
КонецПопытки;
//Ведём лог при необходимости
Если ЛОЖЬ
ИЛИ ОшибкаПодключения <> ""
ИЛИ ОшибкаПриОтправке <> ""
Тогда
//Тут вы можете вести лог или отправлять себе почту, об нежданчиках
КонецЕсли;
//Закрываем письмо
Почта.Отключиться();
КонецПроцедуры
После проверки кода, конфигуратор выдаст ошибку: «Процедура или функция с указанным именем не определена (СформироватьТекстПисьма)». Вот и переходим к конечному пункту формированию самого письма.
Создаем новую функцию и одну текстовую переменную в ней для начала «Шаблон», которой присваиваем заранее скопированный из буфера конвертированной в обработке созданной нами выше текст, просто не задумывая с набор этих букв.
&НаКлиенте
Функция СформироватьТекстПисьма()
Шаблон = "
|<html>
|
|<head>
|<meta http-equiv=Content-Type content=""text/html; charset=windows-1251"">
|<meta name=Generator content=""Microsoft Word 14 (filtered)"">
|<style>
|<!--
| /* Font Definitions */
| @font-face
| {font-family:Calibri;
| panose-1:2 15 5 2 2 2 4 3 2 4;}
|@font-face
| {font-family:Tahoma;
| panose-1:2 11 6 4 3 5 4 4 2 4;}
| /* Style Definitions */
| p.MsoNormal, li.MsoNormal, div.MsoNormal
| {margin-top:0cm;
| margin-right:0cm;
| margin-bottom:10.0pt;
| margin-left:0cm;
| line-height:115%;
| font-size:11.0pt;
| font-family:""Calibri"",""sans-serif"";}
|p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
| {mso-style-link:""Текст выноски Знак"";
| margin:0cm;
| margin-bottom:.0001pt;
| font-size:8.0pt;
| font-family:""Tahoma"",""sans-serif"";}
|span.a
| {mso-style-name:""Текст выноски Знак"";
| mso-style-link:""Текст выноски"";
| font-family:""Tahoma"",""sans-serif"";}
|.MsoPapDefault
| {margin-bottom:10.0pt;
| line-height:115%;}
|@page WordSection1
| {size:595.3pt 841.9pt;
| margin:2.0cm 42.5pt 2.0cm 3.0cm;}
|div.WordSection1
| {page:WordSection1;}
|-->
|</style>
|
|</head>
|
|<body lang=RU>
|
|<div class=WordSection1>
|
|<table class=MsoTableGrid border=0 cellspacing=0 cellpadding=0 width=""100%""
| style='width:100.0%;border-collapse:collapse;border:none'>
| <tr>
| <td width=""36%"" valign=top style='width:36.68%;border:none;border-right:solid windowtext 1.0pt;
| padding:0cm 5.4pt 0cm 5.4pt'>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'><img width=216 height=43 id=""Рисунок 1""
| src=""Информационно1.files/image001.png""></p>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'> </p>
| <p class=MsoNormal align=center style='margin-bottom:0cm;margin-bottom:.0001pt;
| text-align:center;line-height:normal'><span style='font-size:9.0pt'>Информационно-аналитический
| центр по автоматизации учета и управления</span></p>
| </td>
| <td width=""63%"" valign=top style='width:63.32%;border:none;padding:0cm 5.4pt 0cm 5.4pt'>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'>Инфостарт — информационно-аналитический центр по автоматизации учета
| и управления на 1С 7.7, 1С 8.0, 1С 8.1, 1С 8.2, 1С 8.3.</p>
| </td>
| </tr>
|</table>
|
|<p class=MsoNormal> </p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>Должность</p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>ФИО</p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>ТекущаяДата</p>
|
|<p class=MsoNormal> </p>
|
|<p class=MsoNormal align=center style='text-align:center'><span
|style='font-size:20.0pt;line-height:115%'>ЗаголовокПисьма</span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'>ТекстПисьма</span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'> </span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'>Подпись</span></p>
|
|</div>
|
|</body>
|
|</html>
|";
КонецФункции
Нужно главное не забыть! Что у нас есть картинка, и её придётся ручками под редактировать в коде… Сейчас путь указан «src=""Информационно1.files/image001.png""». Где это 1С не поймёт, по этому я создал папочку и положил картинку в неё и разместил все для примера на диске С.
Получил новый путь и вставлю его в тег SRC. Выходит «src="" C:publiclogo.jpg""».
ВНИМАНИЕ! Если папка шара, то путь указывается с одним слешем типа «src="" 192.168.1.1.Bidkotovlogo.jpg», 1С и это съест нормально. Почему один не знаю, но так работает у меня проверено 😉
Вот теперь после присвоения переменной «Шаблон», будем её изменять и редактировать программно всего одной функцией СтрЗаменить и идти к успеху! Вы же помните наши метки, по ним и будем ориентироваться. Готовая функция:
&НаКлиенте
Функция СформироватьТекстПисьма()
Шаблон = "
|<html>
|
|<head>
|<meta http-equiv=Content-Type content=""text/html; charset=windows-1251"">
|<meta name=Generator content=""Microsoft Word 14 (filtered)"">
|<style>
|<!--
| /* Font Definitions */
| @font-face
| {font-family:Calibri;
| panose-1:2 15 5 2 2 2 4 3 2 4;}
|@font-face
| {font-family:Tahoma;
| panose-1:2 11 6 4 3 5 4 4 2 4;}
| /* Style Definitions */
| p.MsoNormal, li.MsoNormal, div.MsoNormal
| {margin-top:0cm;
| margin-right:0cm;
| margin-bottom:10.0pt;
| margin-left:0cm;
| line-height:115%;
| font-size:11.0pt;
| font-family:""Calibri"",""sans-serif"";}
|p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
| {mso-style-link:""Текст выноски Знак"";
| margin:0cm;
| margin-bottom:.0001pt;
| font-size:8.0pt;
| font-family:""Tahoma"",""sans-serif"";}
|span.a
| {mso-style-name:""Текст выноски Знак"";
| mso-style-link:""Текст выноски"";
| font-family:""Tahoma"",""sans-serif"";}
|.MsoPapDefault
| {margin-bottom:10.0pt;
| line-height:115%;}
|@page WordSection1
| {size:595.3pt 841.9pt;
| margin:2.0cm 42.5pt 2.0cm 3.0cm;}
|div.WordSection1
| {page:WordSection1;}
|-->
|</style>
|
|</head>
|
|<body lang=RU>
|
|<div class=WordSection1>
|
|<table class=MsoTableGrid border=0 cellspacing=0 cellpadding=0 width=""100%""
| style='width:100.0%;border-collapse:collapse;border:none'>
| <tr>
| <td width=""36%"" valign=top style='width:36.68%;border:none;border-right:solid windowtext 1.0pt;
| padding:0cm 5.4pt 0cm 5.4pt'>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'><img width=216 height=43 id=""Рисунок 1""
//КАРТИНКА КОТОРАЯ ТРЕБУЕТ ЗАМЕНЫ НА РЕАЛЬНО СУЩЕСТВУЮЩИЮ У ВАС
| src=""C:publiclogo.jpg""></p>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'> </p>
| <p class=MsoNormal align=center style='margin-bottom:0cm;margin-bottom:.0001pt;
| text-align:center;line-height:normal'><span style='font-size:9.0pt'>Информационно-аналитический
| центр по автоматизации учета и управления</span></p>
| </td>
| <td width=""63%"" valign=top style='width:63.32%;border:none;padding:0cm 5.4pt 0cm 5.4pt'>
| <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
| normal'>Инфостарт — информационно-аналитический центр по автоматизации учета
| и управления на 1С 7.7, 1С 8.0, 1С 8.1, 1С 8.2, 1С 8.3.</p>
| </td>
| </tr>
|</table>
|
|<p class=MsoNormal> </p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>Должность</p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>ФИО</p>
|
|<p class=MsoNormal style='margin-left:304.8pt'>ТекущаяДата</p>
|
|<p class=MsoNormal> </p>
|
|<p class=MsoNormal align=center style='text-align:center'><span
|style='font-size:20.0pt;line-height:115%'>ЗаголовокПисьма</span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'>ТекстПисьма</span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'> </span></p>
|
|<p class=MsoNormal><span style='font-size:14.0pt;line-height:115%'>Подпись</span></p>
|
|</div>
|
|</body>
|
|</html>
|";
ПисьмоДляОтправки = СтрЗаменить(Шаблон,"Должность",Должность);
ПисьмоДляОтправки = СтрЗаменить(ПисьмоДляОтправки,"ФИО",ФИО);
ПисьмоДляОтправки = СтрЗаменить(ПисьмоДляОтправки,"ТекущаяДата",Формат(ТекущаяДата(),"ДЛФ=Д"));
ПисьмоДляОтправки = СтрЗаменить(ПисьмоДляОтправки,"ЗаголовокПисьма",ЗаголовокПисьма);
ПисьмоДляОтправки = СтрЗаменить(ПисьмоДляОтправки,"ТекстПисьма",ТекстПисьма);
ПисьмоДляОтправки = СтрЗаменить(ПисьмоДляОтправки,"Подпись",Подпись);
Возврат ПисьмоДляОтправки;
КонецФункции
3. Проверка работы
Запускаем обработку, заполняем данными и отправляем поздравительный спам 🙂
Результат проверил на разных почтовых сервисах, программах и устройствах:
А вот в мобильной версии из меня не удачный верстальщик 😉
По этому смотрите сами, корректируйте и выстраивайте шаблон так в WORDе, чтобы он читабелен был везде 😉
Резюме
Мы имеем возможность создать свой универсальный шаблон, в который можно выводить отчет, вставлять разные картинки от ситуации, конечно потребуется минимальное понимание HTML (для динамического формирования таблицы и её заполнения), но это позволит создавать рассылку или уведомления более привлекательными. А это хороший шаг в Email-маркетинге иметь привлекательное письмо.
Можно развить шаблон до формата редактирования его прямо в 1С используя одну из многочисленных обработок:
//infostart.ru/public/all/?st=t&public-filter%5Bsearch%5D=%F0%E5%E4%E0%EA%F2%EE%F0+HTML
Но лично мне удобнее и проще показалось создать шаблон в ворде, чем ковыряться в html-редакторе.
Удачного кодинга! С наступающим Новым Годом!
ПС (добавим таблицу значений в официальное письмо):
Хочется отметить, что данная работа развилась в желание отправлять отчетность прямо в теле письма, по этому нужен был простой и удобный механизм трансформации таблицы значений в строковый тип 1С содержащий таблицу HTML. Вот тут вам и поможет моя функция в открытом доступе — //infostart.ru/public/717412/ функции можно передать структуру параметров, в которой указать ряду колонок своё выравнивание, задать цвет шапки, свои размеры колонкам, переименовать заголовки колонок, а так же вывести зачастую необходимый пункт по порядку. Т.е. выгружаем запрос в таблицу значений, передаем таблицу значений в функцию и получаем результат вставив строку в тело официального письма:
Лайк новогоднему спамеру!
(1) email-marketing
картинку можно в base64 запихнуть, чтоб вложением не потерялась
(3) хм, проверю спасибо)
Не знаю как маркетологам, а вот кадровикам пригодится, для рассылки резюме. Попробую.
За описание того, как сформировать красиво сверстанное письмо конечно +,
но для «маркетинга» рассылки из 1С не годны от слова совсем. Максимум транзакционные письма в небольшой количестве.
Обратная связь? Как узнать, что письмо доставлено? Если не доставлено то почему? Прочитано? По ссылкам переходили? А если клиент отписаться захотел?
Если отправлять письма в слепую, то мало того, что результатов скорее всего не будет, так еще и в спам ваш ящик быстро улетит.
(6) вы наверное вплотную с маркетингом связаны)) не претендую на полноценный механизм охвата новых клиентов) но при желание все ваши вопросы можно реализовать 😉
Но одними средствами 1с всего не добиться.
Так же вариант отправки поздравления, уведомление об отгрузке, счетов и т.п. почему бы и нет, если другого не чего нет..
Автор не знает про наличие в 1С «Поле форматированного документа» )))
И то что там визуальный редактор позволяет сделать практически все.
Просто ноль строк кода в 1С
А «Скрытая копия» для кого вообще?
(10) спасибо, учту
(9) вариант, но моя цель официальный бланк и программное формирование, интерфейс это уже для наглядности примере.
(8) удобнее?)
(6) Можно добавить снизу ссылочки с Get параметрами на http сервис 1с.
Вот тебе и отписаться и подписаться и провести документы и пятое и десятое.
Все средствами 1ass.
(14) Отличная, знаете ли, идея, публиковать на внешку сервисы 1С.
Я вопросы обозначил не потому, что их нельзя решить средствами платформы. Можно конечно. Но серьезному разработчику очевидно должно быть, что если речь идет об отправке разовых писем — это одна задача, которую целесообразно решить средствами платформы.
А если речь о массовой рассылке (как обозначено в публикации), и уж тем более о маркетинговых рассылках, то тратить время на придумывание «костылей» совершенно глупо. Есть куча специализированных сервисов, которые за копейки решают такие задачи. И с учетной системой они интегрируются проще некуда.
(8) если б еще css-редактор был и режим разделения (визуальный/html) как в древнем dreamweaver ….
(10) ухахаах в 1С нет «Скрытая копия»!))) Есть «СлепыеКопии» что-то меня это бурно рассмешило, так реально ведь во всех почтовиках это именно «Скрытая копия».
(15)
1) не вижу серьезной уязвимости в публикации http сервиса, тем паче доступ к нему может быть и через l2tp ipsec, да и сервис можно легче легкого, скажем, на питоне поднять.
2) рассылка это не ресурсоемкая задача в реалиях современного железа, явно не стоит того, чтоб усложнять существующую экосистему
3) гораздо более трудоемко запилить интеграцию с сервисом, отдавая туда данные и пользователей
(18)
1. Вы предлагали добавить ссылку в письму на http сервис 1С (чтобы у получателя была возможность отписаться от рассылок). Очевидно он должен быть доступен напрямую из вне. О каком ipsec тут может идти речь? С Python аналогично, вы про него ничего не говорили.
Говорить что там легче легкого явно не стоит (не все такие как вы). Тут на ресурсе 99% статей дальше hello world не уходят, и даже OneScript с экосистемой появился из-за того, что «обычный программист 1С» не в состоянии разобраться с чем-то еще.
2. Дело не в ресурсоемкости. У вас опыт решения подобных задач есть? Чтобы сотни тысяч писем в месяц (и я не про спам, а нормальная тергет рассылка)? Там есть куча нюансов, начиная от банальной настройки домена (про spf многие и не слышали), заканчивая нюансами работы почтовых серверов. Как я уже говорил ранее: разослать письма «в никуда» без обратной связи, это почти гарантированное попадание в спам лист.
3. Если делать на серьезном уровне, то интеграция с сервисом куда проще (почти всегда элементарный REST), чем решение всех проблем самому. Или вы думаете крупные компании просто так пользуются услугами mailchimp, mailgun и т.д.?
(9) Вставьте таблицу теперь с «ноль строк кода» )))
И еще всякие подписи/тексты и ссылки.
Желательно вперемешку ))))
(17) В 1С весьма много забавных переводов. BCC — blind carbon copy, перевели дословно, не посмотрев на переводы в почтовых клиентах.
А уж что говорить о переводах наименований объектов на английский?
(21) Надмозг 😀
Поместить шаблон HTML в макет — не вариант? Тогда бы не понадобилось делать конвертацию в код 1С…
Сохранение вордовского документа в HTML…фейспалм