При автоматизации отправки почтовых сообщений из 1С:Предприятия 7.7 с помощью популярной внешней компоненты DialMail разработчики часто сталкиваются с ситуацией, когда текст письма, содержащий несколько абзацев, отображается у получателя одной сплошной строкой. Стандартные разделители 1С, такие как системная переменная РазделительСтрок, символ Симв(10) или знак вертикальной черты |, в теле письма игнорируются и не переносят текст на новую строку.
Разберем причины такого поведения компоненты и рассмотрим практические варианты решения этой задачи.
Выясним причину, из-за которой почтовые клиенты игнорируют стандартные разделители строк:
text/html, почтовые программы интерпретируют любые служебные символы перевода строки и возврата каретки (CRLF, LF) как обычные пробелы. Чтобы отобразить перенос в HTML-разметке, требуются специальные теги.Симв(13) + Симв(10) (CRLF). Если передать только Симв(10), некоторые клиенты не смогут распознать его как корректный конец строки.Проанализируем самый распространенный вариант. Если письмо отправляется в формате HTML, для разделения строк необходимо использовать соответствующий тег разметки <br>.
Посмотрим на пример формирования текста письма вручную:
ТекстПисьма = "Здравствуйте!" + "<br><br>" +
"Направляем вам акт сверки взаиморасчетов." + "<br>" +
"Просим подписать и отправить ответным письмом." + "<br><br>" +
"С уважением, отдел бухгалтерии.";
ОтправкаПочты.ТелоПисьма = ТекстПисьма;
Часто текст сообщения генерируется динамически или передается из многострочных текстовых полей диалога 1С 7.7. В таких строках разделителем служит системная переменная РазделительСтрок. Чтобы не переписывать логику формирования текста, применим функцию СтрЗаменить().
Разберем по шагам, как выполнить преобразование текста перед передачей в объект отправки:
// Исходный многострочный текст из 1С
ТекстСообщения = "Первая строка сообщения" + РазделительСтрок + "Вторая строка сообщения";
// Преобразуем стандартные переносы в HTML-теги
ТекстПисьма = СтрЗаменить(ТекстСообщения, РазделительСтрок, "<br>");
// Передаем подготовленный текст в компоненту
ОтправкаПочты.ТелоПисьма = ТекстПисьма;
Если требуется передать форматированный текст со всеми отступами, пробелами и стандартными переводами строк без ручной расстановки тегов <br>, обернем текст в HTML-тег <pre>.
Посмотрим на реализацию:
ТекстПисьма = "<pre>" + ТекстСПереносами + "</pre>";
ОтправкаПочты.ТелоПисьма = ТекстПисьма;
Внутри блока <pre> почтовые клиенты и браузеры сохраняют исходную структуру текста, включая все символы РазделительСтрок.
Если оформление в виде HTML не требуется, переключим режим тела письма в объекте компоненты DialMail на простой текст. Для этого установим свойство ТипТелаПисьма:
0 — простой текст (text/plain);1 — HTML-документ (text/html).Рассмотрим пример кода для отправки обычного текстового сообщения с корректной последовательностью символов CRLF:
// Устанавливаем режим обычного текста
ОтправкаПочты.ТипТелаПисьма = 0;
// Формируем текст с явным указанием возврата каретки и перевода строки
CRLF = Симв(13) + Симв(10);
ТекстПисьма = "Первая строка" + CRLF + "Вторая строка";
ОтправкаПочты.ТелоПисьма = ТекстПисьма;
В режиме простого текста стандартные разделители строк 1С обрабатываются почтовыми серверами без необходимости добавления HTML-тегов.
Если использование сторонних DLL вызывает сложности с совместимостью на современных версиях Windows, рассмотрим штатный системный COM-объект Windows — CDO.Message. Он позволяет четко разделить отправку простого текста и HTML с помощью свойств TextBody и HTMLBody:
Почта = СоздатьОбъект("CDO.Message");
Почта.From = "sender@company.ru";
Почта.To = "client@domain.ru";
Почта.Subject = "Тема сообщения";
// Для простого текста с переносами строк:
Почта.TextBody = "Строка 1" + РазделительСтрок + "Строка 2";
// Или для HTML-письма:
// Почта.HTMLBody = "<html><body>Строка 1<br>Строка 2</body></html>";
// Настройка параметров SMTP и отправка
Почта.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;
Почта.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "smtp.company.ru";
Почта.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 25;
Почта.Configuration.Fields.Update();
Почта.Send();
Резюме: При работе с компонентой DialMail по умолчанию используется режим HTML. Чтобы текст не склеивался, заменяйте разделители строк на тег <br>, оборачивайте текст в <pre> или явно переключайте свойство ТипТелаПисьма = 0 при отправке обычного текста.