26 июл. 2011 г.

Отправка e-mail из 1С с помощью IMessage

Программная среда 1С предоставляет богатый набор средств для быстрой разработки приложений. Однако, при решении нестандартных задач ее средств бывает недостаточно.

На работе была поставлена задача отправлять e-mail к которому прикреплялся файл. Стандартный компонент работал не так как надо: файл этот имел нестандартное расширение и при отправке его получателю, свойство Content-Type устанавливалось в application/octet-stream, а по требованию получателя нужно было text/plain. "Всемирный разум ответа" не дал. Отправка сообщений происходила с сервера Windows 2008, а установка почтовых клиентов не входило в планы администраторов. После не долгих поисков решение было найдено: CDO.Message это COM объект для работы с почтовыми сообщениями. Так как это COM, то его можно использовать в любой среде программирования, где есть средства работы с ним. В качестве примера приведу код для 1С:

objMessage = Новый COMОбъект("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Сервера; //IP или URL
objMessage.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = НомерПортаSMTP; //обычно 22
objMessage.Configuration.Fields.Item("urn:schemas:mailheader:Content-Type").Value = "text/plain; charset=windows-1251";
objMessage.Subject = "Subject test";
objMessage.From = ЕМейлОтправителя; //вида name@domain.ru
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(); //отправляем письмо

Конечно данную задачу можно было решить проще: Просто присвоить файлу расширение txt?, а при вложении дать ему какое надо. Однако IMessage дает нам много больше возможностей, чем стандартный механизм 1С. Подробности на сайте Microsoft.
http://msdn.microsoft.com/en-us/library/aa579703%28v=EXCHG.80%29.aspx

2 комментария:

Unknown комментирует...

Здравствуйте,
если есть возможность и мысли, поделитесь,пож-та.
Написал обработку, которая шлёт письма из 1С через CDO и smtp на локальный почтовый сервер Kerio. Всё работает отлично.
1С у меня на терминальном сервере и когда писал и тестировал обработку, заходил на сервер под доменной учетной записью admin. Никакие внешние компоненты не используются.
Теперь я пытаюсь войти на терминальный сервер 1С под любой другой доменной учетной записью (в том числе с правами доменного администратора), захожу в 1С под той же самой учеткой и та же самая обработка не отправляет письмо с ошибкой :
CDO.Message.1: Транспорту не удалось подключиться к серверу.

Проверил логи на почтовом сервере, когда возникает проблема.
[18/Dec/2012 23:08:18][3480] {smtps} Task 103 handler BEGIN
[18/Dec/2012 23:08:18][3480] {smtps} Task 103 handler starting
[18/Dec/2012 23:08:18][3480] {smtps} SMTPS server session begin; client connected from 192.168.10.4:50361
[18/Dec/2012 23:08:18][3480] {smtps} Sent SMTP greeting to 192.168.10.4:50361
[18/Dec/2012 23:08:18][3480] {smtps} Connection to SMTP server 192.168.10.4 lost: (10054) Удаленный хост принудительно разорвал существующее подключение.
[18/Dec/2012 23:08:18][3480] {smtps} SMTP server session end
[18/Dec/2012 23:08:18][3480] {smtps} Task 103 handler END

Никак не могу понять в чём проблема.
В инеренет и на форумах подобной проблемы не нашёл.
Заранее спасибо. nico20 at pisem.net


mirspo комментирует...

Причин может быть много, но мне кажется, что ключевой момент здесь - это сообщение в логе:
{smtps} Connection to SMTP server 192.168.10.4 lost: (10054) Удаленный хост принудительно разорвал существующее подключение
Проверьте через telnet (
http://www.1c-galaxy.ru/forum5/topic18164/)

Архив блога