Доброго времени суток.
Задача: Класс собирает данные, формирует отчёт в 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