Отправка почты из 1С




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

70 Comments

  1. coder1cv8

    Вот нашел у себя в «архивах», возможно кому-то пригодится… )

    Reply ↓
  2. CheBurator

    Хитрый, однако…

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

    вот будет тебе тогда почет и уважение…

    Reply ↓
  3. coder1cv8

    (3) Уведомления есть в «Почта» и «ИнтернетПочта», а так же через «Outlook Express»…

    Как сделать в CDO и MAPI не знаю, не интересовался как-то…

    ЗЫ: Что значит «своими методами»?… ) Это не мои методы, это просто примеры! ) Я CDO предпочитаю, если что… )

    Reply ↓
  4. Abadonna

    (3)>Я CDO предпочитаю, если что… )

    Да Чебур и сам CDO-шит направо и налево 😉

    Reply ↓
  5. zaic

    Для коллекции стоит упомянуть ROM-Mail.dll. Еще DialMail.dll есть, но с ней я не работал.

    Reply ↓
  6. Душелов

    (0) Добавь еще мою, для отправки через SSL 🙂

    Reply ↓
  7. coder1cv8

    (5) А я ни с той, ни с другой не работал… )

    (6) У тебя АктивИксы, конечно, суперские! Но ВК я стараюсь избегать по мере сил… )

    Reply ↓
  8. vip

    (5) > Еще DialMail.dll есть, но с ней я не работал.

    А ты поработай и забудешь про Rom-Mail

    (7) Ю Но ВК я стараюсь избегать по мере сил

    Почему?!

    Reply ↓
  9. Abadonna

    (8) А есть еще «Mozilla Thunderbird» — ваще крутяк ;))))))

    Reply ↓
  10. coder1cv8

    (8) Ну как почему? Во-первых пишу на восьмерке, а тут уже кое-что и без ВК можно сделать (привык обходиться), это 7.7 без ВК полный ноль. Во-вторых от ВК страдает «переносимость», так сказать, разработки, длл-ку зарегить, файлик положить куда-надо и т.д.

    (9) Вот поставил себе это чудо, в целях искоренения не лицензионного софта! 🙂 Пока не копался особо, но возник уже вопрос: а что как в Bat-е несколько ящиков сделать можно, али как?…

    Reply ↓
  11. CheBurator

    (3) В cDo — уведомление о доставке — можно, а вот уведомление о прочтении — не нашел как..

    Reply ↓
  12. CheBurator

    (9) Тандеберд — какой-то гадкий выкормыш.. вроде и нормально все… но что-то не то…

    Я себе Бат купил домой и не парюсь…

    Reply ↓
  13. CheBurator

    (10) в Тандеберде — можно несколько ящиков

    Reply ↓
  14. coder1cv8

    (13) Да, спасибо, нашел уже… ) А вот пароль на просмотр содержимого ящика похоже не поставить как Бат-е…

    Reply ↓
  15. CheBurator

    (14) с паролем в тандеберде тяжело — я пока поставил глобальный пароль.. При этом в Бате такой пароль не дает посмотреть ничего — пока не пройдешь окно авторизации, в тандеберде — это филькина грамота — горит главное окно программы с перечнем ящиком, листом сообщений и на фоне этого — окно авторизации… имхо — бред полнейший…

    Reply ↓
  16. coder1cv8

    (15) Плохо. А подскажи где этот пароль устанавливается?…

    Reply ↓
  17. CheBurator

    Сейчас…

    Reply ↓
  18. CheBurator

    Меню-Инструменты-Найстроки-Приватность — про мастер пароль.. но это, е-мае, не пароль на ящики… это немного другое… как оказалось

    Reply ↓
  19. coder1cv8

    (18) Странно, вроде лазил туда, а не заметил… Ок. Спасибо. Гляну на досуге…

    Reply ↓
  20. logarifm

    + идиология и как приммеры для своих разработок очень пригодиться!

    Reply ↓
  21. vkr

    (15) 2 Che Burashka :

    Хочу Вас сильно огорчить — увы, в обычном Бат-е пароль — ето тоже ГЛОБАЛЬНАЯ ФИКЦИЯ !!! :-(((

    Он ни от чего не защищает, а обойти его — 2-3 клика мышкой в нужном месте…

    Это я Вам, как программер и сисадмин, говорю… Ж8-)))

    Есть вариант — The Bat! Voyager — тот работает с ЗАКРИПТОВАННЫМИ базами, уже что-то… 🙂

    Так что, будьте осторожны — даже дома ! 🙂

    Reply ↓
  22. Altair777

    (22) > Так что, будьте осторожны — даже дома ! 🙂

    Особенно дома!!! 😉

    Reply ↓
  23. coder1cv8

    Вот как тут легализовать домашний софт? ) Тандерберт — действительно фигня какая-то… (

    Reply ↓
  24. vkr

    (24) Пока не выйдет Тандерберд v3.0 — купить Бат домой и не мучиться —

    дешевле выйдет, сэкономите на таблетках от головной боли… :)))

    Reply ↓
  25. O-Planet

    А кто-нить это проверял? У меня задача — отправить на лист.ру е-майл. В принципе, делаю все правильно. Сравнил — тут тоже такой же код, как у меня. Но не отправляется, собака через Интернет почту 🙁

    Reply ↓
  26. coder1cv8

    (26) «Отправителя» поставь.

    Reply ↓
  27. O-Planet

    Да ставил. Скорее всего, что-то в настройках ящика нужно делать.

    Reply ↓
  28. drdroid

    (2) В 1С8 есть такие свойства у объекта «ПочтовоеСообщение»:

    Если (флУведомитьОДоставке = Истина) Тогда

    ПочтовоеСообщение.УведомитьОДоставке = Истина;

    КонецЕсли;

    Если (флУведомитьОПрочтении = Истина) Тогда

    ПочтовоеСообщение.УведомитьОПрочтении = Истина;

    КонецЕсли;

    Reply ↓
  29. Новенький

    Большое спасибо, очень помогло

    Reply ↓
  30. y22-k

    Спасибо большое. 😀

    Reply ↓
  31. pricec

    у меня почеемуто через аутлук Експресс не работает —

    Недопустимая строка с указанием класса

    Может нужен Просто аутлук ?(Не экспресс)

    Reply ↓
  32. palamars

    Доработайте плиз, чтобы не пытался пустое вложение добавлять. А то поле «Вложение» не заполнено, а обработка всё-равно пытается вложить какой-то файл

    Reply ↓
  33. polo_mino

    Спасибо за примерчик! как раз то что мне нужно было)

    Reply ↓
  34. diman85

    Помогла мне когда писал собственную обработку, посмотрел методы и способы работы с почтой

    Reply ↓
  35. cool.vlad4

    (12) Руки прочь от Mozilla! Гадкий выкормыш это бат, — лучше чем в thunderbird imap никто не поддерживает, — а также можно писать плагины, зная xul, а что можно в бат-е?

    Reply ↓
  36. cool.vlad4

    модеры, а какого черта x u l отображается как xxx?

    Reply ↓
  37. AAndryA

    Мне помогло очень ! Когда стандартными методами 1С настроить SMTP не получилось. Понравилось что реализованы разные методы отправки в одной обработке.

    Reply ↓
  38. CaSH_2004

    Зачетная вещь! Еще бы закачку для красоты. Понять бы еще в чем плюсы/минусы и отличия технологий и я был бы счастлив

    Reply ↓
  39. GrafB

    очень пригодилась обработка для обмена центрального офиса с кассой штрих лайт. до этого использовал фтп синхронизатор и никак не удавалось приучить пользователей выгружать товары в определённое время, чтобы синхронизатор не слал пустые письма, а теперь обработку внедрил и 1с сама при проведении отправляет нужный файл

    Reply ↓
  40. SergTH0000

    зачет!

    Reply ↓
  41. WellMaster

    Хорошим дополнением будет мой пример отправки почты через Lotus Notes.

    Reply ↓
  42. marishka60632

    спасибо большое автору. очень пригодилась Ваша обработка!

    Reply ↓
  43. aleg

    Мне обработка очень пригодилась для организации переписки разных отделов с прикреплением отчетов не выходя из 1С. В результате в два-три клика менеджер формирует и отправляет отчет.

    Reply ↓
  44. kostya23

    Помогло для организации уведомления по e-mail менеджеров о необходимости согласования различных документов.

    Reply ↓
  45. fixin

    Полгода мучался искал, чем заменить blat.exe для гугл-почты. Спасибо, подсказали, что существует CDO.

    Reply ↓
  46. siddy

    В строке 37 модуля объекта нужно вместо

    Письмо=Новый COMОбъект(«MSMAPI.MAPIМessages«)

    написать

    Письмо=Новый COMОбъект(«MSMAPI.MAPIМessage»)

    а так — спасибо, выручило.

    Reply ↓
  47. NSerget

    Спасибо работает 🙂

    Reply ↓
  48. SergTH0000

    Эта обработка как готовое решение имеет ряд минусов, но как шаблон для чего своего очень даже. Хорошо написано

    Reply ↓
  49. svs74

    Хороший шаблон. Прикрутил с доработками к самописной конфе. Работает на УРА!

    Reply ↓
  50. iva_nov

    При использовании smtp от mail.ru, думаю и многих других, надо

    ИПП.АутентификацияSMTP=СпособSMTPАутентификации.Login;

    При тухлом соединении еще и

    ИПП.ВремяОжидания=50
    Reply ↓
  51. haous

    Спасибо! Скачал и буду использовать. Очень полезная обработка!

    Reply ↓
  52. spacedragon

    а как с помощью вашего подхода можно реализовать работу например с GMail. Там идет шифрование, которое не реализвано в стандартных объектах 1С Почта и ИнтернетПочта. Опять использовать stunnel?

    Reply ↓
  53. Xolli

    Обработка отчеты отправляет?

    Reply ↓
  54. luchyk007

    подскажите, каким образом можно с помощью этой обработки отправлять печатные формы документов или отчётов, что для этого нужно сделать

    Reply ↓
  55. isn

    Здравствуйте!

    Столкнулся с интересной проблемой при отправке почты используя MAPI. При отправке почты появляется сообщение «Неустановлен элемент управления Msmapi32.ocx. Установить?» попытка установить не удаётся. ОС Windows 7 x64. сам файл есть Msmapi32.ocx находится в папке C:WindowsSysWOW64. в реестре папраметр «899B3E80-6AC6-11cf-8ADB-00AA00C00905» такой есть и что интересно и раздел с таким же названием есть тоже. Подскажите как быть?

    Reply ↓
  56. isn

    Регистрация в ручную regsvr32.exe C:WindowsSysWOW64Msmapi32.ocx — проходит на «ура». но при попытке отправить возникает такая же ошибка

    Reply ↓
  57. ig1082

    Спасибо. Помогла отправка через CDO.

    Reply ↓
  58. Sensodyne

    Очень классная обработка. Настроил отправку через аутлук и CDO. Спасибо!

    Reply ↓
  59. smirnov0ser

    Большое спасибо! Как раз искал возможность проверить различные способы отправки письма с сервера, так как встроенный почтовый клиент не хочет работать.

    Reply ↓
  60. excepter

    Спасибо, только благодаря этому получилось настроить отправку в mail.ru с SSL шифрованием.

    Reply ↓
  61. mirajen

    Спасибо!!!

    Как раз была проблема с отправкой через Vbs (CDO). Теперь все работает! :))

    Reply ↓
  62. xTolstx

    Огромное спасибо! Это прям то, что нужно!

    Reply ↓
  63. чингачгук

    Спасибо!

    Пробую настроить отправку через встроенный клиент, из-за безопасности закрыт 25 и 110 порты… Думаю взять часть кода и добавить функцию отправки почты прямо из отчетов и документов (чтобы сразу печатную форму можно было в письмо воткнуть)

    Reply ↓
  64. Maximysis

    Та же фигня что и у (57) isn,

    Рас комментировал попытку и получил вот эту ошибку:

    {ВнешняяОбработка.ОтправкаПочты.МодульОбъекта(26)}: Ошибка при вызове конструктора (COMОбъект)

    Сессия=Новый COMОбъект(«MSMAPI.MAPISession»);

    по причине:

    Класс не лицензирован для использования

    Reply ↓
  65. valvit

    Еще один +, лайк, респект и просто спасибо!

    Иначе SSL + 8.2 просто погрузило в грусть. Взял схему работы с CDO. Для успешной работы с mail.ru и полагаю с яндексом надо добавить

    Письмо.Configuration.Fields.Item(«http://schemas.microsoft.com/cdo/configuration/smtpusessl»).Value=1;

    Еще раз СПАСИБО!

    Reply ↓
  66. wildskiff

    Спасибо за обработку. То что нужно!

    Reply ↓
  67. kare

    (67) valvit, с маилом и яндексом сработало ?

    Reply ↓
  68. basta-one2007

    (69) kare, да, работает с яндексом

    Reply ↓
  69. kare

    (70) basta-one2007, методом проб и ошибок получилось) спасибо!

    Reply ↓
  70. bog_tan

    Спасибо, настроила отправку расч листков из 1с 7 в Лотус с помощью CDO. одна беда- как бы еще в лотус encrypt передавать…

    Reply ↓

Leave a Comment

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