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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.11.2019, 10:48   #1  
SuperStar88 is offline
SuperStar88
Участник
 
81 / 10 (1) +
Регистрация: 11.08.2017
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  
Pandasama is offline
Pandasama
Участник
 
457 / 134 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Куда копать - я бы поставил точку останова в (C)SysMailerConfiguration на строке 8 и посмотрел, какие параметры в метод fields в COM передаются - на каких работает нормально, а на каких COM выдает ошибку.
Возможно это наведет на какие-то следы того, что что-то не так с параметрами - тогда надо смотреть откуда они берутся и почему такие.
Старый 29.11.2019, 07:17   #3  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Покажите сперва код в MyClass.sendEmail().
__________________
// no comments
Старый 29.11.2019, 07:32   #4  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Мы лично в 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  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Попробуйте копнуть в сторону 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();

}
и в макросе SysMailer добавить строчку
X++:
#define.SmtpUseSSL              ('http://schemas.microsoft.com/cdo/configuration/smtpusessl')
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
Старый 05.12.2019, 12:40   #6  
SuperStar88 is offline
SuperStar88
Участник
 
81 / 10 (1) +
Регистрация: 11.08.2017
Цитата:
Сообщение от dech Посмотреть сообщение
Мы лично в new() ничего не указываем, вот пример корректного использования.
Тоже в new() ничего не указываю, какой-то глюк в обычном функционале
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  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Еще одно предположение. sysUserInfo.Email - 255 символов, а расширенный тип данных Email - 80 символов. Может где-то адрес обрезается и становится неверным. У меня такое было, когда у пользователя несколько адресов, общей длинной больше 80 символов. Правда не помню какую ошибку давало.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка 0x80040211 на одном из аосов при отправке письма at5454 DAX: Программирование 4 20.04.2015 10:33
emeadaxsupport: AX Performance Troubleshooting Checklist Part 1B [Application and AOS Configuration] Blog bot DAX Blogs 0 05.09.2014 21:11
Ошибка при развертывании в AX 2009 Reporting services oleg_e DAX: Администрирование 28 30.07.2013 20:18
Sample Design Patterns: Upgrade to Microsoft Dynamics AX 2009 and issues with the global address book Blog bot DAX Blogs 0 21.12.2010 11:11

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

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

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