27.01.2011, 10:18 | #1 |
newborn in DAX
|
Посылка письма с прикреплённым файлом через batch на серверe
У меня тут проблема. Надо посылать почту с прикреплённым файлом. Нашла дот.нет код. с клиентской машины посылает как часы. Теперь задачка усложнилась. Не все пользуются клиентом, по большей части народ пользуется ТС. Там нет никакого почтового агента, соответственно письмо не посылается. Написан класс, который будет запускаться из batch на сервере и посылать письмо каждые 5-10 минут. Всё путём но почему-то на первой строчке выдаёт ошибку
Request for the permission of type 'InteropPermission' failed. Object 'CLRObject' could not be created Отчего такая непонятная ошибка. Можно как-то как делать отладку в батч? Любые идеи please, я уже несколько дней мучаюсь. причём перестал реагировать на try catch Спасибо вот код X++: public int mlm_SendMailAttachment( str Body, str Subject, str FileName, str to, str sender) { System.Net.Mail.MailAddress mailAddressFrom; System.Net.Mail.MailAddress mailAddressTo; System.Net.Mail.MailMessage mailMessage; System.Net.Mail.Attachment attachment; System.Net.Mail.AttachmentCollection attachementCollection; System.Net.Mail.SmtpClient smtpClient; str SMTPServer; FileIOPermission perm; System.Exception e; ; try { mailAddressFrom = new System.Net.Mail.MailAddress(sender);// вылетает тут mailAddressTo = new System.Net.Mail.MailAddress(to); SMTPServer = SysEmailParameters::find(false).SMTPRelayServerName; mailMessage = new System.Net.Mail.MailMessage(mailAddressFrom, mailAddressTo); mailmessage.set_Subject(Subject); mailmessage.set_Body(Body); mailmessage.set_IsBodyHtml(true); attachementCollection = mailMessage.get_Attachments(); perm = new FileIOPermission(FileName,'rw'); perm.assert(); attachment = new System.Net.Mail.Attachment(FileName); attachementCollection.Add(attachment); smtpClient = new System.Net.Mail.SmtpClient(SMTPServer); smtpClient.Send(mailmessage); CodeAccessPermission::revertAssert(); mailmessage.Dispose(); attachment.Dispose(); return 1; } catch(Exception::CLRError) { info (strfmt("error sent email to ל %1" , to)); info(CLRInterop::getLastException().ToString()); return 0; } } |
|
27.01.2011, 10:37 | #2 |
Участник
|
А если вместо FileIOPermission воспользоваться InteropPermission ? Программа же явно говорит что ей именно такой permission нужен.
__________________
Дмитрий |
|
27.01.2011, 11:27 | #3 |
newborn in DAX
|
поменяла, не помогает
|
|
27.01.2011, 11:51 | #4 |
Участник
|
X++: new InteropPermission( InteropKind::ClrInterop) а для вылова ошибки X++: try { --- } catch (Exception::CLRError) { throw error( AifUtil::getClrErrorMessage()); }
__________________
Дмитрий |
|
27.01.2011, 12:01 | #5 |
newborn in DAX
|
инициализирую как Вы написали,
catch немного другой... прилагается в первом посте. Честно не думаю, что принципиально важно, что написано в catch. Exception тот же. и какая связь между требованием permission в строке где создаётся объект System.Net.Mail.MailAddress(sender) - кто посылает письмо? Последний раз редактировалось timaluhs; 27.01.2011 в 12:05. Причина: довабление |
|
27.01.2011, 12:03 | #6 |
Administrator
|
Код исполняется на клиенте? (На сервере насколько я помню - InteropPermission не отрабатывает, или я ошибаюсь?)
__________________
Возможно сделать все. Вопрос времени |
|
27.01.2011, 12:21 | #7 |
newborn in DAX
|
на клиенте всё работает, теперь это надо заставить работать на сервер из batch...
|
|
27.01.2011, 12:30 | #8 |
Administrator
|
Цитата:
В режиме "старого" пакетника - такое можно было провернуть, создав static-метод на клиенте (static client) и вызвать его из метода run, который вызывает пакетник. Тут... сильно подозреваю что может и не получиться (надо попробовать).
__________________
Возможно сделать все. Вопрос времени |
|
27.01.2011, 12:44 | #9 |
Участник
|
Цитата:
У них свойство RunOn=Server и без вызова new InteropPermission( InteropKind::ClrInterop).assert() вэбсервис не проинициализируешь. Надеюсь assert() вызывается до инициализации System.Net.Mail.MailAddress ?
__________________
Дмитрий |
|
27.01.2011, 12:52 | #10 |
Administrator
|
А.. ну да. Извиняюсь - это я тогда с чем-то перепутал (может с COM-ом).
__________________
Возможно сделать все. Вопрос времени |
|
27.01.2011, 13:04 | #11 |
newborn in DAX
|
класс property Run on - Called from
public class mlm_SendEmailWithAttachment extends RunBaseBatch { } у нас пару таких классов запускается на сервер по ночам Basic -> Inquires -> Bach job это и называется старым пакетником? |
|
27.01.2011, 13:48 | #12 |
Участник
|
Почему бы не использовать для отправки класс SysEmailBatch ?
В Ax 2009 работает без проблем, файлы прикрепляет. К тому же можно использовать шаблоны почтовых сообщений... см например SysEmailSystemTable::sendMail() |
|
27.01.2011, 14:00 | #13 |
newborn in DAX
|
Danm, просто гениально, об этом я не подумала. Почему-то считала что permition относятся к файлу, чтобы его можно было читать.
оказывается тут всё по другому. Респект и уважение. Работает УРА. Всем огромное спасибо. Что бы я без форума делала???? выдаёт ещё какие-то ошибки, попробую разобраться. Но первое письмо доходит, а на втором почему- то опять требует Request for the permission of type 'InteropPermission' failed. в конце метода надо ещё какие-то танцы с бубном по поводу 'InteropPermission' или нет? Последний раз редактировалось timaluhs; 27.01.2011 в 14:05. Причина: добавление |
|
27.01.2011, 14:14 | #14 |
newborn in DAX
|
SomeOne
просто весь интернет пестрит сообщениями что можно послать email без прикреплённого файла, а если с файлом то только код dot.net и все любезно предлагают образцы кода. Попробую посмотреть класс. Спасибо Можно пример или ссылку msdn очень скуп. server static void sendMail( SysEmailSystemId _emailId, LanguageId _language, str _emailAddr, Map _mappings = null, FilenameOpen _attachmentfileName = '', str _xmlData = '', boolean _isTraceable = false, userId _userId = '', boolean _isWithRetries = false) откуда берётся SysEmailSystemId _emailId? где сохраняется body, subject, to, from... пока не очень понятно Последний раз редактировалось timaluhs; 27.01.2011 в 14:37. |
|
27.01.2011, 15:33 | #15 |
Участник
|
Я для отправки писем со вложенными файлами в пакетных заданиях использую класс SysMailer (это в сущности COM('CDO.Message')). Без проблем отрабатывает и на стороне клиента и на стороне сервера.
__________________
Дмитрий |
|
27.01.2011, 16:10 | #16 |
newborn in DAX
|
Danm, можно пример с attachment? или ссылку понятную для начинающих (класса SysMailer) ?
Спасибо |
|
27.01.2011, 16:23 | #17 |
Участник
|
Можно просто в аксапте по перекрёстным ссылкам посмотреть где вызывается метод SysMailer.sendMail(), там и будут примеры из стандартного функционала, либо здесь запустить поиск по слову SysMailer.
Лучше конечно использовать оба варианта.
__________________
Дмитрий |
|
27.01.2011, 19:39 | #18 |
Участник
|
Цитата:
Сообщение от timaluhs
SomeOne
просто весь интернет пестрит сообщениями что можно послать email без прикреплённого файла, а если с файлом то только код dot.net и все любезно предлагают образцы кода. Попробую посмотреть класс. Спасибо Можно пример или ссылку msdn очень скуп. server static void sendMail( SysEmailSystemId _emailId, LanguageId _language, str _emailAddr, Map _mappings = null, FilenameOpen _attachmentfileName = '', str _xmlData = '', boolean _isTraceable = false, userId _userId = '', boolean _isWithRetries = false) откуда берётся SysEmailSystemId _emailId? где сохраняется body, subject, to, from... пока не очень понятно Если кратко - то так: 1. Настраиваем параметры почтового сервера в форме – администрирование – настройки – параметры электронной почты 2. Создаем шаблон почтового сообщения в форме основное – настройка – шаблоны сообщений эл. Почты. Установить бокс «показать электронную почту системы» При этом поле «код электронной почты» - и будет SysEmailSystemId. Если на закладке «Разное» в поле «Группа пакетов» указать код группы пакетов – сообщение будет отправляться сервером пакетной обработки, а не в режиме «онлайн». Это удобно, например, когда рассылка осуществляется, например, при обновлении записи таблицы. Позволяет отделить процесс отправки сообщения в отдельный поток, и пользователю не придется ожидать окончание отправки сообщения, например при обновлении записи. В нижнем гриде так же добавляем новую запись – там можно указывать шаблоны, каждый для отдельного языка. При нажатии кнопки «шаблон» - открывается окно редактора, где вводится шаблон самого сообщения. В шаблоне тела сообщения можем использовать макросы типа: “Уважаемый %User%, запрашиваемый вами файл с отчетом %ReportName% в прикрепленном файле”. Кстати, так же шаблоном можно указать и тему сообщения, например '%subject%' в поле "тема" 3. Сам код отправки сообщения: X++: static server void mail_testServer(Args _args) { map mappings; ; mappings = new map(Types::String, Types::String); mappings.insert("User", "Василий Пупкин"); mappings.insert("ReportName", "Отчет о движении денежных средств"); mappings.insert("subject", "Тестовое сообщение"); SysEmailSystemTable::sendMail('test', "ru", 'pupkin@mail.ru', mappings); } Вот код отправки сообщения через сервер пакетной обработки X++: static void Job25(Args _args) { SysEmailBatch SysEmailBatch; ; SysEmailBatch = new SysEmailBatch(); SysEmailBatch.parmEmailAddr("im@mail.ru"); SysEmailBatch.parmMessageBody("test"); SysEmailBatch.addAttachmentfileName("C:\\boot.ini"); SysEmailBatch.parmSenderAddr("ss@mail.ru"); SysEmailBatch.sendToBatch("mail"); //имя пакетной группы, нужно создать такую е } |
|
|
За это сообщение автора поблагодарили: ice (2), mikki_messer (1). |
30.01.2011, 10:45 | #19 |
newborn in DAX
|
воспользовалась вторым вариантом без шаблонов.
Добавила в мой класс в метод run. Почему-то не находит файл который надо прикреплять. Письмо приходит без него. При запуске нет никаких сообщений об ошибке. И письмо попадает в спам корзину. Тоже не очень хорошо - не все её проверяют и обращают внимание что там прибавилось письмо. если написать реальный адрес в поле от кого, то письмо попадает во входящие. Одной головной болью меньше добавила проверку WInAPI::fileExists(_fileName), возвращает true , но прикреплять не хочет Последний раз редактировалось timaluhs; 30.01.2011 в 11:12. |
|
30.01.2011, 11:43 | #20 |
Участник
|
У вас WInAPI::fileExists(_fileName) возвращает true на клиенте, а отправка писем происходит на стороне сервера. И там WinAPIServer::fileExists(_fileName) скорее всего возвращает false. Таким образом можно прикрепить к письму только файлы с сетевым путём типа "\\сервер\папка\файл".
__________________
Дмитрий |
|