SysMailer - на пенсию.
Вот код, который использует CDO.Message напрямую и отправляет почту через сервер smtp.office365.com
X++:
client static void sendMailByCDO( str _Addresses, // список адресов через ';', допускается 1 адрес без ';'
str _Subject,
str _Body,
int _MaxRetry = 5
)
{
COM msg;
COM cfg;
COM cfgFields;
COM cfgField;
COM msgFields;
COM msgField;
int retrycnt = 0;
;
new InteropPermission(InteropKind::ComInterop).assert();
cfg = new COM('CDO.Configuration');
cfgFields = cfg.Fields();
cfgField = cfgFields.item('http://schemas.microsoft.com/cdo/configuration/smtpauthenticate');
cfgField.value(1);
cfgField = cfgFields.item('http://schemas.microsoft.com/cdo/configuration/sendusing');
cfgField.value(2);
cfgField = cfgFields.item('http://schemas.microsoft.com/cdo/configuration/smtpserver');
cfgField.value(GM_QCSettings::eMailSMTPServer());
cfgField = cfgFields.item('http://schemas.microsoft.com/cdo/configuration/smtpserverport');
cfgField.value(GM_QCSettings::eMailSMTPPort());
cfgField = cfgFields.item('http://schemas.microsoft.com/cdo/configuration/sendusername');
cfgField.value(GM_QCSettings::eMailSMTPLoginAccount());
cfgField = cfgFields.item('http://schemas.microsoft.com/cdo/configuration/sendpassword');
cfgField.value(GM_QCSettings::eMailSMTPPassword());
cfgField = cfgFields.item('http://schemas.microsoft.com/cdo/configuration/smtpusessl');
cfgField.value(GM_QCSettings::eMailSMTPuseSSL());
cfgFields.update();
msg = new COM('CDO.Message');
msg.configuration(cfg);
msgFields = msg.Fields();
msgField = msgFields.item('urn:schemas:mailheader:content-type');
msgField.value('text/html; charset="KOI8-R"');
msgFields.update();
msg.From(GM_QCSettings::eMailSMTPFromName() + '<' + GM_QCSettings::eMailSMTPFromAddress() + '>');
msg.To(_Addresses);
msg.subject(_Subject);
msg.htmlBody(_Body);
try
{
msg.send();
}
catch
{
warning('Произошла ошибка при выполнении метода send() COM-объекта CDO.Message');
retrycnt++;
if(retrycnt < _MaxRetry)
{
sleep(1000);
retry;
}
}
if(retrycnt)
warning(strfmt("Сделано повторных попыток отправки: %1", retrycnt));
if(retrycnt == _MaxRetry)
error("Отправить письмо не удалось");
CodeAccessPermission::revertAssert();
msg = null;
cfg = null;
cfgFields = null;
cfgField = null;
msgFields = null;
msgField = null;
}
Необходимые пояснения.
1. Статические методы на GM_QCSettings просто возвращают хранимые в базе параметры отправки почты.
2. Используемый порт - "обычный" 25-й, а не рекомендованный MS 587-й. С 587-м ничего не получилось.
3. "Обнуление" ком-объектов в конце работы - это не для красоты, а мера против непонятных глюков с ними, которые возникали при попытках вызвать метод с малыми интервалами времени между вызовами.
4. Отправка этим способом работает медленно по сравнению с Outlook'ом. Причина этого мне неизвестна.
5. eMailSMTPuseSSL() == 1