17.05.2010, 10:48 | #1 |
Участник
|
Отправка файла
Доброго времени суток.
Задача: Класс собирает данные, формирует отчёт в 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();
. . . Вопрос: Куда копать? Все классы выполняются на клиенте и файл тоже находиться на клиенте. Файл доступен на чтение. Microsoft Business Solution Axapta 3.0 Build #1951.3730/514-193 SP3/OP023071 |
|
17.05.2010, 11:29 | #2 |
Участник
|
Думаю, что
X++: if (_filename) X++: if(WinAPI::fileExistsClient(_fileName)) |
|
|
За это сообщение автора поблагодарили: Roman N. Krivov (1). |
17.05.2010, 12:23 | #3 |
Участник
|
Благодаря совету Shirmin Oleg вопрос был решен. Файл действительно создавался и система его видела, но проблема оказалась в следующем: Excel держит файл в монопольном режиме, даже после сохранения. Т.е. с этим файлом ничего нельзя сделать пока не закроешь excel. Следовательно, перед отправкой файла нужно:
X++: . . . comDocument.SaveAs(_fileName, #xlWorkbookNormal); comDocument.finalize(); comExcelApplication.Quit(); . . . this.sendMessage(); . . . |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|