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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2024-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 не будет опубликован. Обязательные поля помечены *