|
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, 13:04 | #9 |
newborn in DAX
|
класс property Run on - Called from
public class mlm_SendEmailWithAttachment extends RunBaseBatch { } у нас пару таких классов запускается на сервер по ночам Basic -> Inquires -> Bach job это и называется старым пакетником? |
|
27.01.2011, 14:00 | #10 |
newborn in DAX
|
Danm, просто гениально, об этом я не подумала. Почему-то считала что permition относятся к файлу, чтобы его можно было читать.
оказывается тут всё по другому. Респект и уважение. Работает УРА. Всем огромное спасибо. Что бы я без форума делала???? выдаёт ещё какие-то ошибки, попробую разобраться. Но первое письмо доходит, а на втором почему- то опять требует Request for the permission of type 'InteropPermission' failed. в конце метода надо ещё какие-то танцы с бубном по поводу 'InteropPermission' или нет? Последний раз редактировалось timaluhs; 27.01.2011 в 14:05. Причина: добавление |
|
27.01.2011, 12:44 | #11 |
Участник
|
Цитата:
У них свойство RunOn=Server и без вызова new InteropPermission( InteropKind::ClrInterop).assert() вэбсервис не проинициализируешь. Надеюсь assert() вызывается до инициализации System.Net.Mail.MailAddress ?
__________________
Дмитрий |
|
27.01.2011, 12:52 | #12 |
Administrator
|
А.. ну да. Извиняюсь - это я тогда с чем-то перепутал (может с COM-ом).
__________________
Возможно сделать все. Вопрос времени |
|
27.01.2011, 13:48 | #13 |
Участник
|
Почему бы не использовать для отправки класс SysEmailBatch ?
В Ax 2009 работает без проблем, файлы прикрепляет. К тому же можно использовать шаблоны почтовых сообщений... см например SysEmailSystemTable::sendMail() |
|
27.01.2011, 15:33 | #14 |
Участник
|
Я для отправки писем со вложенными файлами в пакетных заданиях использую класс SysMailer (это в сущности COM('CDO.Message')). Без проблем отрабатывает и на стороне клиента и на стороне сервера.
__________________
Дмитрий |
|
27.01.2011, 16:10 | #15 |
newborn in DAX
|
Danm, можно пример с attachment? или ссылку понятную для начинающих (класса SysMailer) ?
Спасибо |
|
27.01.2011, 16:23 | #16 |
Участник
|
Можно просто в аксапте по перекрёстным ссылкам посмотреть где вызывается метод SysMailer.sendMail(), там и будут примеры из стандартного функционала, либо здесь запустить поиск по слову SysMailer.
Лучше конечно использовать оба варианта.
__________________
Дмитрий |
|
19.09.2011, 16:24 | #17 |
Участник
|
Цитата:
Сообщение от timaluhs
У меня тут проблема. Надо посылать почту с прикреплённым файлом. Нашла дот.нет код. с клиентской машины посылает как часы. Теперь задачка усложнилась. Не все пользуются клиентом, по большей части народ пользуется ТС. Там нет никакого почтового агента, соответственно письмо не посылается. Написан класс, который будет запускаться из batch на сервере и посылать письмо каждые 5-10 минут. Всё путём но почему-то на первой строчке выдаёт ошибку
Request for the permission of type 'InteropPermission' failed. Object 'CLRObject' could not be created... (Хотя я все же рекомендую пользоваться "стандартным" для Ax способом - класс SysEmailBatch) Проверен на ax 2009 X++: static server boolean 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; ; new InteropPermission(InteropKind::ClrInterop).assert(); 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(); attachment = new System.Net.Mail.Attachment(FileName); attachementCollection.Add(attachment); smtpClient = new System.Net.Mail.SmtpClient(SMTPServer); smtpClient.Send(mailmessage); mailmessage.Dispose(); attachment.Dispose(); return true; } catch(Exception::CLRError) { error(AifUtil::getClrErrorMessage()); return false; } } |
|
19.09.2011, 17:57 | #18 |
Участник
|
Цитата:
Я как раз из-за проблем с темой письма не стал продолжать "игры" с .NET в плане отправки электронных писем. Продолжаю юзать старый добрый SysMailer.
__________________
Дмитрий |
|
19.09.2011, 20:26 | #19 |
Участник
|
|
|