AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.01.2011, 10:18   #1  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Посылка письма с прикреплённым файлом через 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  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
А если вместо FileIOPermission воспользоваться InteropPermission ? Программа же явно говорит что ей именно такой permission нужен.
__________________
Дмитрий
Старый 27.01.2011, 11:27   #3  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
поменяла, не помогает
Старый 27.01.2011, 11:51   #4  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
X++:
new InteropPermission( InteropKind::ClrInterop)
вот так инициализируете объект ?
а для вылова ошибки
X++:
    try
    {
    ---
    }
    catch (Exception::CLRError)
    {
        throw error( AifUtil::getClrErrorMessage());
    }
используете ?
__________________
Дмитрий
Старый 27.01.2011, 12:01   #5  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
инициализирую как Вы написали,
catch немного другой... прилагается в первом посте. Честно не думаю, что принципиально важно, что написано в catch. Exception тот же.

и какая связь между требованием permission в строке где создаётся объект System.Net.Mail.MailAddress(sender) - кто посылает письмо?

Последний раз редактировалось timaluhs; 27.01.2011 в 12:05. Причина: довабление
Старый 27.01.2011, 12:03   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,319 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Код исполняется на клиенте? (На сервере насколько я помню - InteropPermission не отрабатывает, или я ошибаюсь?)
__________________
Возможно сделать все. Вопрос времени
Старый 27.01.2011, 12:21   #7  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
на клиенте всё работает, теперь это надо заставить работать на сервер из batch...
Старый 27.01.2011, 12:30   #8  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,319 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от timaluhs Посмотреть сообщение
на клиенте всё работает, теперь это надо заставить работать на сервер из batch...
Сильно подозреваю, что под batch-сервером подразумевается именно служба.
В режиме "старого" пакетника - такое можно было провернуть, создав static-метод на клиенте (static client) и вызвать его из метода run, который вызывает пакетник.
Тут... сильно подозреваю что может и не получиться (надо попробовать).
__________________
Возможно сделать все. Вопрос времени
Старый 27.01.2011, 13:04   #9  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
класс property Run on - Called from

public class mlm_SendEmailWithAttachment extends RunBaseBatch
{
}

у нас пару таких классов запускается на сервер по ночам Basic -> Inquires -> Bach job
это и называется старым пакетником?
Старый 27.01.2011, 14:00   #10  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Red face
Danm, просто гениально, об этом я не подумала. Почему-то считала что permition относятся к файлу, чтобы его можно было читать.
оказывается тут всё по другому. Респект и уважение.
Работает УРА. Всем огромное спасибо. Что бы я без форума делала????

выдаёт ещё какие-то ошибки, попробую разобраться. Но первое письмо доходит, а на втором почему- то опять требует
Request for the permission of type 'InteropPermission' failed.
в конце метода надо ещё какие-то танцы с бубном по поводу 'InteropPermission' или нет?

Последний раз редактировалось timaluhs; 27.01.2011 в 14:05. Причина: добавление
Старый 27.01.2011, 12:44   #11  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Код исполняется на клиенте? (На сервере насколько я помню - InteropPermission не отрабатывает, или я ошибаюсь?)
А как же тогда работают классы, создаваемые для работы с вэбсервисами ?
У них свойство RunOn=Server и без вызова new InteropPermission( InteropKind::ClrInterop).assert() вэбсервис не проинициализируешь.

Цитата:
Сообщение от timaluhs Посмотреть сообщение
инициализирую как Вы написали
Надеюсь assert() вызывается до инициализации System.Net.Mail.MailAddress ?
__________________
Дмитрий
Старый 27.01.2011, 12:52   #12  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,319 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Damn Посмотреть сообщение
А как же тогда работают классы, создаваемые для работы с вэбсервисами ?
У них свойство RunOn=Server и без вызова new InteropPermission( InteropKind::ClrInterop).assert() вэбсервис не проинициализируешь.
А.. ну да. Извиняюсь - это я тогда с чем-то перепутал (может с COM-ом).
__________________
Возможно сделать все. Вопрос времени
Старый 27.01.2011, 13:48   #13  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Почему бы не использовать для отправки класс SysEmailBatch ?

В Ax 2009 работает без проблем, файлы прикрепляет. К тому же можно использовать шаблоны почтовых сообщений...

см например SysEmailSystemTable::sendMail()
Старый 27.01.2011, 15:33   #14  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Я для отправки писем со вложенными файлами в пакетных заданиях использую класс SysMailer (это в сущности COM('CDO.Message')). Без проблем отрабатывает и на стороне клиента и на стороне сервера.
__________________
Дмитрий
Старый 27.01.2011, 16:10   #15  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Danm, можно пример с attachment? или ссылку понятную для начинающих (класса SysMailer) ?
Спасибо
Старый 27.01.2011, 16:23   #16  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Можно просто в аксапте по перекрёстным ссылкам посмотреть где вызывается метод SysMailer.sendMail(), там и будут примеры из стандартного функционала, либо здесь запустить поиск по слову SysMailer.
Лучше конечно использовать оба варианта.
__________________
Дмитрий
Старый 19.09.2011, 16:24   #17  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от timaluhs Посмотреть сообщение
У меня тут проблема. Надо посылать почту с прикреплённым файлом. Нашла дот.нет код. с клиентской машины посылает как часы. Теперь задачка усложнилась. Не все пользуются клиентом, по большей части народ пользуется ТС. Там нет никакого почтового агента, соответственно письмо не посылается. Написан класс, который будет запускаться из batch на сервере и посылать письмо каждые 5-10 минут. Всё путём но почему-то на первой строчке выдаёт ошибку
Request for the permission of type 'InteropPermission' failed. Object 'CLRObject' could not be created...
Привожу пример рабочего кода, который может отправлять сообщения, в т.ч. на серверной стороне. Может кто то захочет "поиграть" с NET

(Хотя я все же рекомендую пользоваться "стандартным" для 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  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от someOne Посмотреть сообщение
Привожу пример рабочего кода, который может отправлять сообщения, в т.ч. на серверной стороне. Может кто то захочет "поиграть" с NET
А если Subject будет состоять из русских символов и в длину будет больше 100 (или даже поменьше, не помню точно), то письма тоже будут нормально читаться ?
Я как раз из-за проблем с темой письма не стал продолжать "игры" с .NET в плане отправки электронных писем. Продолжаю юзать старый добрый SysMailer.
__________________
Дмитрий
Старый 19.09.2011, 20:26   #19  
Mykola Galak is offline
Mykola Galak
Участник
 
40 / 39 (2) +++
Регистрация: 24.01.2008
Адрес: Copenhagen
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Надо посылать почту с прикреплённым файлом.
Создайте шаблон письма в Basic\Setup\E-mail templates. Письмо с прикрепленным файлом можно отослать вызовом серверного метода: \Data Dictionary\Tables\SysEmailTable\Methods\sendMail.
Теги
email batch, atachment

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: Batch processing Blog bot DAX Blogs 0 29.01.2009 17:05
axaptabuilder: How to setup Axapta batch server running as user defined windows service Blog bot DAX Blogs 0 12.04.2007 16:10
Как указать отправителя при передаче письма через Mapi wit DAX: Программирование 1 14.01.2005 17:08

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:26.