06.11.2012, 16:03 | #1 |
Участник
|
DAX2009, чтение почты "в обход" Outlook
Добрый день, коллеги!
Подскажите, кто имеет опыт работы с приемом почты в DAX2009 - можно ли ее получать без установки Outlook? Т.е. какой-то сервис, где можно задать параметры (POP3-сервер, логин-пароль и т.д.), и чтобы получать сообщения согласно этим настройкам. Из того что мне известно - функциональность класса Mapi, но он работает если есть Outlook. Без Outlook можно использовать SysMailer, где через SMTPRelayServer задаются параметры подключения - но он только на отправку. Больше ничего найти не удалось. Понятное дело, что Аксапта разрабатывалась не с целью стать почтовым клиентом Поэтому конечно если никак без Outlook почту не получить - будем его ставить. Но для начала хотелось бы убедиться что действительно других выходов нет. |
|
06.11.2012, 16:18 | #2 |
Сенбернар
|
__________________
Best Regards, Roman |
|
06.11.2012, 16:31 | #3 |
Участник
|
Неплохо указать какой конкретно используется почтовый сервер
|
|
06.11.2012, 19:21 | #4 |
Участник
|
Почтовых клиентов, как грязи: http://social.msdn.microsoft.com/sea...0imap%20client
|
|
07.11.2012, 12:32 | #5 |
----------------
|
вот так извратиться можно:
Поднимаете где-то в сети внутренний smtp сервер (в винде есть) На основном настраиваете на него релай для нужного ящика Полученный набор eml-файлов либо парсите аксой с использованием rfc(номер не помню), либо берете бесплатную библиотеку и на ее основе пишите сервис читающий файлы и передающий данные в аксу. |
|
07.11.2012, 12:44 | #6 |
Участник
|
Посмотрел по ссылке - получается что все равно что-то ставить придется. Не Outlook - так CDO (иначе MAPI.Session будет выдавать ошибку COM объекта), или еще какие-то внешние библиотеки подключать.
Т.е. в обычной Аксапте никаких средств нет? Из того что в References также ничего нельзя использовать? Попробую наверно более конкретно пояснить что мне надо. Исходная инфа: - pop3-сервер 'pop3.<домен>.ru' - номер порта для него - логин - пароль Согласно данным параметрам надо подключиться к почтовому ящику логина и прочесть входящую почту. Сразу скажу - в этом деле я ламер, т.к. всегда программировал в стандартном приложении Аксапты, а подобными "извращениями" заниматься не приходилось. Поэтому, если у кого есть варианты готового кода, был бы рад увидеть, потому что даже если известно что с помощью .NET это можно осуществить, то надо еще понять к чему там обращаться и какие методы юзать ) |
|
07.11.2012, 13:39 | #7 |
NavAx
|
|
|
|
За это сообщение автора поблагодарили: FrolovAndy (1). |
09.11.2012, 13:46 | #8 |
Участник
|
Огромное спасибо за DLL, работает! Но... пока что только на клиенте.
Т.е. закинул dll-файл в windows\system32, написал джобик который читает почту с помощью GetMail - работает отлично! Но на AOS-е такое уже не прокатывает, причем ошибка вылетает на new DLL('srvutils.dll'). Пробовал чуть менять, подсовывая другую dll лежащую в той же system32, например new DLL('aepdu.dll') - проходит без ошибки. В чем причина? Может что-то не так делаю? На всякий случай - клиент на XP, AOS - Server 2008 |
|
09.11.2012, 13:55 | #9 |
Участник
|
Цитата:
|
|
09.11.2012, 14:16 | #10 |
Участник
|
Да, похоже что на AOSе 64-битные windows. А на клиенте 32, потому и работает. Правда, в указанное статье написано что ошибка должна на call возникать, а у меня раньше, на new DLL(), причем получается избирательно, не работает только с этой dll, а с другими все в порядке (как они будут работать на call, проверить не могу, т.к. надо знать какие они функции поддерживают).
На клиенте запускать - не вариант, нужно именно на сервере. А как тогда можно с помощью .NET осуществить? Так понимаю что srvutils.dll тут уже бесполезна и нужно что-то принципиально другое? Жалко конечно, она-то как раз подошла бы... |
|
09.11.2012, 14:46 | #11 |
Участник
|
C Net сборкой еще проще, например по ссылке выше берете сборку OpenPop.Net
1. Засовываете ее в GAC на вашем сервере 2. Регистрируете сборку в Ax (AOT - References) А дальше переписываете на X++ пример отсюда http://hpop.sourceforge.net/exampleFetchAllMessages.php |
|
|
За это сообщение автора поблагодарили: FrolovAndy (1), Eloy (1). |
09.11.2012, 16:29 | #12 |
Участник
|
Понял, только сразу вопрос:
Как это лучше сделать? Попробовал через Администрирование -> Microsoft .NET Framework 2.0 Configuration, там Add an Assembly to the Assembly Cache, выбираю собственно OpenPop.dll (из архива, который скачал по ссылке), и система ругается что The assembly must have a strong name (name, version and public key). Наверно опять я где-то накосячил? Или может дело в том что dll лежит в "левой" папке (в System32 не положил т.к. прав нет)? Извиняюсь, ступил кажется - кажется надо было выбирать другую dll, из папки Signed strong name. Сейчас попробую Последний раз редактировалось FrolovAndy; 09.11.2012 в 16:48. Причина: предположительно найдено решение |
|
09.11.2012, 17:09 | #13 |
Участник
|
Так, в общем в GAC успешно добавил, теперь следующая проблема - сделал Reference OpenPop, запустив клиента на AOSе. Reference создался, но теперь проблема другая - использование сборки компилируется только там, а если например уже на другой машине клиента запускаю, то например такая конструкция OpenPop.Pop3.Pop3Client - не компилится.
Я правильно понимаю, что надо openPop.dll тиражировать на все клиентские машины? |
|
09.11.2012, 17:21 | #14 |
Участник
|
Цитата:
Я правильно понимаю, что надо openPop.dll тиражировать на все клиентские машины?
Да, если сервер 64-bit, GACов 2шт, желательно везде разложить. |
|
12.11.2012, 12:36 | #15 |
Участник
|
О, ну отлично, всё работает, получил то что нужно было! Спасибо!
А вот про это: а как понять что GACа 2 шт.? Я вижу только один, в Windows\Assembly. Ну и самое главное что все и так работает. Наверно, могу не париться по этому поводу? |
|
12.11.2012, 15:27 | #16 |
Участник
|
О, а для работы на отправку почты в DAX2009 уже оказывается есть готовая .NET сборка, все реализуется с использованием System.Net.Mail.SmtpClient!
Все-таки интересно сделано, для отправки почты всё предусмотрено, а вот для получения приходится так или иначе поизвращаться |
|
12.11.2012, 19:48 | #17 |
Участник
|
Цитата:
Ну и самое главное что все и так работает. Наверно, могу не париться по этому поводу?
Последний раз редактировалось handy-comp; 12.11.2012 в 19:53. |
|
09.01.2013, 18:25 | #18 |
Участник
|
Всем спасибо, очень полезная тема оказалась. Разобрался с OpenPop.Net, всё супер работает. Единственное пришлось вложения вытаскивать через рефлексию в AX 2009. Вот рабочий пример, может облегчит жинь кому-то:
X++: OpenPop.Pop3.Pop3Client pop3Client; OpenPop.Mime.Message message; OpenPop.Mime.Header.MessageHeader messageHeader; OpenPop.Mime.Header.RfcMailAddress rfcMailAddress; OpenPop.Mime.MessagePart messagePart; System.Type type, typeE; System.Object aList, etr; System.Reflection.MethodInfo methodGetEnumerator, methodMoveNext; System.Reflection.PropertyInfo propertyCount, propertyCurrent; System.Object[] nil; System.IO.FileInfo fileInfo; FileName fileName; int i, messageCount, attachmentCount; str subject, messageBody, email; ; pop3Client = new OpenPop.Pop3.Pop3Client(); try { // Connect to the server pop3Client.Connect(POPServerName, POPPort, false); // Authenticate ourselves towards the server pop3Client.Authenticate(POPUserName, POPPassword); // Get the number of messages in the inbox messageCount = pop3Client.GetMessageCount(); info(strFmt("messageCount: %1", messageCount)); // We want to download all messages for (i = 1; i <= messageCount; i++) { message = pop3Client.GetMessage(i); messageHeader = message.get_Headers(); subject = messageHeader.get_Subject(); info(strFmt("Subject: %1", subject)); rfcMailAddress = messageHeader.get_From(); email = rfcMailAddress.get_Address(); info(strFmt("Sender e-mail: %1", email)); messagePart = message.FindFirstPlainTextVersion(); messageBody = messagePart.GetBodyAsText(); info(strFmt("Body: %1", messageBody)); aList = message.FindAllAttachments(); type = aList.GetType(); propertyCount = type.GetProperty("Count"); nil = new System.Object[0](); attachmentCount = propertyCount.GetValue(aList, nil); info(strFmt("attachmentCount: %1", attachmentCount)); methodGetEnumerator = type.GetMethod("GetEnumerator"); etr = methodGetEnumerator.Invoke(aList, nil); typeE = etr.GetType(); methodMoveNext = typeE.GetMethod("MoveNext"); while(methodMoveNext.Invoke(etr, nil)) { propertyCurrent = typeE.GetProperty("Current"); messagePart = propertyCurrent.GetValue(etr, nil); fileName = messagePart.get_FileName(); info(fileName); fileInfo = new System.IO.FileInfo(strFmt(@"C:\AxEx\%1", fileName)); messagePart.Save(fileInfo); } //pop3Client.DeleteMessage(i); } } catch { error("Произошла ошибка при загрузке почты!"); } pop3Client.Disconnect(); pop3Client.Dispose(); pop3Client = null; |
|
|
За это сообщение автора поблагодарили: FrolovAndy (1), handy-comp (1). |
19.02.2013, 11:15 | #19 |
Участник
|
По поводу того как получить вложение - привожу свой код, посмотрите, я его давно уже закодил, сейчас честно говоря уже лень вникать и анализировать, поэтому привожу полностью. Может быть, там то же самое что и у вас, а может и как-то по-другому я сделал )
X++: public void run() { OpenPop.Pop3.Pop3Client pop3Client; OpenPop.Mime.Message message; OpenPop.Mime.MessagePart messagePart; OpenPop.Mime.Header.MessageHeader messageHeader; OpenPop.Mime.Header.RfcMailAddress fromAddress; System.Net.Mail.SmtpClient smtpClient; System.Net.Mail.MailMessage mailMessage; System.Collections.ArrayList arrayList; System.Collections.IEnumerator enumerator; System.IO.FileInfo fileInfo; TS_ImportFolderEmailSettings folderEmailSettings; Counter attachCount; Counter messageCount; Counter ix; FileName attachFileName; str strFromAddress; str subject; str 20 subject20; str body; int posOfNO; str fileExtension; str fileName; boolean moveNext; GM_ExpImpParameters expImpParameters = GM_ExpImpParameters::find(); ; new InterOpPermission(InteropKind::ClrInterop).assert(); pop3Client = new OpenPop.Pop3.Pop3Client(); pop3Client.Connect(expImpParameters.Pop3Server, expImpParameters.Pop3Port, false); pop3Client.Authenticate(expImpParameters.FromEmailAccount, expImpParameters.FromEmailPassword); messageCount = pop3Client.GetMessageCount(); for (ix = 1; ix <= messageCount; ix ++) { message = pop3Client.GetMessage(ix); messageHeader = message.get_Headers(); subject = messageHeader.get_Subject(); posOfNO = strscan(subject, 'NO', 1, strlen(subject)); if (posOfNO) { subject = strltrim(strrtrim(strdel(subject, posOfNO, strlen(subject) - posOfNO + 1))); // участок кода, чтобы не удалялась почта, являющаяся подтверждением экспорта subject20 = subject; select firstonly folderEmailSettings where folderEmailSettings.EmailSubject == subject20 && folderEmailSettings.ExportReply == NoYes::Yes; if (folderEmailSettings.RecId) { continue; } // <-- arrayList = message.FindAllTextVersions(); enumerator = arrayList.GetEnumerator(); moveNext = enumerator.MoveNext(); if (moveNext) { messagePart = enumerator.get_Current(); body = messagePart.GetBodyAsText(); body = strltrim(strrtrim(body)); arrayList = message.FindAllAttachments(); attachCount = arrayList.get_Count(); folderEmailSettings = TS_ImportFolderEmailSettings::find(subject, body); if (folderEmailSettings.ImpFileFolder) { if (this.checkFolder(folderEmailSettings.ImpFileFolder)) { if (attachCount == 1) { enumerator = arrayList.GetEnumerator(); moveNext = enumerator.MoveNext(); if (moveNext) { messagePart = enumerator.get_Current(); attachFileName = messagePart.get_FileName(); fileExtension = any2str(conpeek(fileNameSplit(attachFileName),3)); if (fileExtension == #txt) { fileInfo = new System.IO.FileInfo(folderEmailSettings.ImpFileFolder + #FilePathDelimiter + attachFileName); messagePart.Save(fileInfo); smtpClient = new System.Net.Mail.SmtpClient(expImpParameters.SmtpServer, expImpParameters.SmtpPort); fromAddress = messageHeader.get_From(); strFromAddress = fromAddress.get_Address(); mailMessage = new System.Net.Mail.MailMessage(expImpParameters.FromEmail, strFromAddress); subject = messageHeader.get_Subject(); mailMessage.set_Subject('RE:' + subject); smtpClient.Send(mailMessage); } else { error(strfmt("Тип вложенного файла должен быть %1", #txt)); } } else { error("Ошибка вложения сообщения"); } } else { error("Неверное количество вложений в сообщении"); } } } else { error(strfmt("Не определены настройки импорта для %1 по коду %2", subject, body)); } } else { info("У сообщения отсутствует текст"); } } pop3Client.DeleteMessage(ix); } pop3Client.Disconnect(); CodeAccessPermission::revertAssert(); } Оффтоп: Eloy, если не секрет, скажите - ваш никнейм случайно не связан с музыкальной темой? Последний раз редактировалось FrolovAndy; 19.02.2013 в 11:17. |
|
|
За это сообщение автора поблагодарили: Ace of Database (3), Spiker (1), pedrozzz (2), handy-comp (1). |
Теги |
mail, outlook, pop3, получение, почта |
|
|