28.11.2019, 10:48 | #1 |
Участник
|
AX 2009. Ошибка при отправке письма SysMailer
Добрый день!
Некоторым пользователям не отправляются письма. Выскакивает ошибка: Код: Неудачная попытка определить вариантный тип параметра 1 для метода "fields". Параметр не был правильно инициализирован.\n \n Стек вызовов\n (C)\Classes\COM\fields (C)\Classes\SysMailerConfiguration\fields - Строка 8 (C)\Classes\SysMailer\new - Строка 27 (C)\Classes\MyClass\sendEmail - Строка 29 |
|
28.11.2019, 12:39 | #2 |
Участник
|
Куда копать - я бы поставил точку останова в (C)SysMailerConfiguration на строке 8 и посмотрел, какие параметры в метод fields в COM передаются - на каких работает нормально, а на каких COM выдает ошибку.
Возможно это наведет на какие-то следы того, что что-то не так с параметрами - тогда надо смотреть откуда они берутся и почему такие. |
|
29.11.2019, 07:17 | #3 |
Участник
|
Покажите сперва код в MyClass.sendEmail().
__________________
// no comments |
|
29.11.2019, 07:32 | #4 |
Участник
|
Мы лично в new() ничего не указываем, вот пример корректного использования.
X++: public void run() { SysMailer mailer; SysEmailParameters parameters = SysEmailParameters::find(); ; try { new InteropPermission(InteropKind::ComInterop).assert(); mailer = new SysMailer(); mailer.SMTPRelayServer( parameters.SMTPRelayServerName ? parameters.SMTPRelayServerName : parameters.SMTPServerIPAddress, parameters.SMTPPortNumber, parameters.SMTPUserName, SysEmailParameters::password(), parameters.NTLM ); if (!this.validate()) { throw error("Can't send an email"); } mailer.fromAddress(sender); mailer.tos().appendAddress(recipient); mailer.priority(1); mailer.subject(subject); if (htmlBody) { mailer.htmlBody(htmlBody); } else if (body) { mailer.body(body); } mailer.sendMail(); CodeAccessPermission::revertAssert(); } catch(Exception::Internal) { throw Exception::Internal; } }
__________________
// no comments |
|
02.12.2019, 12:03 | #5 |
Участник
|
Попробуйте копнуть в сторону SSL шифрования. Вот мой допил SysMailer:
X++: void SMTPRelayServer(str _server, int _port=25, str _userName='',str _password='', boolean _useNTLM=false, boolean _useSSL=true) { ; _fields.add(#SmtpServer,_server); _fields.add(#SmtpServerPort,_port); //BAH273 20.11.2018 -> if (_useSSL) { _fields.add(#SmtpUseSSL, 1); } //BAH273 20.11.2018 <- if (_useNTLM) { _fields.add(#SmtpAuthenticate,2); } else if (_userName) { //basic authentication _fields.add(#SmtpAuthenticate,1); _fields.add(#SmtpSendUserName,_userName); _fields.add(#SmtpSendUserPassword,_password); } _fields.resync(); } X++: #define.SmtpUseSSL ('http://schemas.microsoft.com/cdo/configuration/smtpusessl')
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат! |
|
05.12.2019, 12:40 | #6 |
Участник
|
Цитата:
X++: public boolean sendEmail() { #define.Event("Event") str liq_message; SysMailer liq_Mailer; SysMailerAddressField liq_tos; SysEmailMessageTable message; SysEmailTable emailTable; boolean liq_mailInitialized; Responsibility_ZTR responsibility; SysUserInfo sysUserInfo; SysCompanyUserInfo sysCompanyUserInfo; boolean ret = false; void liq_initMail() { SysEmailParameters parameters = SysEmailParameters::find(); InteropPermission interopPermission; ; interopPermission = new InteropPermission(InteropKind::ComInterop); interopPermission.assert(); liq_Mailer = new SysMailer(); if(parameters.smtpRelayServerName) { liq_Mailer.SMTPRelayServer(parameters.smtpRelayServerName, parameters.smtpPortNumber, parameters.smtpUserName, SysEmailParameters::password(), parameters.ntlm); } else { liq_Mailer.SMTPRelayServer(parameters.smtpServerIPAddress, parameters.smtpPortNumber, parameters.smtpUserName, SysEmailParameters::password(), parameters.ntlm); } liq_mailInitialized = true; } ; subjectMail = this.setSubjectMail(); liq_message = this.setMessage(); emailTable = SysEmailTable::find(#Event); while select EmplId from responsibility { select UserId from sysCompanyUserInfo where sysCompanyUserInfo.EmplId == responsibility.EmplId join Email from sysUserInfo where sysUserInfo.Id == sysCompanyUserInfo.UserId; if(!liq_mailInitialized) liq_initMail(); if (liq_Mailer != null && SysEmailDistributor::validateEmail(sysUserInfo.Email)) { liq_Mailer.fromAddress(emailtable.SenderAddr); liq_Mailer.subject(subjectMail); liq_tos = liq_Mailer.tos(); liq_tos.clear(); liq_Mailer.tos().appendAddress(sysUserInfo.Email); liq_Mailer.priority(1); liq_Mailer.htmlBody(liq_message); liq_Mailer.sendMail(); ret = true; } } return ret; } |
|
05.12.2019, 17:15 | #7 |
Участник
|
Еще одно предположение. sysUserInfo.Email - 255 символов, а расширенный тип данных Email - 80 символов. Может где-то адрес обрезается и становится неверным. У меня такое было, когда у пользователя несколько адресов, общей длинной больше 80 символов. Правда не помню какую ошибку давало.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат! |
|
|
|