• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

7.7 Отправка Почты

  • Автор темы olga13
  • Дата начала
O

olga13

Добрый день! Вопрос по Rom-mail. Третьего дня без видимых причин перестала работать процедура получения почты через обработку ожидания. Вылетает на команде П.Подключиться("Прием"). Причем та же процедура, вызываемая через обычную обработку, прекрасно работает. В чем может быть причина?
 
D

demetrius2003

Вылетает и что-то сообщает? Дополнительная инфа есть? "Та же процедура выполняемая через обычную обработку..." Обычная это V7Mail из V7Plus что-ли? Может настройки SMTP сервера поменялись а Вы и не знаете? Вообще с данного компа почта через этот SMTP сервер уходит? Может брандмауэр пакеты режет? CRC у самой Rom-mail.dll совпадает с оригиналом, а то может она того... В том то и проблема, что причины видимой нет, но мы то знаем, что она есть. Более того. их может быть очень много. Надо всего-лишь начать их перебирать.
 
O

olga13

Вылетает и что-то сообщает? Дополнительная инфа есть? "Та же процедура выполняемая через обычную обработку..." Обычная это V7Mail из V7Plus что-ли? Может настройки SMTP сервера поменялись а Вы и не знаете? Вообще с данного компа почта через этот SMTP сервер уходит? Может брандмауэр пакеты режет? CRC у самой Rom-mail.dll совпадает с оригиналом, а то может она того... В том то и проблема, что причины видимой нет, но мы то знаем, что она есть. Более того. их может быть очень много. Надо всего-лишь начать их перебирать.

Код:
	П = СоздатьОбъект("AddIn.AddInMail");
П.СерверПриема = СокрЛП(Константа.СерверПриема);
П.ПортПриема = "110";
П.Логин = СокрЛП(Константа.Логин);
П.Пароль = СокрЛП(Константа.Пароль);
П.ОставлятьНаСервере = 1;
П.ПоказыватьПредупреждения = 0;
П.КаталогВложений = СокрЛП(Константа.КаталогПочтыВходящей);
П.Таймаут = 15;
//подключение
Если П.Подключиться("Прием") = 0 Тогда
Сообщить("Не удалось подключиться к почтовому серверу для получения почты","!");
Возврат;
КонецЕсли;

Это кусок глобального модуля. Его вызывает ОбработкаОжидания() и обработка "ПолучениеПочты", в которой есть на форме кнопка "Получение почты". Так вот, если открыть обработку, нажать кнопку - все отлично подключается и получается. Если срабатывает ОбработкаОжидания() - то П.Подключиться("Прием") = 0, дальше Возврат. SMTP-сервер работает нормально, письма уходят. Но отправка осуществляется только в ручном режиме, через обработку "ОтправкаПочты".
 
O

olga13

Опытным путем удалось установить, что сбой не зависит от места вызова процедуры. В обоих случаях процедура то работает, то не работает. Насколько я понимаю, можно сделать вывод, что дело не в 1С. Через TheBat все работает, через браузер тоже. Где же тогда копать?
 
D

demetrius2003

Знаете, у меня почтовая программа IncrediMail. В ней четыре учётки. Так вот учётка на rambler регулярно сообщает, что, мол, ошибка подключения. Приходится по несколько раз давить на кнопку "Get mail". прежде чем соединение установится нормально. Кто его знает, что там у них не так. Дайте возможность программе подключиться десяток-другой раз прежде чем возвращаться ни с чем. Как-то вот так:
Код:
	//подключение
тСчетчик = 0;
тСостояние = П.Подключиться("Прием");
Пока тСостояние = 0 Цикл
Если (тСостояние = 0) И (тСчетчик > Константа.МаксимальноеКоличествоПопытокПодключения) Тогда
Сообщить("Не удалось подключиться к почтовому серверу для получения почты","!");
Возврат;
КонецЕсли;
тСостояние = П.Подключиться("Прием");
тСчетчик = тСчетчик + 1;
КонецЦикла;
 
E

evgenyatam

П.Таймаут = 15;

попробуйте увеличить.
 
O

olga13

Знаете, у меня почтовая программа IncrediMail. В ней четыре учётки. Так вот учётка на rambler регулярно сообщает, что, мол, ошибка подключения. Приходится по несколько раз давить на кнопку "Get mail". прежде чем соединение установится нормально. Кто его знает, что там у них не так. Дайте возможность программе подключиться десяток-другой раз прежде чем возвращаться ни с чем. Как-то вот так:
Код:
	//подключение
тСчетчик = 0;
тСостояние = П.Подключиться("Прием");
Пока тСостояние = 0 Цикл
Если (тСостояние = 0) И (тСчетчик > Константа.МаксимальноеКоличествоПопытокПодключения) Тогда
Сообщить("Не удалось подключиться к почтовому серверу для получения почты","!");
Возврат;
КонецЕсли;
тСостояние = П.Подключиться("Прием");
тСчетчик = тСчетчик + 1;
КонецЦикла;

Попробовала, результат тот же. Покрутила обработку в цикле. Выявилась странная закономерность - всегда 5 успешных попыток, после них 600-670 неудачных (если быть точным - в моем примере 600, 670, 660, 661). Но успешных всегда 5 подряд. Ерунда какая-то...
 
D

demetrius2003

Кхм. ОС какая? Нет ли в журнале сообщений событий типа "Достигнут предел безопасности для TCP/IP, налагаемый на количество попыток одновременных TCP-подключений."? "netstat -a" в момент отправки чего показывает? Проблема то скорее всего и не в 1С вовсе. Числа шибко "красивые", не находите? Признавайтесь! Грешите поди частенько? :) Вам бы ещё на virusinfo.info сходить. Ещё бы одну вероятную проблему откинуть. Начните с журналов сообщений и нетстата.
 
Д

Дайнеко

Действительно похоже на проблему самого инструментария. Или ОС или библиотека dll.
Могу только провести аналогию: я сделал клиента в 8-ке на встроенных средствах. Так вот отправка успешно работает,
но при небольшом количестве писем в сеансе (5-8). А при большем метод слетает и выдает ругательное сообщение (не помню).
И причину фиг найдешь.
 
P

puh14

Я в свое время отказался и от ром-майл и от диал майл. Просто microsoft cdo. И никаких левых компонент.
 
O

olga13

Я в свое время отказался и от ром-майл и от диал майл. Просто microsoft cdo. И никаких левых компонент.

Попробовала через CDO. Выдает ошибку:
Na?aa? ioeeiiee iaei eee ianeieuei aa?ania iieo?aoaeae. Ioeeee na?aa?a: 501 syntax error

Код:
	Попытка
objMessage = Createobject("CDO.Message");
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = АдресSMTPСервера;
objMessage.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = НомерПортаSMTP;
objMessage.Configuration.Fields.Item("urn:schemas:mailheader:Content-Type").Value = "text/plain; charset=windows-1251";
objMessage.Subject = "Subject test";
objMessage.From = Отправитель;
objMessage.To = Получатель;
iBp = objMessage.AddAttachment(ПутьВложения);
iBp.Fields.Item("urn:schemas:mailheader:content-type").Value = "text/plain; name=" + iBp.FileName;
iBp.Fields.Item("urn:schemas:mailheader:content-transfer-encoding").Value = "7bit";

objMessage.Configuration.Fields.Update();
objMessage.Fields.Update();
iBp.Fields.Update();
objMessage.Send(); //отправляем письмо

Исключение
Сообщить("Ошибка отправки сообщения!");	
Сообщить("Описание ошибки: " + ОписаниеОшибки());	
КонецПопытки;

Что опять не так?
И как сделать, чтобы сообщение об ошибке выдавалось в нормальном виде, а не кракозябрами?
 
P

puh14

У вас точно аутенификация на почте виндовая? зачем-то есть шифрование, а SSL нету.. Если не надо - отрубите.

насчет кракозябр - сохраняйте лучше сообщение об ошибках в текстовый файл - там хоть кодировку поменять можно. А как от них совсем избавится - не подскажу, это давние танцы с бубном (по сути он пытается отобразить текст с использованием неправильной таблицы кодировки, ее можно подменить на правильную в реестре, но вот только этих таблиц кодировок там тьма)

Я пользовал вот такое

Код:
Процедура ОтправкаПочтыВиндой(СерверОтправки,ИмяОтправителя,ПарольПользователя,АдресПолучателя,Файл = "",ТекстСообщения,Описание,Отправитель,ПользовательОС)

oMessage = СоздатьОбъект("CDO.Message");
//Кому

oMessage.To = АдресПолучателя;
//От кого

oMessage.From = Отправитель;
//Заголовок сообщения

oMessage.Subject = Описание;
//Текст сообщения (может быть текстовым или в формате HTML)

oMessage.TextBody = ТекстСообщения;
//Добавляем вложение

oMessage.AddAttachment(Файл);
//Если возникает проблема с кодировками (обычно, если в системе не установлен русский язык), то можно перед отправкой добавить строку //вида:

oMessage.TextBodyPart.Charset = "windows-1251";
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").value = 2;

//В этом параметре по умолчанию используется значение 1, которое означает использование каталог Pickup.

//Указать почтовый сервер можно так:

oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").value = СерверОтправки;

//Настройка режима аутентификации производится при помощи того же объекта CDO.Configuration:

oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").value=2;

//Значение 1 этого параметра означает, что используется базовая аутентификация, значение 0 - без аутентификации (анонимно), значение 2

//- аутентификация NTLM.

//Имя пользователя и пароль можно передать точно так же:

//oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").value = ИмяОТправителя;

//oMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword").value = ПарольПользователя;


//Иногда необходимо также определить использование специфического порта (отличного от 25), будет или нет использоваться SSL и время //тайм-аута:

oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").value = 25;

oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").value = 0;


oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").value = 60;


//После любых изменений, вносимых в конфигурацию, изменения нужно обязательно сохранить:

oMessage.Configuration.Fields.Update();
//и только после вызывать метод Send():

oMessage.Send();



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

брал вроде отсюда
 
O

olga13

У вас точно аутенификация на почте виндовая? зачем-то есть шифрование, а SSL нету.. Если не надо - отрубите.

насчет кракозябр - сохраняйте лучше сообщение об ошибках в текстовый файл - там хоть кодировку поменять можно. А как от них совсем избавится - не подскажу, это давние танцы с бубном (по сути он пытается отобразить текст с использованием неправильной таблицы кодировки, ее можно подменить на правильную в реестре, но вот только этих таблиц кодировок там тьма)

Я пользовал вот такое

Спасибо огромное, с отправкой все получилось! А что с получением почты делать? Насколько я поняла, CDO работает только с протоколом SMTP...
 
Д

Дайнеко

Ну-у такого не может быть... Выходит этот объект придуман только для рассылки спама. Может встречались примеры только для отправки.
 
P

puh14

К сожалению получение писем только по MAPI, то бишь работает только с exchange server.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!