Имя: Пароль:
1C
1C 7.7
v7: Отправка email из 7.7
0 SashaNNV
 
18.11.15
21:49
Добрый вечер

Вот уже черти знает сколько времени бьюсь пытаясь сделать отправку почты из 7.7.
Пытаюсь сделать через CDO:

Процедура Отправить()
        mail = CreateObject("CDO.Message");  
        mail.From = СокрЛП("Отправитель")+"<"+СокрЛП("[email protected]")+">";
        mail.To = СокрЛП("Контрагент")+"<"+СокрЛП(Контрагент.почта)+">";
......

Ругается:
mail.From = mail.From = СокрЛП("Отправитель")+"<"+СокрЛП("[email protected]")+">"; {Документ.СчетУслуги.Форма.Модуль(274)}: Поле агрегатного объекта не обнаружено (From)

Почему?

Заранее спасибо за ответ.
1 SashaNNV
 
18.11.15
21:51
1С стоит на windows server 2012
2 Мимохожий Однако
 
18.11.15
21:56
Посмотри фрагменты. Валялось в загашниках.
...
Письмо=СоздатьОбъект("AddIn.V7Mail");
        Письмо.Подключиться("MAPI",,"");    
        Письмо.НовоеСообщение();
        Если  Файлы.РазмерСписка()> 0 Тогда
            Для н=1 По Файлы.РазмерСписка() Цикл
                Письмо.ДобавитьФайл(Файлы.ПолучитьЗначение(н));    
            КонецЦикла;
            
        КонецЕсли;
        
        Письмо.Заголовок=Тема;
        
        Письмо.Текст=СокрЛП(Текст);//+"(Сформировано автоматически)";
        Письмо.ДобавитьАдрес(ЭлектронныйАдрес);
        Письмо.Послать(0);
        Письмо.Отключиться();

...
Процедура ПриОткрытии()  
    Попытка  
        Результат = ЗагрузитьВнешнююКомпоненту("V7plus.dll");  
    Исключение      
        Результат = 0;
        Сообщить("Внешняя компонента V7plus.dll не загружена
        |Почта работать не будет");
        //    глБезПочты=1; //чтобы не открывалась обработка Письмо
        СтатусВозврата(0);
    КонецПопытки;
3 HawkEye
 
19.11.15
18:29
(0) как то так
    CDOConfig = СоздатьОбъект("CDO.Configuration");
    CDOMessage = СоздатьОбъект("CDO.Message");
            
    CDOConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2; //для работы без Exchange
            
    CDOConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = СокрЛП(лбВхФилиал.СерверОтправки); // smtp.mail.ru
            
    CDOConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 25; // 25
            
    CDOConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = лбВхФилиал.АутентификацияПриОтправке;
            
    CDOConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = СокрЛП(лбВхФилиал.ПочтаЛогин); // [email protected]
            
    CDOConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = СокрЛП(лбВхФилиал.ПочтаПароль); // 123
            
    CDOConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = 0;
            
    CDOConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 60;
            
    CDOConfig.Fields.Update();
    //        
    CDOMessage.Configuration = CDOConfig;
    CDOMessage.From = СокрЛП(лбВхФилиал.ПочтовыйАдрес); // [email protected]
    
    Кому = ?(СокрЛП(вхАдресПолучателя) = "", СокрЛП(лбВхФилиал.АдресПолучателя), СокрЛП(вхАдресПолучателя));
    ЗаголовокПисьма = ?(СокрЛП(вхЗаголовок) = "", СокрЛП(лбВхФилиал.Заголовок), СокрЛП(вхЗаголовок));
    ТекстСообщения = ?(СокрЛП(вхТекстСообщения) = "", "Автообмен. Отправитель: " + СокрЛП(лбВхФилиал.Наименование) + " " + ТекущаяДата()+" - "+ТекущееВремя(), СокрЛП(вхТекстСообщения));

    CDOMessage.To = Кому; // [email protected]
    CDOMessage.Subject = ЗаголовокПисьма;
    //        
    CDOMessage.TextBody = ТекстСообщения; // "Отправлено из 1С"
    //    
    CDOMessage.textBodypart.charset="windows-1251";
    Сообщить("Адрес получателя: " + Кому);

    Если вхАвтообмен = 1 Тогда
        //надо прикрепить файлы
        КаталогБазы=СокрЛП(КаталогИБ());    

        стр=КаталогБазы+"PC\" + СокрЛП(лбВхФилиал.ИмяФайлаВыгрузки);
        Сообщить("Имя файла выгрузки: "+стр);
        Если ФС.СуществуетФайл(стр)=1 Тогда
            CDOMessage.AddAttachment(стр);
        Иначе        
            стр=КаталогБазы+"CP\" + СокрЛП(лбВхФилиал.ИмяФайлаВыгрузки);
            Сообщить("Ищем файл: "+стр);
            Если ФС.СуществуетФайл(стр)=1 Тогда
                CDOMessage.AddAttachment(стр);
            Иначе
                Сообщить("Не найден файл выгрузки: "+стр); а=1/0;
            КонецЕсли;
        КонецЕсли;  
    КонецЕсли;

    Сообщить("Идет отправка сообщения ...");
    Попытка
        CDOMessage.Send();
        Сообщить("Отправлен ");
    Исключение
        Сообщить("Не удалось отправить отчет ");
    КонецПопытки;
4 Serginio1
 
19.11.15
18:45
5 SashaNNV
 
22.11.15
14:20
(3) Спасибо за ответ, код отлично работает на windows 8.1, а вот на server 2012 не могу никак запустить. Почему то не открываются COM интерфейсы.
6 Злопчинский
 
22.11.15
14:46
на всяки случай, готовая отсылалка по cdo, работает как интерактивно, так и с получением параметров
http://catalog.mista.ru/public/14131/
7 HawkEye
 
22.11.15
16:29
(5) у меня и на 2012 работает...
8 SashaNNV
 
22.11.15
17:03
(7) Какой у вас на сервере стоит Outlook?
9 SashaNNV
 
22.11.15
17:45
Выяснил что это проблема 1С, т.к. CDO из других приложений срабатывает.
Почему 1С блокирует COM запросы?
10 Злопчинский
 
22.11.15
18:45
(9) выдай пользователю под которым проверяешь - максимальные права в 1с и максимальные права в виндах
11 mishaPH
 
модератор
22.11.15
18:50
Я с этим  CDO намудохался с раскодировкой из бейз64.
Что-то с правами и политиками в домене.. админы так и не смогли решить, сто не работало и вызывало ошибку. Но свежеустановленных компах все работало.

а почту я отправляю через диалмейл. или ром мейл. дешево и сердито и не зависит от доп пакетов виндов или оутлука
12 Serginio1
 
22.11.15
18:51
(11) И никто не хочет использовать (4)
А ведь кроме почты, там вся мощь Net.
13 HawkEye
 
22.11.15
19:09
(8) никакой....зачем он на сервере?
14 SashaNNV
 
22.11.15
20:32
(10) В 1С права админ, win тоже админ.
Какойто глюк с 1С.
1С пререустанавливал, не помогло. Переустанавливать винду не вариант :( Настроек жуть сколько.
15 SashaNNV
 
22.11.15
20:33
(11) Тут похоже проблема не в CDO, а в том что 1С не хочет работать с COM запросами.
16 Serginio1
 
22.11.15
20:37
(15) Попробуй 4 и будет понятно как с COM 1C hf,jnftn
17 SashaNNV
 
22.11.15
22:28
Это очень странно..., но выяснил что у пользователей все работает... а у администратора нет... в чем может быть косяк :)
Естественно все дело происходит под терминалами.
18 mishaPH
 
модератор
22.11.15
22:51
(17) смотри. что я писал. какие-то проблемы с доменными правами.
19 mishaPH
 
модератор
22.11.15
22:51
забей ты на это СДО.
20 mishaPH
 
модератор
22.11.15
22:52
+18 или политиками, которые периодически при изменении не убираются с компов. А остаются и потом ты хрен что найдешь. Вроде включено все и ничего не заблокировано. ан нет.
21 ЧеловекДуши
 
23.11.15
07:03
(17) Судя по рекомендациям от (11), остается только "Format C: /Y" :)
22 Масянька
 
23.11.15
08:13
Процедура ПриОткрытии()

    Отправка         = Форма.Параметр.Получить("Отправка");
    УдалитьФайл     = 1;
    ПечФормаСчета     = 1;
    
    SMTPСервер        = "smtp.gmail.com";
    SMTPПорт        = "465";
    Отправитель     = "....";
    
    Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
        
        Докум      = Форма.Параметр.Получить("Контекст");
        
        Адрес       = СокрЛП(Докум.Контрагент.ЭлПочта);

        Форма.SMTPСервер.Заголовок(SMTPСервер);
        Форма.SMTPПорт.Заголовок(SMTPПорт);
        Форма.Отправитель.Заголовок(Отправитель);
        Форма.Адрес.Заголовок(Адрес);
        
        Тема    = ...;
        Текст    = ...;
    КонецЕсли;
    
    Активизировать("кнОтправить");
    
КонецПроцедуры // ПриОткрытии

Функция Отправить(КаталогДляЗаписи)

    Форма.Отправка.Заголовок("Идет отправка сформированного письма по электронной почте.");

    Письмо = СоздатьОбъект("CDO.Message");
    
    Письмо.To    = Адрес;
    Письмо.From    = Отправитель;
    Письмо.Subject     = Тема;
    Письмо.TextBody = Текст;
    Письмо.TextBodyPart.Charset = "iso-8859-5";

    Письмо.AddAttachment(КаталогДляЗаписи);
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value                 = 2;
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value             = SMTPСервер;
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value         = 1;
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value             = Отправитель;
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value             = ....;
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value         = SMTPПорт;
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value    = 60;
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendmailaddress").Value         = Адрес;
    Письмо.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value             = -1;
    Письмо.Configuration.Fields.Update();
    
    Попытка
        Письмо.Send();
        Форма.Отправка.Заголовок("");
        Форма.Параметр.Установить("Отправка",     1);
        Предупреждение("Успешно отправлено на электронный адрес: " + Адрес);
    Исключение
        Форма.Отправка.Заголовок("");
        Форма.Параметр.Установить("Отправка",     0);
        Предупреждение("Не удалось отправить по причине: " + РазделительСтрок + ОписаниеОшибки());
        Возврат 1;
    КонецПопытки;

КонецФункции // Отправить

//******************************************************************************
cdoSendPassword              = "http://schemas.microsoft.com/cdo/configuration/sendpassword";;      
cdoSendEmailAddress          = "http://schemas.microsoft.com/cdo/configuration/sendemailaddress";;  
cdoAutoPromoteBodyParts      = "http://schemas.microsoft.com/cdo/configuration/autopromotebodyparts"; ;
cdoFlushBuffersOnWrite       = "http://schemas.microsoft.com/cdo/configuration/flushbufferson;write"; ;
cdoHTTPCookies               = "http://schemas.microsoft.com/cdo/configuration/httpcookies"; ;
cdoLanguageCode              = "http://schemas.microsoft.com/cdo/configuration/languagecode"; ;
cdoNNTPAccountName           = "http://schemas.microsoft.com/cdo/configuration/nntpaccountname"; ;
cdoNNTPAuthenticate          = "http://schemas.microsoft.com/cdo/configuration/nntpauthenticate"; ;
cdoNNTPConnectionTimeout     = "http://schemas.microsoft.com/cdo/configuration/nntpconnectiontimeout"; ;
cdoNNTPServer                = "http://schemas.microsoft.com/cdo/configuration/nntpserver"; ;
cdoNNTPServerPickupDirectory = "http://schemas.microsoft.com/cdo/configuration/nntpserverpickupdirectory"; ;
cdoNNTPServerPort            = "http://schemas.microsoft.com/cdo/configuration/nntpserverport"; ;
cdoNNTPUseSSL                = "http://schemas.microsoft.com/cdo/configuration/nntpusessl"; ;
cdoPostEmailAddress          = "http://schemas.microsoft.com/cdo/configuration/postemailaddress"; ;
cdoPostPassword              = "http://schemas.microsoft.com/cdo/configuration/postpassword"; ;
cdoPostUserName              = "http://schemas.microsoft.com/cdo/configuration/postusername"; ;
cdoPostUserReplyEmailAddress = "http://schemas.microsoft.com/cdo/configuration/postuserreplyemailaddress"; ;
cdoPostUsingMethod           = "http://schemas.microsoft.com/cdo/configuration/postusing"; ;
cdoSaveSentItems             = "http://schemas.microsoft.com/cdo/configuration/savesentitems"; ;
cdoSendEmailAddress          = "http://schemas.microsoft.com/cdo/configuration/sendemailaddress"; ;
cdoSendPassword              = "http://schemas.microsoft.com/cdo/configuration/sendpassword"; ;
cdoSendUserName              = "http://schemas.microsoft.com/cdo/configuration/sendusername"; ;
cdoSendUserReplyEmailAddress = "http://schemas.microsoft.com/cdo/configuration/senduserreplyemailaddress"; ;
cdoSendUsingMethod           = "http://schemas.microsoft.com/cdo/configuration/sendusing"; ;
cdoSMTPAccountName           = "http://schemas.microsoft.com/cdo/configuration/smtpaccountname"; ;
cdoSMTPAuthenticate          = "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"; ;
cdoSMTPConnectionTimeout     = "http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout"; ;
cdoSMTPServer                = "http://schemas.microsoft.com/cdo/configuration/smtpserver";;
cdoSMTPServerPickupDirectory = "http://schemas.microsoft.com/cdo/configuration/smtpserverpickupdirectory";;
cdoSMTPServerPort            = "http://schemas.microsoft.com/cdo/configuration/smtpserverport";;
cdoSMTPUseSSL                = "http://schemas.microsoft.com/cdo/configuration/smtpusessl";;
cdoURLGetLatestVersion       = "http://schemas.microsoft.com/cdo/configuration/urlgetlatestversion";;
cdoURLProxyBypass            = "http://schemas.microsoft.com/cdo/configuration/urlproxybypass";;
cdoURLProxyServer            = "http://schemas.microsoft.com/cdo/configuration/urlproxyserver";;
cdoUseMessageResponseText    = "http://schemas.microsoft.com/cdo/configuration/usemessageresponsetext";;


Все работает.
23 Злопчинский
 
23.11.15
11:21
Кстати, надо учесть, что почтовые сервера могут дать отлуп если в поле "От" стоит мыло, не совпадающее с сервером...
24 SashaNNV
 
23.11.15
15:17
(21) Именно так и есть...
25 SashaNNV
 
23.11.15
15:18
Подскажите как дождаться создания файла перед отправкой по почте?

Спасибо.
26 Serginio1
 
23.11.15
15:21
(24) Смотри, что у тебя зарегистрировано по CDO.Message
у клиентов и у администратора
27 Злопчинский
 
23.11.15
15:27
(25) В ОбработкеОжидания проверять наличие файла или настроить через ВК генерацию ВнешнегоСобытия при появлении файла в папке
28 SashaNNV
 
23.11.15
15:28
повторов = 0;
        Пока ФС.СуществуетФайл(ИмяФайлаPDF)=0 цикл
            Для i=1 По 10000 Цикл
            КонецЦикла;
            Состояние("Подготовка файла. Подождите ...");
            повторов = повторов + 1;
            Если повторов = 1000 тогда
                Прервать;
            КонецЕсли;
        конеццикла;

Сделал ожидание таким образом.
29 Масянька
 
23.11.15
15:31
(28)
Функция ПодготовитьФайл(КаталогДляЗаписи)

    Ошибка = 0;

    Форма.Отправка.Заголовок("Идет формирование письма.");

    Попытка
        ЗагрузитьВнешнююКомпоненту("SpreadSheet.dll");
    Исключение
        Предупреждение("Не удалось загрузить компоненту SpreadSheet.dll.");
        Ошибка = 1;
        Возврат Ошибка;
    КонецПопытки;
    
    Йоксель        = СоздатьОбъект("ТабличныйДокумент");
    Конвертер    = СоздатьОбъект("КонвертерExcel");
    
    ВремТабл    = Конвертер.Создать();
    
    Йоксель.ЗагрузитьИзТаблицы(ИсхТабл);
    
    ВремТабл.Листы.Добавить("Счет", Йоксель);
    
    Параметры    =    Йоксель.ПараметрыПечати;
    Параметры.ПолеСверху    = 10;
    Параметры.ПолеСнизу        = 10;    
    Параметры.ПолеСлева        = 10;
    Параметры.ПолеСправа    = 10;
    Параметры.АвтоМасштаб     = 1;
    Параметры.Ориентация    = 1;
    
    //Йоксель.Показать(ИсхТабл);
    
    Конвертер = СоздатьОбъект("Йоксель.ГрафическийКонвертер.PDF");
    
    Конвертер.ВысотаСтраницы = 297*56.7;
    Конвертер.ШиринаСтраницы = 210*56.7;
    Конвертер.КоличествоБитНаПиксел = 24;

    Конвертер.Документ = Йоксель;//это табличный документ от йокселя
    
    Конвертер.ПолеСлева     = 750;
    Конвертер.ПолеСверху     = 300;
    Конвертер.ПолеСправа     = 0;
    Конвертер.ПолеСнизу     = 300;
    Конвертер.ЗаписатьВФайл(КаталогДляЗаписи);    
    
    Йоксель.Очистить();

    Возврат Ошибка;
    
КонецФункции // ПодготовитьФайл
Процедура ПоКнопкеПечать()  
    
    Печать(ИсхТабл);
    ИмяФайла            = "Счет " + СокрЛП(глНомерНаПечать(Докум)) + " от " + СокрЛП(НРег(Формат(Докум.ДатаДок, "Д ДДММММГГГГ")));
    КаталогДляЗаписи    = Строка(КаталогИБ() + "Account\" + ИмяФайла + "pdf");
    
    Если ПодготовитьФайл(КаталогДляЗаписи) = 0 Тогда
        Отправить(КаталогДляЗаписи);
    КонецЕсли;

    Если (УдалитьФайл = 1) Тогда
        // удаляем сохраненный файл
        Попытка
            ФС.УдалитьФайл(КаталогДляЗаписи);
        Исключение
            Сообщить(ОписаниеОшибки());
        КонецПопытки;        
    КонецЕсли;
    
    Форма.Отправка.Заголовок("");
    Форма.Закрыть();
    
КонецПроцедуры // ПоКнопкеПечать

У меня внешняя форма (счет, СФ, накладная). Отправить и Подготовить  - лежит выше (в ветке).
30 Масянька
 
23.11.15
15:34
И это: судя по всему, у тебя ящик у местного провайдера. Да?
31 Злопчинский
 
23.11.15
15:46
(28) Для i=1 По 10000 Цикл ... КонецЦикла;
.
не, это имхо плохо - жди обозримое время формирования

Время1=_GetPerformanceCounter();
Пока (_GetPerformanceCounter()-Время1) < 5000 Цикл //1000тиков=1сек
  а тут проверяй существоание

просто жди 5 сек (или сколько надо) пока файл не появится
32 Serginio1
 
23.11.15
15:47
(25) Если бы обратил внимание на 4 то там есть и Thread.Sleep
Вообще для 7 ки очень полезная штука