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, 12:44   #9  
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   #10  
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:04   #11  
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, 13:48   #12  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Почему бы не использовать для отправки класс SysEmailBatch ?

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

см например SysEmailSystemTable::sendMail()
Старый 27.01.2011, 14:00   #13  
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, 14:14   #14  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
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  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Я для отправки писем со вложенными файлами в пакетных заданиях использую класс SysMailer (это в сущности COM('CDO.Message')). Без проблем отрабатывает и на стороне клиента и на стороне сервера.
__________________
Дмитрий
Старый 27.01.2011, 16:10   #16  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Danm, можно пример с attachment? или ссылку понятную для начинающих (класса SysMailer) ?
Спасибо
Старый 27.01.2011, 16:23   #17  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Можно просто в аксапте по перекрёстным ссылкам посмотреть где вызывается метод SysMailer.sendMail(), там и будут примеры из стандартного функционала, либо здесь запустить поиск по слову SysMailer.
Лучше конечно использовать оба варианта.
__________________
Дмитрий
Старый 27.01.2011, 19:39   #18  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от 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...
пока не очень понятно
Что то про это было написано тут http://axapta.mazzy.ru/lib/email/

Если кратко - то так:
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"); //имя пакетной группы, нужно создать такую е
}
Если нужна отправка онлайн - то последняя строка - SysEmailBatch.run();
За это сообщение автора поблагодарили: ice (2), mikki_messer (1).
Старый 30.01.2011, 10:45   #19  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
воспользовалась вторым вариантом без шаблонов.
Добавила в мой класс в метод run.
Почему-то не находит файл который надо прикреплять. Письмо приходит без него. При запуске нет никаких сообщений об ошибке.
И письмо попадает в спам корзину. Тоже не очень хорошо - не все её проверяют и обращают внимание что там прибавилось письмо.

если написать реальный адрес в поле от кого, то письмо попадает во входящие. Одной головной болью меньше
добавила проверку WInAPI::fileExists(_fileName), возвращает true , но прикреплять не хочет

Последний раз редактировалось timaluhs; 30.01.2011 в 11:12.
Старый 30.01.2011, 11:43   #20  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Почему-то не находит файл который надо прикреплять. Письмо приходит без него. При запуске нет никаких сообщений об ошибке.
У вас WInAPI::fileExists(_fileName) возвращает true на клиенте, а отправка писем происходит на стороне сервера. И там WinAPIServer::fileExists(_fileName) скорее всего возвращает false. Таким образом можно прикрепить к письму только файлы с сетевым путём типа "\\сервер\папка\файл".
__________________
Дмитрий
Теги
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:50.