HelpF.pro

Работа с почтой с помощью внешней компоненты DialMail

Скачать компоненту dialmail.dll и примеры работы в 1С Скачивать файлы может только зарегистрированный пользователь!

Подключение:
Код 1C v 7.x
 Процедура ПриОткрытии()

Путь = КаталогИБ() + "DialMail.dll";
Если ЗагрузитьВнешнююКомпоненту(Путь) = 0 Тогда Сообщить("Неудачная попытка загрузить DialMail.dll"); КонецЕсли;

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


Отправка почты:
Код 1C v 7.x
 Процедура ОтправитьПочту()
ОтправкаПочты = СоздатьОбъект("AddIn.SMTP");
ОтправкаПочты.РабочийКаталог=СокрЛП(КаталогИБ());
ОтправкаПочты.УстановитьКодировкуИСпособКодирования(14, 1);
ОтправкаПочты.MakeContentDescriptionTag = 0;
ОтправкаПочты.ПочтоваяПрограмма = "Имя почтовой программы";
//В моем случае ошибки пишутся в отдельный каталог в текстовые файлы, имена которых соответствуют дате.
ВыбФайл = СокрЛП(КаталогОшибок) +"\"+ СокрЛП(ДатаЧисло(ТекущаяДата())) + СокрЛП(ДатаМесяц(ТекущаяДата()))+ СокрЛП(ДатаГод(ТекущаяДата())) + ".txt";
//имя файла - вложения должно быть в кавычках.
ВыбФайл = """" + ВыбФайл + """";
// От кого, Кому, Копии - это адреса почты.
ОтправкаПочты.СоздатьПисьмо(ОтКого,Кому,СокрЛП(СпрПочта.Копии),"Ошибки обмена в " + СокрЛП(Константа.Магазин.Наименование),,"Данное письмо сформировано автоматически. Смотри вложение",СокрЛП(ВыбФайл));
Если ОтправкаПочты.Подключиться("smtp.mail.ru","25",ИмяПользователя,Пароль)=0 тогда
Сообщить("Не смогли подключиться к SMTP-серверу");
КонецЕсли;
Если ОтправкаПочты.ОтправитьВсеПисьма(0,1,0) = -100 Тогда
Сообщить("Успешно отправлено");
КонецЕсли;
КонецПроцедуры


******************************* FAQ **************************************
(1) Как организовать дозвон? (тонкости организации дозвона)

1. Во первых, надо вручную создать подключение в списке удаленного
доступа (win 2000 - пуск, настройка, сеть и уд.доступ, создание
нового подключения).
Или создать подключение с помощью компоненты (см. "Атрибуты
подключений" и "СохранитьНастройкиПодключения()").
2. Если импульсный набор, то перед номером телефона надо ставить "p"
напр "p212121", тоновый - по умолчанию или "t". Если необходимо ждать
гудка после цифры, то ставится "w", напр. "t8w0952223333".
3. (только если RAS-сервер находится под управлением Windows 95-98)
Если система-клиент NT, 2000 или XP тогда в свойствах созданного
в п.1 соединения в разделе "Безопасность" выберите возможность
отправления незашифрованного пароля (win 2000 - закладка
"безопасность", п. Дополнительные (особые параметры), кн
"Настройка", п.Разрешить следующие протоколы, галочка
ТОЛЬКО на "Незашифрованный пароль PAP")
4. При вызове дозвона, необходимо использовать имя созданного в
п.1 подключения в качестве первого параметра.
5. При использовании процедуры "ОбработкаВнешнегоСобытия" (последний
параметр = 1 в Дозвониться (RASDIAL), ПолучитьПисьмо,
ПолучитьВсеПисьма (POP3), ОтправитьПисьмо, ОтправитьВсеПисьма(SMTP)
форма подключения в обязательном порядке должна быть в "фокусе",
иначе события могут теряться. Вернее они не теряются, а начинают
(пытаются) обрабатываться в глобальном модуле.

*********************************************************************
(2) Через какие объекты добраться до общих методов ?

Если методы и свойства "общие" это значит, что у объектов POP3 и SMTP есть одинаково действующие
методы и свойства.
Код 1C v 7.x
 Получ=СоздатьОбъект("AddIn.POP3");
Отпр=СоздатьОбъект("AddIn.SMTP");
Получ.РабочийКаталог="c:\Export\";
Отпр.РабочийКаталог="c:\Import\";


!!! Отметим при этом, что Получ.РабочийКаталог<>Отпр.РабочийКаталог !!!

"РабочийКаталог" - одинаковое свойство для объектов POP3 и SMTP

*********************************************************************
(3) Почему при дозвоне компонента 3 раза подряд генерирует
событие "Начало Аутенфикации"?.

Дозвон происходит через системную DLL'ку RasDial.
Все события, которые генерируются этой DLL'кой перенаправляются
компонентой DialMail в 1С (процедура ОбработкаВнешнегоСобытия(...))
Так что от компоненты в данном случае ничего не зависит.
Причина этого (можно предположить) лежит на уровне того сервера,
к которому идет подсоединение (кто мешает аутенфикацию
проводить 3 раза или 3-мя различными способами?).

*********************************************************************
(4) При дозвоне (отправке, приеме почты) у меня в форме перестают
генерироваться события в процедуре ОбработкаВнешнегоСобытия(...),
хотя дозвон (отправка, прием почты) продолжает свою работу.

Это глюк 1С. Проявляется иногда во время работы компоненты при
сворачивании окон программ,открытия новых окон программ, при
потере фокуса 1С-Предприятием. Лечится это следующим образом.
На самом деле все события, сгенерированные компонентой, не пропадают
если процедуру ОбработкаВнешнегоСобытия(...) разместить
в глобальном модуле. В этом случае нам нужна будет глобальная
переменная - контекст нашей формы. Все переменные, которые нам
понадобятся в процедуре ОбработкаВнешнегоСобытия(...), можно
сделать либо глобальными, либо разместить на нашей форме в виде
невидимых реквизитов.

КоличествоСобытий - реквизит, размещенный на нашей форме
Код 1C v 7.x
  //Глобальный модуль
========================================
Перем КонтекстНашейФормы Экспорт;
...
Процедура ВзятьКонтекст(Конт) Экспорт
КонтекстНашейФормы=Конт;
КонецПроцедуры

Процедура ОсвободитьКонтекст() Экспорт
КонтекстНашейФормы=-1;
КонецПроцедуры
...
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
...
Если КонтекстНашейФормы<>-1 тогда
КонтекстНашейФормы.КоличествоСобытий=КоличествоСобытий+1;
КонтекстНашейФормы.Форма.Обновить(0);
КонецЕсли;
...
КонецПроцедуры
...
КонтекстНашейФормы=-1;
========================================

Модуль нашей формы
========================================
Перем Дозвон;

Процедура ПриОткрытии()
...
ЗагрузитьВнешнююКомпоненту("DialMail.dll");
Дозвон=СоздатьОбъект("AddIn.RasDial");

ВзятьКонтекст(Конт);
...
КонецПроцедуры

Процедура ПриЗакрытии()
...
ОсвободитьКонтекст(Конт)
...
КонецПроцедуры

Процедура НашДозвон()
Дозвон.Дозвониться("Мое соединение",
"логин","пароль","p1055555",1);
КонецПроцедуры

========================================

*********************************************************************
(5) Можно ли использовать дозвон для разговоров по телефону?

Нет. Компонента не предназначена для простых звонков на
телефон. Только для установления "сетевого" соединения между
2-мя компьютерами (например, между клиентским компьютером и
компьютером провайдера).

*********************************************************************
(6) Хотелось бы использовать компоненту DialMail в проектах,
написанных на Visual Basic, Delphi и т.д.

Компонента 1С хоть и полностью COM объект, но интерфейс
особый, свой - 1С-ий. Чтобы работать с данной компонентой
из других средств разработки, надо полностью переписывать
компоненту. Мне это не нужно, да и нет времени.

*********************************************************************
(7) Дайте исходники!

Модули Synapse, на которых базируются почтовые клиенты компонеты, лежат
в http://www.ararat.cz/synapse/ , могу прислать примеры компоненты
и интерфейсный модуль RasUnit.pas (для облегченной работы с RAS API -
тоже кстати из инета). Могу оказать посильную помощь, если что-то с этими
исходниками будет неясно. Но полностью исходники выложу в свободное
распространение только когда не буду поддерживать компоненту.

*********************************************************************
(8) Почему при передаче/приеме почты возникает ошибка 10054?

10054 - "Connection reset by peer", т.е. "Соединение сброшено удаленной
системой"
Происходит в результате:
1. Выключения сокета на удаленной машине в
рез-те ресета или таймаута
2. Вызывается локальной машиной при обнаружении потери
соединения (например, если дозванивались по dial-up и соединение
разорвалось - свойственно плохим модемам и плохим тел. линиям)
3. Связано с неправильным использованием "потоков" при приеме/передаче
Например, последовательность
Код 1C v 7.x
        pop3.ПолучитьВсеПисьма(0,1,1);
pop3.Отключиться();

может вызвать именно эту ошибку.
Пояснение: Т.к. получение запущено в отдельном потоке (3-ий параметр=1),
команда отключения вызовет закрытие сокета. Поток, который принимает почту,
из-за закрытия сокета "внешним процессом" инициирует данную ошибку -
фактически причина №2.

*********************************************************************
(9) RasDial: Как задать импульсный/тоновый набор номера,
паузу для ожидания гудка, и т.п. ?

Начинаться номер телефона может с "p" или "t" - cоответственно импульсный
или тоновый набор номера, по умолчанию - тоновый набор номера.
"w" - пауза, дождемся гудка - "линия свободна", "," - пауза в не помню сколько
времени (1 сек?) Пример задания телефонного номера: p8w095,,1234567
В данном примере - 'p' - импульсный набор, после '8' пауза, дождемся гудка,
после '095' подождем 2 сек и продолжим набирать номер. Более подробную
информацию по данным управляющим символам можно найти на просторах интернета.

*********************************************************************
Компонента DIALMAIL. (c) SWA corp. (e-mail:SWA@list.ru)
Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1468.html