Массовая рассылка писем с HTML. Отправить письмо или почту через 1С с картинками, изображениями, таблицами и прочим














Если вам необходимо создать красивое письмо и отправить его средствами 1С, вам поможет эта статья.

 

Добрый день, Коллеги!

Допустим, есть задача, сформировать программное электронное письмо шаблон и в него вставлять какой-то свободно изменяемый текст в зависимости от ситуации а-ля официальный бланк на бумаге. Разберём на примере поздравления с новым годом наших горячо любимых клиентов! УРА! И сделаем мы это без помощи дизайнеров и верстальщиков! УРА!

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'>&nbsp;</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>&nbsp;</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>&nbsp;</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%'>&nbsp;</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'>&nbsp;</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>&nbsp;</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>&nbsp;</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%'>&nbsp;</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/ функции можно передать структуру параметров, в которой указать ряду колонок своё выравнивание, задать цвет шапки, свои размеры колонкам, переименовать заголовки колонок, а так же вывести зачастую необходимый пункт по порядку. Т.е. выгружаем запрос в таблицу значений, передаем таблицу значений в функцию и получаем результат вставив строку в тело официального письма:

 

24 Comments

  1. smirnov.es

    Лайк новогоднему спамеру!

    Reply
  2. rpgshnik

    (1) email-marketing

    Reply
  3. vano-ekt

    картинку можно в base64 запихнуть, чтоб вложением не потерялась

    <img src=»data:image/png;base64,………………»>
    Reply
  4. rpgshnik

    (3) хм, проверю спасибо)

    Reply
  5. artem_kray

    Не знаю как маркетологам, а вот кадровикам пригодится, для рассылки резюме. Попробую.

    Reply
  6. Infactum

    За описание того, как сформировать красиво сверстанное письмо конечно +,

    но для «маркетинга» рассылки из 1С не годны от слова совсем. Максимум транзакционные письма в небольшой количестве.

    Обратная связь? Как узнать, что письмо доставлено? Если не доставлено то почему? Прочитано? По ссылкам переходили? А если клиент отписаться захотел?

    Если отправлять письма в слепую, то мало того, что результатов скорее всего не будет, так еще и в спам ваш ящик быстро улетит.

    Reply
  7. rpgshnik

    (6) вы наверное вплотную с маркетингом связаны)) не претендую на полноценный механизм охвата новых клиентов) но при желание все ваши вопросы можно реализовать 😉

    Но одними средствами 1с всего не добиться.

    Так же вариант отправки поздравления, уведомление об отгрузке, счетов и т.п. почему бы и нет, если другого не чего нет..

    Reply
  8. forbs343

    Автор не знает про наличие в 1С «Поле форматированного документа» )))

    И то что там визуальный редактор позволяет сделать практически все.

    Reply
  9. forbs343

    Просто ноль строк кода в 1С

    Reply
  10. promogiantworm
    //Если все адреса ввести через запятую!
    //Есть минус, все получатели увидят других получателей.
    //Если не хотите чтобы получатели видели весь список,
    //отправляйте каждому индивидуально много раз вызывая данную процедуру.

    А «Скрытая копия» для кого вообще?

    Reply
  11. rpgshnik

    (10) спасибо, учту

    Reply
  12. rpgshnik

    (9) вариант, но моя цель официальный бланк и программное формирование, интерфейс это уже для наглядности примере.

    Reply
  13. rpgshnik

    (8) удобнее?)

    Reply
  14. 🅵🅾️🆇

    (6) Можно добавить снизу ссылочки с Get параметрами на http сервис 1с.

    Вот тебе и отписаться и подписаться и провести документы и пятое и десятое.

    Все средствами 1ass.

    Reply
  15. Infactum

    (14) Отличная, знаете ли, идея, публиковать на внешку сервисы 1С.

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

    А если речь о массовой рассылке (как обозначено в публикации), и уж тем более о маркетинговых рассылках, то тратить время на придумывание «костылей» совершенно глупо. Есть куча специализированных сервисов, которые за копейки решают такие задачи. И с учетной системой они интегрируются проще некуда.

    Reply
  16. vano-ekt

    (8) если б еще css-редактор был и режим разделения (визуальный/html) как в древнем dreamweaver ….

    Reply
  17. rpgshnik

    (10) ухахаах в 1С нет «Скрытая копия»!))) Есть «СлепыеКопии» что-то меня это бурно рассмешило, так реально ведь во всех почтовиках это именно «Скрытая копия».

    Reply
  18. 🅵🅾️🆇

    (15)

    1) не вижу серьезной уязвимости в публикации http сервиса, тем паче доступ к нему может быть и через l2tp ipsec, да и сервис можно легче легкого, скажем, на питоне поднять.

    2) рассылка это не ресурсоемкая задача в реалиях современного железа, явно не стоит того, чтоб усложнять существующую экосистему

    3) гораздо более трудоемко запилить интеграцию с сервисом, отдавая туда данные и пользователей

    Reply
  19. Infactum

    (18)

    1. Вы предлагали добавить ссылку в письму на http сервис 1С (чтобы у получателя была возможность отписаться от рассылок). Очевидно он должен быть доступен напрямую из вне. О каком ipsec тут может идти речь? С Python аналогично, вы про него ничего не говорили.

    Говорить что там легче легкого явно не стоит (не все такие как вы). Тут на ресурсе 99% статей дальше hello world не уходят, и даже OneScript с экосистемой появился из-за того, что «обычный программист 1С» не в состоянии разобраться с чем-то еще.

    2. Дело не в ресурсоемкости. У вас опыт решения подобных задач есть? Чтобы сотни тысяч писем в месяц (и я не про спам, а нормальная тергет рассылка)? Там есть куча нюансов, начиная от банальной настройки домена (про spf многие и не слышали), заканчивая нюансами работы почтовых серверов. Как я уже говорил ранее: разослать письма «в никуда» без обратной связи, это почти гарантированное попадание в спам лист.

    3. Если делать на серьезном уровне, то интеграция с сервисом куда проще (почти всегда элементарный REST), чем решение всех проблем самому. Или вы думаете крупные компании просто так пользуются услугами mailchimp, mailgun и т.д.?

    Reply
  20. androgin

    (9) Вставьте таблицу теперь с «ноль строк кода» )))

    И еще всякие подписи/тексты и ссылки.

    Желательно вперемешку ))))

    Reply
  21. nickpugachev

    (17) В 1С весьма много забавных переводов. BCC — blind carbon copy, перевели дословно, не посмотрев на переводы в почтовых клиентах.

    А уж что говорить о переводах наименований объектов на английский?

    Reply
  22. vano-ekt

    (21) Надмозг 😀

    Reply
  23. DrAku1a

    Поместить шаблон HTML в макет — не вариант? Тогда бы не понадобилось делать конвертацию в код 1С…

    Reply
  24. fishca

    Сохранение вордовского документа в HTML…фейспалм

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *