Отправка почты с использованием основного почтового клиента ОС (продолжение)

27.03.13

Интеграция - Email рассылки

В публикации описан фрагмент кода, позволяющий отправлять печатные формы с помощью почтового клиента операционной системы. Дальнейшее развитие публикации http://infostart.ru/public/91206/
Добавлено: 1. Поддержка Mozilla Thunderbird.
2. Автоподстановка адресата письма.

Ознакомился с публикацией //infostart.ru/public/91206/ уважаемого Администратора1С (//infostart.ru/profile/138784/), решил улучшить.

После доработки появилась возможность отправлять сообщения при установленном в системе Mozilla Thunderbird и отпала необходимость вручную указывать адресата - адрес используется из профиля контрагента.

Ниже приведены изменения в конфигурации. Тестировалось для 8.2 КА, редакция 1.1 (1.1.31.1).

1. Включить в Конфигураторе возможность изменений (конфигурация - поддержка- настройка поддержки).

2. Добавить общий модуль "_управлениеПочтой", в него скопировать процедуры: "ОтправитьПечатнуюФормуВнешнимТранспортом" и "КорректировкаНаименования" и "Получить получателей2" (приведены ниже см. п. 4).

3. В общем модуле "УправлениеОтчетами" отредактировать процедуру "ОтправитьДокументПоЭлектроннойПочте", закомментировав сообщение и добавив вызов нашей процедуры "ОтправитьПечатнуюФормуВнешнимТранспортом". Редактируемый фрагмент этой процедуры:

    

Если НЕ Константы.ИспользованиеВстроенногоПочтовогоКлиента.Получить() Тогда
        //ОбщегоНазначения.СообщитьОбОшибке("Отправлять документы по электронной почте можно только из встроенного почтового клиента.
        //|В настоящее время в настройках параметров учета установлено использование основного почтового клиента операционной системы.");
        //#Если Клиент Тогда
        //    Предупреждение("Операция не выполнена");
        //#Иначе
        //    Сообщить("Операция не выполнена");
        //#КонецЕсли
        //
        // Начало изменений программиста 19.07.2012г.
        //
        // Получаем список адресатов письма
        //
        СписокПолучателей = Новый СписокЗначений();
        Если ЗначениеЗаполнено(ОбъектПечати) Тогда
            Если ТипЗнч(ОбъектПечати) = Тип("СписокЗначений") Тогда
                Для Каждого ОбъектПечатиЭлементСписка Из ОбъектПечати Цикл
                    Если ЗначениеЗаполнено(ОбъектПечатиЭлементСписка.Значение) Тогда
                        _управлениеПочтой.ПолучитьПолучателей2(ОбъектПечатиЭлементСписка.Значение, СписокПолучателей);
                    КонецЕсли;
                КонецЦикла;
            Иначе
                _управлениеПочтой.ПолучитьПолучателей2(ОбъектПечати, СписокПолучателей);
            КонецЕсли;
            Если СписокПолучателей.Количество() > 0.00 Тогда
                
                Запрос = Новый Запрос();
                Запрос.Текст = "
                |ВЫБРАТЬ РАЗРЕШЕННЫЕ
                |    КонтактнаяИнформация.Объект КАК Объект,
                |    КонтактнаяИнформация.Объект.Наименование КАК НаименованиеОбъекта,
                |    КонтактнаяИнформация.Вид КАК Вид,
                |    КонтактнаяИнформация.Представление КАК Представление,
                |    КонтактнаяИнформация.ЗначениеПоУмолчанию КАК ЗначениеПоУмолчанию
                |ИЗ
                |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
                |ГДЕ
                |    КонтактнаяИнформация.Объект В (&СписокПолучателей)
                |    И КонтактнаяИнформация.Тип = &Тип
                |
                |УПОРЯДОЧИТЬ ПО
                |    КонтактнаяИнформация.Объект,
                |    ЗначениеПоУмолчанию УБЫВ
                |ИТОГИ ПО
                |    Объект
                |";
                
                Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
                Запрос.УстановитьПараметр("СписокПолучателей", СписокПолучателей);
                ВыборкаОбъектыПолучатели = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                СписокПолучателей.Очистить();
                Пока ВыборкаОбъектыПолучатели.Следующий() Цикл
                    ВыборкаЭлАдресПолучателя = ВыборкаОбъектыПолучатели.Выбрать();
                    Если ВыборкаЭлАдресПолучателя.Следующий() Тогда
                        СписокПолучателей.Добавить(ВыборкаЭлАдресПолучателя.Представление, ВыборкаЭлАдресПолучателя.НаименованиеОбъекта);
                    КонецЕсли;
                КонецЦикла;
            Иначе
                СписокПолучателей.Очистить();
            КонецЕсли;
        КонецЕсли;
        //
        // Приводим список адресатов письма к формату "Строка"
        // 
        Если    ТипЗнч(СписокПолучателей) = Тип("СписокЗначений") Тогда
            ПочтовыйАдресПолучателя = "";
            Для Каждого ЭлементПочтовыйАдрес Из СписокПолучателей Цикл
                Если ЗначениеЗаполнено(ЭлементПочтовыйАдрес.Представление) тогда
                    ПочтовыйАдресПолучателя = ПочтовыйАдресПолучателя
                                            + ЭлементПочтовыйАдрес.Представление
                                            + " <"
                                            + ЭлементПочтовыйАдрес.Значение
                                            + ">; "
                Иначе
                    ПочтовыйАдресПолучателя = ПочтовыйАдресПолучателя 
                                            + ЭлементПочтовыйАдрес.Значение
                                            + "; ";
                КонецЕсли;
            КонецЦикла;
        ИначеЕсли ТипЗнч(СписокПолучателей) = Тип("Строка") Тогда
            ПочтовыйАдресПолучателя = СписокПолучателей;
        КонецЕсли;
        //
        //
        // Вызов альтернативной процедуры отправки почты
        //
        _управлениеПочтой.ОтправитьПечатнуюФормуВнешнимТранспортом(Документ, УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь,"ОсновнойКаталогФайлов"),ИмяФайлаВложения,ПочтовыйАдресПолучателя);
        //
        // изменения программиста конец
        Возврат;
    КонецЕсли;

 

4. Текст модуля     _управлениеПочтой:

 

 

Процедура ОтправитьПечатнуюФормуВнешнимТранспортом (ПолеТабличногоДокумента, КаталогФормирования="",имяФайлаВложения,строкаАдресаты) Экспорт 

  Расширение="xls";

   Файл = Новый Файл(КаталогФормирования);
   Если Файл.Существует() Тогда
      ИмяФайла = КаталогФормирования;
   Иначе
     ИмяФайла = КаталогВременныхФайлов();
   КонецЕсли;

  Если Не ПустаяСтрока(ИмяФайла) Тогда
    Если Не Прав(ИмяФайла, 1) = "\" Тогда
      ИмяФайла = ИмяФайла + "\";
    КонецЕсли;
  КонецЕсли;

   ОтносительноеИмя =КорректировкаНаименования(имяФайлаВложения,ложь); 
   ИмяФайлаБезРасширения = ИмяФайла + ОтносительноеИмя;

   ИмяФайла = ИмяФайлаБезРасширения + ".xls";
   ПолеТабличногоДокумента.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS97);

   ПутьМозиллы = "C:/Program Files/Mozilla Thunderbird/thunderbird.exe";
   КаталогМозиллы = """C:/Program Files/Mozilla Thunderbird""";
   Мозилла = Новый Файл(ПутьМозиллы);
   Если Не Мозилла.Существует() Тогда
       ПутьМозиллы = "C:/Program Files (x86)/Mozilla Thunderbird/thunderbird.exe";
       КаталогМозиллы = """C:/Program Files (x86)/Mozilla Thunderbird""";
       Мозилла = Новый Файл(ПутьМозиллы);
   КонецЕсли;
   Если Мозилла.Существует() Тогда
       Текст = Новый ЗаписьТекста(КаталогВременныхФайлов() + "sendfile"+".bat", КодировкаТекста.OEM);
       Текст.ЗаписатьСтроку("@echo off");
       Текст.ЗаписатьСтроку("@echo Отправка почты");
       Текст.ЗаписатьСтроку("cd " + КаталогМозиллы);
       СтрокаЗапуска = "to='"+строкаАдресаты+"',subject='"+имяФайлаВложения+"',body='',attachment='"+ИмяФайла+"'";
       СтрокаЗапуска = """" + СтрокаЗапуска + """";
       СтрокаЗапуска = " -compose " + СтрокаЗапуска;
       Текст.ЗаписатьСтроку("thunderbird.exe"+СтрокаЗапуска);
       Текст.ЗаписатьСтроку("del " + КаталогВременныхФайлов() + "sendfile" + ".bat");
       Текст.Закрыть();
       ЗапуститьПриложение(КаталогВременныхФайлов()+"sendfile"+".bat",КаталогВременныхФайлов());
   Иначе
       Почта=Новый Почта;
       Почта.Подключиться();
       Сообщ=Новый ПочтовоеСообщение;
       Сообщ.Получатели.Добавить(строкаАдресаты);
       Сообщ.Тема=имяФайлаВложения;
       Сообщ.Текст="";
       ВыбФайл=Новый Файл(ИмяФайла);
       Если ВыбФайл.Существует() Тогда
           Данные=Новый ДвоичныеДанные(ИмяФайла);
           Сообщ.Вложения.Добавить(Данные,ВыбФайл.Имя);
       КонецЕсли;
       Почта.Послать(Сообщ,);
       Почта.Отключиться();
       
       Попытка
           УдалитьФайлы(ИмяФайла);
           Сообщить("Удален файл "+ИмяФайла);
       Исключение
           Сообщить(ОписаниеОшибки());
       КонецПопытки;
       
   КонецЕсли;

КонецПроцедуры 


Функция КорректировкаНаименования(Знач ИсходнаяСтрока, Выводитьсообщения=Истина) 

    Наименование=СокрЛП(ИсходнаяСтрока);    
   ДлиннаНаим=СтрДлина(Наименование);
   СписокЗаменяемыхимволов=новый СписокЗначений;

     Если ДлиннаНаим=0 Тогда
        Сообщение="Не заполнена проверяемая строка!";
       #Если Клиент Тогда
            Если Выводитьсообщения Тогда
                Сообщить(Сообщение);
           КонецЕсли;
      #КонецЕсли 

     КонецЕсли; 
    Для i=0 По ДлиннаНаим-1 Цикл  
          Стр=Прав(Наименование,ДлиннаНаим-i);  
         // руск. алф. 192- 255 англ. алф. мал. 65-90 англ. алф. бол. 97-122 пробел=32 цифры АSCI дес.
        Если (((КодСимвола(Стр)>1039)и(КодСимвола(Стр)64)и(КодСимвола(Стр)96)и(КодСимвола           (Стр)47)и(КодСимвола(Стр)32)) Тогда
        Иначе
         СписокЗаменяемыхимволов.Добавить(Лев(Стр,1));
       КонецЕсли;
   КонецЦикла;

  Для каждого ЭлементСписка Из СписокЗаменяемыхимволов Цикл
  Если ЭлементСписка.Значение=" " Тогда
  Наименование=СтрЗаменить(Наименование,ЭлементСписка.Значение,"_");
  Сообщение="В наименование колонки "+ИсходнаяСтрока+" встречается недопустимый символ (пробел) "+ЭлементСписка.Значение+", он будет заменен на '_'";
  #Если Клиент Тогда
  Если Выводитьсообщения Тогда
  Сообщить(Сообщение);
  КонецЕсли;
  #КонецЕсли 
  Иначе
  Наименование=СтрЗаменить(Наименование,ЭлементСписка.Значение,""); 
  Сообщение="В наименование колонки "+ИсходнаяСтрока+" встречается недопустимый символ "+ЭлементСписка.Значение+", он будет удален";
  #Если Клиент Тогда
  Если Выводитьсообщения Тогда
  Сообщить(Сообщение);
  КонецЕсли;
 #КонецЕсли     
   КонецЕсли
   КонецЦикла;
   Возврат Наименование;    
КонецФункции

Процедура ПолучитьПолучателей2(ПараметрОбъектПечати, СписокПолучателей) Экспорт
    
    Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(ПараметрОбъектПечати))
            И ПараметрОбъектПечати.Метаданные().Реквизиты.Найти("Контрагент") <> Неопределено
    Тогда
        СписокПолучателей.Добавить(ПараметрОбъектПечати.Контрагент);
    Иначе
        Если ТипЗнч(ПараметрОбъектПечати) = Тип("СправочникСсылка.КонтактныеЛица")
            ИЛИ ТипЗнч(ПараметрОбъектПечати) = Тип("СправочникСсылка.ФизическиеЛица")
            ИЛИ ТипЗнч(ПараметрОбъектПечати) = Тип("СправочникСсылка.Пользователи")
            ИЛИ ТипЗнч(ПараметрОбъектПечати) = Тип("СправочникСсылка.КонтактныеЛицаКонтрагентов")
            ИЛИ ТипЗнч(ПараметрОбъектПечати) = Тип("СправочникСсылка.Контрагенты")
            ИЛИ ТипЗнч(ПараметрОбъектПечати) = Тип("СправочникСсылка.Организации")
            ИЛИ ТипЗнч(ПараметрОбъектПечати) = Тип("СправочникСсылка.ЛичныеКонтакты")
        Тогда
            СписокПолучателей.Добавить(ПараметрОбъектПечати);
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры // ПолучитьПолучателей2()

См. также

"Акты сверки +" Групповая подготовка и рассылка актов сверки для Бухгалтерии 3.0.

Взаиморасчеты Email рассылки Акт сверки Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Платные (руб)

Внешняя обработка для Бухгалтерии 3.0 - позволяет автоматически формировать документы «Акт сверки расчетов» с контрагентами за выбранный период с последующей фоновой отправкой на почту контрагента.

3000 руб.

25.11.2020    22462    183    6    

163

Email, SMS, Telegram рассылки из 1С - Директ Маркетинг

Управление взаимоотношениями с клиентами (CRM) Мессенджеры и боты SMS рассылки Email рассылки Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Полный набор инструментов для качественных транзакционных и маркетинговых Email, SMS, Telegram рассылок из 1С. Даже простые уведомления об оплате счетов способны существенно упростить сбор дебиторской задолженности. Применение всех возможностей прямого маркетинга выводит коммуникацию с клиентами, уровень сервиса и лояльность на новый уровень.

7788 руб.

07.04.2014    84001    42    191    

127

Автоматическая рассылка отчетов из 1С: Управление торговлей 10.3 и 1С:УПП по электронной почте

Email рассылки Оптовая торговля Платформа 1С v8.3 1С:Управление торговлей 10 1С:Управление производственным предприятием Управленческий учет Платные (руб)

Многим сотрудникам предприятия требуется актуальная и достоверная информация для принятия верных управленческих решений. Получить данную информацию можно при помощи отчетов, существующих в конфигурации «1С: Управление торговлей 10.3» или «1С:УПП». Но не всегда у пользователей есть время, возможность и/или желание формировать отчеты непосредственно в системе. Намного привычней и удобней получать готовые отчеты на электронную почту, не открывая 1С.

12000 руб.

16.04.2014    84456    100    91    

94

Массовая рассылка печатных форм любых документов по электронной почте

Email рассылки Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

За $m и Руб. Решение для массовой рассылки печатных форм (в том числе и дополнительных) любых документов, и произвольных файлов по электронной почте. Рассылка пакета документов. Добавление факсимильных печати и подписи. Произвольные шаблоны HTML/Simple text с автозаполнением любыми полями документа. Любые форматы файлов. Упаковка вложений в архив. Транслитерация имен файлов. Разбиение рассылки на произвольные порции. Обход спам-фильтров. Журналирование рассылок.

3600 руб.

30.06.2022    9191    64    88    

27

Групповое создание актов сверок

Взаиморасчеты Email рассылки Акт сверки Платформа 1С v8.3 Бухгалтерский учет 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 Бухгалтерский учет Платные (руб)

Обработки предназначены для массового создания актов сверки и отправки их по электронной почте для конфигураций Управление торговлей 10.3. и Бухгалтерия предприятия 3.0. Для Бухгалтерии 3.0 Разработка велась на 1С:Предприятие 8.3 (8.3.15.1830). проверялась на Бухгалтерия предприятия 3.0 (3.0.71.83) и 3.0.76.77 Для Управление торговлей 10.3 Разработка велась на 1С:Предприятие 8.3 релиз конфигурации (10.3.61.2) . РАБОТАЕТ НА БАЗОВЫХ и ПРОФ. ВЕРСИЯХ.

2000 руб.

24.04.2020    30561    121    66    

101

Групповое формирование, согласование, печать и отправка по e-mail актов сверок взаиморасчетов (Бухгалтерия предприятия, ред. 3.0)

Email рассылки Взаиморасчеты Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Указывайте любой период, список организаций, контрагентов, видов договоров (с покупателем, с поставщиком и др.), счетов бухгалтерского учёта, валюту, необходимость детализации по договорам, список печатных форм и форматов их сохранения, а затем формируйте, согласовывайте, контролируйте, печатайте и отправляйте по e-mail готовые акты сверок прямо из 1С: Бухгалтерия предприятия, ред. 3.0.

9000 руб.

03.04.2018    30671    64    24    

64
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. cool.vlad4 2 27.03.13 17:09 Сейчас в теме
куча кода...за качество судить не берусь, но хотя бы то, что используется конкретный путь к буревестнику, уже говорит, что в половине случаев работать не будет. Путь к птичке есть в реестре. Это точно, а иначе как птичку запускает mailto:
2. Angeros 28.03.13 04:14 Сейчас в теме
Все здорово. Но попробуйте оформить код чтобы он подсвечивался не как текст.
3. d7k 9 28.03.13 09:57 Сейчас в теме
2 cool.vlad4:
Системный вызов mailto: из 1С 8.2 КА в случае Mozilla Thunderbird почему-то не работает. 1С игнорирует птичку, вызывая MS Outlook Express. Я применил вызов почтового клиента из командной строки с передачей параметров в виде аргументов. Командная строка MS сурова и беспощадна - ей понятнее путь вида C:\PROGRA~1\MOZILL~3\. Многочисленные эксперименты к успеху не привели. Остановился на том, что есть. Проверено - работает на W7 (x86 и x64). Если кто-то найдет решение - я только за.

2 Angeros:
Это моя первая публикация. Раскрашка я так понял не бесплатна.
"А чтобы продать что-нибудь ненужное, надо купить что-нибудь ненужное, а у нас денег нет" (С) дядя Федор
4. пользователь 28.03.13 10:18
Сообщение было скрыто модератором.
...
5. tka4enk0 144 28.03.13 22:08 Сейчас в теме
+ Как раз нужна была идея отправки через консоль.
Пробовал через blat но что-то не взлетел. Завтра попробую через Mozilla Thunderbird...
6. asved.ru 36 03.04.13 17:26 Сейчас в теме
Вообще-то существует такая вещь, как CDO. просто не нужно путать процесс отправки почты и процесс сохранения сообщения в отправленных почтового клиента. Это может с успехом сделать почтовый сервер по IMAP, к примеру.
7. MOTOSFERA 07.07.17 13:53 Сейчас в теме
Подскажите на Windows 10 не открывается Mozilla Thunderbird Вылетает консоль и сразу прячется и не открывает Mozilla Thunderbird на Windows 7 всё нормально работает. Что нужно поменять в коде что бы и на Windows 10 начало работать???
8. IxI_JOKER_IxI 19.01.18 11:08 Сейчас в теме
Если (((КодСимвола(Стр)>1039)и(КодСимвола(Стр)64)и(КодСимвола(Стр)96)и(КодСимвола(Стр)47)и(КодСимвола(Стр)32)) Тогда

Ошибку выкидывает. Пишет что не хватает знака ")"


И является ли ошибкой пропущенная буква С в строке - СписокЗаменяемых_С_имволов
Оставьте свое сообщение