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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.05.2010, 10:48   #1  
Roman N. Krivov is offline
Roman N. Krivov
Участник
 
25 / 11 (1) +
Регистрация: 04.05.2010
Адрес: Мир, Россия, Московская область
Отправка файла
Доброго времени суток.

Задача: Класс собирает данные, формирует отчёт в Excel и данный файл отправляет по электронной почте.

Проблема: Не отправляется файл.
X++:
protected void sendMessage()
{
    #define.MsgSubjectFmt("[Axapta] Не разнесенные журналы недопоставок на \%1")
    #define.MsgBodyFmt("<html><body><h1>Не разнесенные журналы</h1><p>Не разнесенные журналы недопоставок на <b>\%1</b></p></body></html>")
    str         subject;
    FreeTxt     body;
    ;

    if (topic)
    {
        subject = strfmt(#MsgSubjectFmt, date2str(CreatedDate, 123, 2, 2, 2, 2, 4));
        body = strfmt(#MsgBodyFmt, date2str(CreatedDate, 123, 2, 2, 2, 2, 4));
        topic.add(subject, body, null, sFileName);
    }

}
Всё отлично. Письмо уходит, но без прикрепленного файла.
После недолгой отладки и изучения классов нашел класс MsgTransmit_Email и в нём метод transmit. Данный метод получает кучу параметров, в том числе и имя передаваемого файла, которое он никак не использует.
X++:
boolean transmit(MsgSubscriberAddress _address, str _subject, str _text, MsgMessage _msg, Filename _filename)
{
    boolean                 ret;
    SysEmailParameters      parameters;
    MsgSubscriberAddress    adrs;
    SysMailerAddresses      tos;
    SysMailerAttachments    attaches;
    int                     i;
    container               conAddress;
    SetEnumerator           se;
 ;
    try
    {
        if (!mailer)
        {
            mailer     = new SysMailer();
            parameters = SysEmailParameters::find();
            mailer.fromAddress(EmplTable::userId2Email(curuserid()));

            if (parameters.DNSServerName)
            {
                mailer.DNSServers().add(parameters.DNSServerName,
                                        parameters.DNSTCPIPRetryCount,
                                        parameters.DNSUDPRetryCount);
            }

            if (parameters.SMTPRelayServerName)
            {
                mailer.SMTPRelayServers().add(parameters.SMTPRelayServerName,
                                              parameters.SMTPPortNumber,
                                              parameters.SMTPServerIPAddress,
                                              parameters.SMTPUserName,
                                              parameters.SMTPPassword);
            }
        }

        tos = mailer.tos();


        conAddress += _address;

        se = setAddress.getEnumerator();
        while (se.moveNext())
        {
            conAddress += se.current();
        }

        for (i = 1; i <= conlen(conAddress); i++)
        {
            adrs = conpeek(conAddress, i);

            if (adrs)
                tos.add(adrs);
        }

        if (tos.cnt() != 0)
        {
            mailer.subject(mailer.encodeHeader(_subject, 'Windows-1251', 1));
            mailer.bodyCharSet('Windows-1251');
            mailer.HTMLBodyCharSet('Windows-1251');
            mailer.htmlBody(_text);
            mailer.sendMail();

            conAddresSuccess = conAddress;
            ret = true;
        }
        else
        {
            ret = false;
        }
    }
    catch(Exception::Error)
    {
        conAddresFailure = conAddress;

        ret = false;
    }

    return ret;
}
Я добавил пару строк, а именно:

X++:
            . . .
            mailer.htmlBody(_text);
            if (_filename)
            {
                mailer.attachments().add(_filename);
            }

            mailer.sendMail();
            . . .
Но письмо не отправляется из-за следующего сообщения: "Метод 'SendMail' в COM-объекте класса 'Dundas.mailer' возвратил код ошибки 0x80004005 (E_FAIL), который означает: Failed to add attachment to the message."

Вопрос: Куда копать?
Все классы выполняются на клиенте и файл тоже находиться на клиенте. Файл доступен на чтение.

Microsoft Business Solution Axapta 3.0 Build #1951.3730/514-193 SP3/OP023071
Старый 17.05.2010, 11:29   #2  
Shirmin Oleg is offline
Shirmin Oleg
Участник
 
89 / 35 (2) +++
Регистрация: 26.03.2004
Думаю, что
X++:
if (_filename)
лучше заменить на
X++:
 if(WinAPI::fileExistsClient(_fileName))
у нас подобная система отлично работает и все проблемы, кот. возникали при отладке - система искала файл там, где его не было (на сервере, например)
За это сообщение автора поблагодарили: Roman N. Krivov (1).
Старый 17.05.2010, 12:23   #3  
Roman N. Krivov is offline
Roman N. Krivov
Участник
 
25 / 11 (1) +
Регистрация: 04.05.2010
Адрес: Мир, Россия, Московская область
Благодаря совету Shirmin Oleg вопрос был решен. Файл действительно создавался и система его видела, но проблема оказалась в следующем: Excel держит файл в монопольном режиме, даже после сохранения. Т.е. с этим файлом ничего нельзя сделать пока не закроешь excel. Следовательно, перед отправкой файла нужно:
X++:
    . . .
    comDocument.SaveAs(_fileName, #xlWorkbookNormal);
    comDocument.finalize();
    comExcelApplication.Quit();
    . . .
    this.sendMessage();
    . . .
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Отправка письма при помощи SysEmailBatch. Проблема с прикреплением файла PSerg DAX: Программирование 11 22.10.2009 10:21
Возникла проблема с получением имени файла при создании своего канала вывода отчетов. oleg_kap DAX: Программирование 3 06.06.2006 14:12
Установить время файла? SnowMan DAX: Программирование 5 01.10.2003 14:42
CRM: отправка файла как сообщение tanyusha DAX: Функционал 10 12.09.2003 21:13
Сохранение файла в таблице Andrew Besedin DAX: Программирование 2 10.06.2003 06:48
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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