Имя: Пароль:
1C
1C 7.7
v7: Неполадки с Rom-mail.dll
0 sdemon72
 
27.10.11
11:52
Проблемка в общем-то давняя, одно время вроде бы переставала мучать, а сейчас вот снова обострение.
Использую Rom-mail.dll версия 1.4.1 довольно активно: примерно раз в 10 минут через "Назначенные задания" запускается 1с7, принимает почту, выполняет какие-то дела, отправляет почту и закрывается.
Через некоторое время (примерно через месяц) перестает принимать и отправлять почту, при этом после попытки получения, если попытаться принять еще раз - падает 1с7 без каких-либо сообщений об ошибке. Перезагрузка сервера, на котором выполняется сие действо, решает проблему.
Может быть можно какую-нибудь службу одну перегрузить? или файлик удалить какой-нибудь?
1 sdemon72
 
27.10.11
12:05
Вдогонку:
Сервер win2003 standart sp2, 1с7 версия 7.70.025, код, связаный с Rom-mail.dll, следующий:
[code]
Процедура ПочтаПринять()

   Протокол("Проверка почтового ящика " + НашЕмайл + "...");
   Если НастроитьПочтовыйЯщик(0) = 0 Тогда
       ФлОшибкиАвтообмен = 1;
       Возврат;
   КонецЕсли;
   
   Если ПочтовыйЯщик.Подключиться("POP3") = 0 Тогда
       Протокол("ОШИБКА!!! Не удалось подключится к серверу POP3");
       ФлОшибкиАвтообмен = 1;
       //ПочтовыйЯщик.Отключиться();
       Возврат;
   КонецЕсли;
   
   // обработка сообщений
   ТекстПисьма = СоздатьОбъект("Текст");
   
   СчетчикФайлов = 0;
   СчетчикЗапросов = 0;
   
   ТекКолСообщений = ПочтовыйЯщик.КоличествоСообщений();
   Для ТекНомерСообщения = 1 По ТекКолСообщений Цикл
       Если ПочтовыйЯщик.ПолучитьЗаголовок(ТекНомерСообщения) = 0 Тогда Продолжить;
       КонецЕсли;
       
       // Анализ заголовка письма
       ТекАдресОтправителя = СокрЛП(Нрег(ПочтовыйЯщик.АдресОтправителя));
       ТекИмяОтправителя = СокрЛП(Нрег(ПочтовыйЯщик.ИмяОтправителя));
       ТемаПисьма = Врег(СокрЛП(ПочтовыйЯщик.Тема));
       ДатаПисьма = Дата(ПочтовыйЯщик.ДатаОтправки);
       ИдПисьма = ПочтовыйЯщик.IDMessage;
       Если ПустоеЗначение(ИдПисьма) = 1 Тогда
           ИдПисьма = "БезИД" + Время1980();
       КонецЕсли;
           
       Протокол("Анализ письма: '" + Лев(ТемаПисьма, 100) + "' от " + Лев(ТекАдресОтправителя,50) + " (" + ДатаПисьма + ")");
       
       
       ФлЗапросПринят = 0;
       // Удаление сообщений "Mail Delivery System"
       Если Найти(Врег(ТекИмяОтправителя),Врег("Mail Delivery")) <> 0 Тогда
           ПочтовыйЯщик.ПометитьНаУдаление(ТекНомерСообщения);
           Протокол("Mail Delivery - помечено на удаление");
           Продолжить;
       КонецЕсли;
       Если Найти(Врег(ТемаПисьма),Врег("Mail Delivery")) <> 0 Тогда
           ПочтовыйЯщик.ПометитьНаУдаление(ТекНомерСообщения);
           Протокол("Mail Delivery - помечено на удаление");
           Продолжить;
       КонецЕсли;
       
       // Анализ адреса отправителя
       Если СписКлиентыЧерный.Принадлежит(ТекАдресОтправителя) <> 0 Тогда
           ПочтовыйЯщик.ПометитьНаУдаление(ТекНомерСообщения);
           Протокол("Включено в черный список - помечено на удаление");
           Продолжить;
       КонецЕсли;
       Если СписКлиенты.Принадлежит(ТекАдресОтправителя) <> 0 Тогда
           ФлЗапросПринят = 1;
       Иначе
           СпрКонтрагенты = СоздатьОбъект("Справочник.Контрагенты");
           СпрКонтрагенты.ВыбратьЭлементы();
           Пока СпрКонтрагенты.ПолучитьЭлемент() = 1 Цикл
               Если СпрКонтрагенты.ЭтоГруппа() = 1 Тогда Продолжить;
               ИначеЕсли Найти(Нрег(СпрКонтрагенты.ЭлПочта),ТекАдресОтправителя) = 0 Тогда Продолжить;
               КонецЕсли;
               ФлЗапросПринят = 1;
               Прервать;
           КонецЦикла;
       КонецЕсли;
       
       Если ФлЗапросПринят = 0 Тогда
           Протокол("Неизвестный адрес отправителя!");
           // Старые письма удаляем
           Если ВыбДнейСпам = 0 Тогда Продолжить;
           КонецЕсли;
           Если ТекущаяДата() - ДатаПисьма < ВыбДнейСпам Тогда Продолжить;
           КонецЕсли;
           ПочтовыйЯщик.ПометитьНаУдаление(ТекНомерСообщения);
           Протокол("Время хранения письма истекло - помечено на удаление");
           Продолжить;
       КонецЕсли;
       
       Если ПочтовыйЯщик.ПолучитьТело(ТекНомерСообщения) = 0 Тогда
           Протокол("ОШИБКА!!! Не удалось получить тело письма");
           ФлОшибкиАвтообмен = 1;
           Продолжить;
       КонецЕсли;

       // Запись тела письма
       ПрефиксПисьма = ПолучитьПрефиксФайла(ВыбКатПрием);
       
       ТекстПисьма.Очистить();
       ТекстПисьма.ДобавитьСтроку("From: " + ТекАдресОтправителя);
       ТекстПисьма.ДобавитьСтроку("Message-Id: " + ИдПисьма);
       ТекстПисьма.ДобавитьСтроку("Subject: " + ТемаПисьма);
       Для ТекСтрокаСообщения = 1 По ПочтовыйЯщик.КоличествоСтрок() Цикл
           ТекстПисьма.ДобавитьСтроку("Text: " + ПочтовыйЯщик.ПолучитьСтроку(ТекСтрокаСообщения));
       КонецЦикла;
           
       ТекстПисьма.Записать(ВыбКатПрием + ПрефиксПисьма + "message.txt");
       Протокол("Письмо сохранено в файл "+ ПрефиксПисьма + "message.txt");            
       СчетчикЗапросов = СчетчикЗапросов + 1;
       
       // Сохранение вложений
       ТекКолФайлов = ПочтовыйЯщик.КоличествоФайлов();
       Для ТекНомерВложения = 1 По ТекКолФайлов Цикл
           ТекИмяВложения  = ПочтовыйЯщик.ПолучитьФайл(ТекНомерВложения);
           ТекИмяФайла = ПрефиксПисьма + ТекИмяВложения;
           ПочтовыйЯщик.СохранитьФайл(ТекНомерВложения,ТекИмяФайла);
           Протокол("Принят файл " + ТекИмяВложения + ", сохранен как " + ТекИмяФайла);            
           СчетчикФайлов = СчетчикФайлов + 1;
       КонецЦикла;
       ПочтовыйЯщик.ПометитьНаУдаление(ТекНомерСообщения);
   КонецЦикла;
   
   ПочтовыйЯщик.Отключиться();
   
   
   Протокол("Получено писем " + ТекКолСообщений + ", сохранено " + СчетчикЗапросов + ", файлов " + СчетчикФайлов);
   
   
КонецПроцедуры // ПочтаПринять()
[/code]
[code]
//*********************************************************
// ПочтаОтправить()
//
Процедура ПочтаОтправить()
   
   // Подготовка ящика на отправку
   Если НастроитьПочтовыйЯщик(1) = 0 Тогда
       ФлОшибкиАвтообмен = 1;
       Возврат;
   КонецЕсли;
   
   //Подготовка списка писем
   СписОтправить = СоздатьОбъект("СписокЗначений");
   ТекФайл = ФС.НайтиПервыйФайл(ВыбКатОтправка + "*.*");
   Пока ПустоеЗначение(ТекФайл) = 0 Цикл
       Если (ТекФайл = ".")
       или (ТекФайл = "..") Тогда
           ТекФайл = ФС.НайтиСледующийФайл();
           Продолжить;
       КонецЕсли;
       
       ТекИмяФайла = ТекФайл;
       ТекПрефикс = ВыделитьПрефикс(ТекИмяФайла);
       Если ПустоеЗначение(ТекПрефикс) = 1 Тогда // Без префикса не отправляем
           ТекФайл = ФС.НайтиСледующийФайл();
           Продолжить;
       КонецЕсли;
       
       СписОтправить.ДобавитьЗначение(ТекФайл,ТекПрефикс);

       ТекФайл = ФС.НайтиСледующийФайл();
   КонецЦикла;
   
   Если СписОтправить.РазмерСписка() = 0 Тогда
       Протокол("Нет писем к отправке");
       Возврат;
   КонецЕсли;
   
   // Подготовка ящика на отправку
   Если ПочтовыйЯщик.Подключиться("Отправка") = 0 Тогда
       Протокол("ОШИБКА!!! Не удалось подключится к серверу SMTP");
       ФлОшибкиАвтообмен = 1;
       Возврат;
   КонецЕсли;
   
   // Отправка писем
   ТекстПисьма = СоздатьОбъект("Текст");

   СписОтправить.СортироватьПоПредставлению();
   ПрефиксПисьма = "";
   ТемаПисьма = "";
   Емайл = "";
   ТекСообщение = "";
   ТекФайлы = "";
   ТекФайлыПротокол = "";
   
   СчетчикОшибок = 0;
   СчетчикПисем = 0;
   
   Инд = 0;
   Пока 1=1 Цикл
       
       Инд = Инд + 1;
       // Анализ строки списка
       Если Инд > СписОтправить.РазмерСписка() Тогда // Список обработан - отправить и прервать
           ФлОтправить = 2;
       Иначе
           ТекПрефикс = "";
           СписОтправить.ПолучитьЗначение(Инд,ТекПрефикс);
           Если ПрефиксПисьма = "" Тогда // первый цикл
               ФлОтправить = 0;
           ИначеЕсли ПрефиксПисьма = ТекПрефикс Тогда // Продолжение письма
               ФлОтправить = 0;
           Иначе
               ФлОтправить = 1; // Новое письмо
           КонецЕсли;
       КонецЕсли;
       
       Если ФлОтправить > 0 Тогда
           ФлОтправлено = 0;
           // Отправка письма, сначала проверить заголовок
           Если ПустоеЗначение(Емайл) = 1 Тогда
               Протокол("Отправка письма невозможна - не найден файл заголовка: " + ПрефиксПисьма + "message.txt");
           Иначе
               ПочтовыйЯщик.ИмяОтправителя = ИмяПользователя() + " " + ВыбИДБазы;
               ПочтовыйЯщик.АдресОтправителя = НашЕмайл;
               ПочтовыйЯщик.АдресПолучателя = Емайл;
                 ПочтовыйЯщик.Тема = ТемаПисьма;
               ПочтовыйЯщик.Тело = ТекСообщение;
                 ПочтовыйЯщик.Вложения = ТекФайлы;
               
               ФлОтправлено = ПочтовыйЯщик.Отправить();
               
               Если ФлОтправлено = 0 Тогда
                   Протокол("ОШИБКА!!! Не удалось отправить почту " + Емайл + " '" + ТемаПисьма + "' '" + ТекФайлы +"'");
                   ФлОшибкиАвтообмен = 1;
                   СчетчикОшибок = СчетчикОшибок + 1;
               Иначе
                   Протокол("Отправлено письмо для " + Емайл + " '" + ТемаПисьма + "' '" + ТекФайлы +"'");
                   СчетчикПисем = СчетчикПисем + 1;
               КонецЕсли;
               
           КонецЕсли;
           
           // Переместить отправленные файлы в архив и убрать из ТМП
           Для Инд1 = 1 По СписОтправить.РазмерСписка() Цикл
               ТекПрефикс = "";
               ТекФайл = СписОтправить.ПолучитьЗначение(Инд1,ТекПрефикс);
               Если ТекПрефикс <> ПрефиксПисьма Тогда Продолжить;
               КонецЕсли;
               Если ФлОтправлено = 1 Тогда
                   ФС.ПереименоватьФайл(ВыбКатОтправка + ТекФайл,ВыбКатОтправка + "ARH\" + ТекФайл,1);
                   Протокол("Файл " + ТекФайл + " перемещен в архив");
               КонецЕсли;
               ВыделитьПрефикс(ТекФайл);
               // Удалить временный файл
               Если ФС.СуществуетФайл(КаталогНастроек + "TMP\" +ТекФайл) = 1 Тогда
                   ФС.УдалитьФайл(КаталогНастроек + "TMP\" +ТекФайл);
               КонецЕсли;
           КонецЦикла;
           
           Если ФлОтправить = 2 Тогда Прервать;
           КонецЕсли;
       
           // Подготовка нового письма
           ТекстПисьма.Очистить();
           ТемаПисьма = "";
           Емайл = "";
           ТекСообщение = "";
           ТекФайлы = "";
           ТекФайлыПротокол = "";
           
       КонецЕсли;
       
       
       // Обработка строки списка
       ТекФайл = СписОтправить.ПолучитьЗначение(Инд,ПрефиксПисьма);
       ТекИмяФайла = ТекФайл;
       ВыделитьПрефикс(ТекИмяФайла);
       
       
       Если Нрег(ТекИмяФайла) = "message.txt" Тогда // тело письма
           // Обработка тела письма
           ТекстПисьма.Открыть(ВыбКатОтправка + ТекФайл);
           Для ТекСтрокаПисьма = 1 По ТекстПисьма.КоличествоСтрок() Цикл
               ТекСтрока = ТекстПисьма.ПолучитьСтроку(ТекСтрокаПисьма);
               Если Врег(Лев(ТекСтрока,СтрДлина("TO: "))) = "TO: " Тогда
                   Емайл = Сред(ТекСтрока,СтрДлина("TO: ")+1);
               ИначеЕсли Врег(Лев(ТекСтрока,СтрДлина("SUBJECT: "))) = "SUBJECT: " Тогда
                   ТемаПисьма = Сред(ТекСтрока,СтрДлина("SUBJECT: ") + 1);
               ИначеЕсли Врег(Лев(ТекСтрока,СтрДлина("TEXT: "))) = "TEXT: " Тогда
                   ТекСообщение = ТекСообщение + Сред(ТекСтрока,СтрДлина("TEXT: ")+1) + РазделительСтрок;
               КонецЕсли;
           КонецЦикла;
       Иначе
           // Обработка вложений
           ФС.КопироватьФайл(ВыбКатОтправка + ТекФайл,КаталогНастроек + "TMP\" + ТекИмяФайла,0);
           Если ПустоеЗначение(ТекФайлы) = 0 Тогда
               ТекФайлы = ТекФайлы + ";";
               ТекФайлыПротокол = ТекФайлыПротокол + ",";
           КонецЕсли;
           ТекФайлы = ТекФайлы + КаталогНастроек + "TMP\" +ТекИмяФайла;
           ТекФайлыПротокол = ТекФайлыПротокол + ТекИмяФайла;
       КонецЕсли;
   КонецЦикла;
   
   ПочтовыйЯщик.Отключиться();
   Протокол("Отправлено писем " + СчетчикПисем + ", ошибок " + СчетчикОшибок);
   
КонецПроцедуры    // ПочтаОтправить()
[/code]
2 sdemon72
 
27.10.11
12:09
А, да, ну и ошибка выскакивает на методе "Подключиться". При следующей попытке выполнения метода "Подключиться", вылетает 1с7.
3 CODER082
 
27.10.11
14:38
А што пишет в событиях ?
4 filh
 
27.10.11
14:41
юзай CDO
5 sdemon72
 
27.10.11
15:16
3 ничего не обнаружил. Тихо все как в танке.
6 filh
 
27.10.11
15:23
я когда юзал, удалял в реестре запись о роммаил, работала 1 раз, при повторной загрузке был облом.
7 sdemon72
 
27.10.11
15:25
6: ну если даст плоды - не проблема каждый раз удалять. Попробую как станет глючить....
8 filh
 
27.10.11
15:26
чем CDO не устроил?
9 filh
 
27.10.11
15:26
или лень переписывать?
10 Mikeware
 
27.10.11
15:27
(9) Да проще тогда уж на DialMail переделать - она постабильнее.
Хотя и с роммэйлом проблем не наблюдал...
11 sdemon72
 
27.10.11
15:28
[9] конечно лень! Оно уже лет 7 работает - бородищей огромной обросло, а щас на "восьмерку" переходим - там уже не нужно будет.
12 ЧеловекДуши
 
27.10.11
15:29
Эта ВК конфликтует с другими ВК, так что какие у тебя еще есть ВК?
13 sdemon72
 
27.10.11
15:30
Ощущение такое, что где-то переполняется стек или что-то в этом роде, а при перезагрузке обнуляется. Но где?
14 sdemon72
 
27.10.11
15:31
(12) 1с++, v7plus и все вродебы. формекс убрали - пользуем 1с++овский
15 oleg rizvanov
 
27.10.11
15:32
Думаю, что (12) прав. Случаи были
16 oleg rizvanov
 
27.10.11
15:34
(14) А какой порядок загрузки ВК?
17 sdemon72
 
27.10.11
15:36
(15) Думаю что в случае конфликта сбои были бы более стабильными - запускается всегда один и тот же ряд задач
18 Mikeware
 
27.10.11
15:36
(15) Пользуясь случаем, благодарю за компоненту. Отработала изрядно долго, лет семь уж пыхтит...
19 filh
 
27.10.11
15:37
присоединяюсь, но у меня не взлетела.
20 FN
 
27.10.11
15:41
(15) Благодарю за компоненту - часто выручала!
21 sdemon72
 
27.10.11
15:41
(16) при старте системы - в глобальном модуле Scanner.dll, затем, при запуске обработки (ее запуск тоже прописан в глобаольнике - привязан к пользователю) - ROM-Mail.dll, затем, во вложенной обработке - 1cpp.dll
22 oleg rizvanov
 
27.10.11
15:46
(18,19,20) Спасибо большое.
(21) Возможно стоит попробовать грузить ROM-Mail первой? Как минимум хуже от этого не будет :)
23 sdemon72
 
27.10.11
15:52
(15) и присоединяюсь к благодарностям тоже :)
24 sdemon72
 
27.10.11
15:54
22 А может ли эта компонетна где-то хранить свои временные файлы или еще что-то в этом роде, что очищалось бы только при перезагрузке операционной системы? И название процесса какое у нее - такое же, "rommail"?
25 oleg rizvanov
 
27.10.11
15:55
(23) Спасибо большое.
Расскажите потом, помогло или нет
26 sdemon72
 
27.10.11
15:56
Дело в том, что такая вещь запускается попеременно на нескольких БД, и если начинаются сбои - то возникают для всех баз.
27 Mikeware
 
27.10.11
15:56
(22) у меня грузится где-то в конце (или даже в обработках, где требуется)
И работает почти без проблем. Проблема - зависание "наглухо" при чтении почты с файлами определенного типа (вроде, презенташки поверпойнтовские) - еще на этапе получения заголовков. Перешел на диалмэйл - вроде работает. Если надо, могу поднять старые архивы багтрекера, найти на чем висло.
28 oleg rizvanov
 
27.10.11
16:05
Я уже сталкивался. Когда эта проблема возникает, то она живет в пределах сервера. Думаю, на уровне COM-а. Идей пока нет
29 sdemon72
 
27.10.11
16:06
(27) вот и у меня без проблем, не считая вот этой, возникающей раз в месяц а то и реже. Спотыкалась раз в месяц примерно, лечил перезагрузкой оси, потом где-то с год без сбоев работала, а сейчас вот, опять, в прошлом месяце один раз и сегодня тоже.
30 oleg rizvanov
 
27.10.11
16:15
Стоит только SP2 без R2?
31 sdemon72
 
27.10.11
16:19
(30) 2003 R2 SP2
32 sdemon72
 
27.10.11
16:21
(30) А другой сервер - просто 2003 SP2. Глючат оба по очереди
33 sdemon72
 
27.10.11
16:22
(30) ой, и да, тот что R2 - enterprise (прошу извинения за сумбурность повествования)
34 oleg rizvanov
 
27.10.11
16:35
Хочу помочь, но мне бы хоть за что-то зацепиться...
35 ЧеловекДуши
 
27.10.11
16:37
Делать нечего ищи альтернативу ВК, на просторах инета есть вроде парочка бесплатных решений.
Нестоит использовать типовую почту от 1С, там глюки похлеще будут :)
36 sdemon72
 
27.10.11
16:49
(35), спасибо, но я уж лучше раз в месяц перегружусь
37 sdemon72
 
27.10.11
16:51
(34) так а процесс не может подвиснуть? он как называется? и какие вызывает процессы системные или дочерние?
38 sdemon72
 
27.10.11
16:52
Да, выход из системы и снова вход не помогает. Только перезагрузка