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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.08.2013, 12:43   #1  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
Почту перевели на outlook.office365.com. SysMailer стал бесполезен?
Ax2009. Офис 2010 sp2.

Кто-нибудь слал почту в такой ситуации, разумеется из кода Ax?
Старый 27.08.2013, 12:58   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
outlook.office365.com != "SysMailer стал бесполезен"

поднимите релей и пользуйтесь
Старый 27.08.2013, 13:06   #3  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
А можно подробнее?

Если Вы про вызов SysMailer.SMTPRelayServer(), то использовать его как раньше не получается.

Последний раз редактировалось AR®; 27.08.2013 в 13:32.
Старый 27.08.2013, 17:11   #5  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
По-видимому, проблема в том, что у меня в параметрах SMTP для учетной записи стоит шифрование TLS, а где это сказать в методах SysMailer, я не знаю.
Старый 30.08.2013, 13:00   #6  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
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

Последний раз редактировалось AR®; 30.08.2013 в 13:09.
За это сообщение автора поблагодарили: kashperuk (5).
Старый 02.09.2013, 13:17   #7  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Добавлю свои 5 копеек, все то же самое но с использование .Net, глюков пока не замечено.
X++:
public static boolean sendMailNet(
                    str         mailTo,
                    str         mailToCC = '',
                    str         mailSubject,
                    str         mailBody,
                    str         mailServer,
                    str         mailFrom,
                    str         userName,
                    str         userPass,
                    boolean     isBodyHTML = false,
                    int         port = 25,
                    boolean     highMailImportance = false,
                    str         attachmentFile = '',
                    str         mailToBCC = '',
                    container   conAttachFileName = conNull() //отправка нескольких файлов
                )
{
    System.Net.Mail.SmtpClient              smtpClient;
    System.Net.Mail.MailMessage             mailMessage;
    System.Net.Mail.MailAddress             mailAddressFrom;
    System.Net.NetworkCredential            networkCredential;
    System.Net.Mail.AttachmentCollection    attachmentCollection;
    System.Net.Mail.Attachment              attachment;

    int                                     countMails;
    boolean                                 fileExists;
    int                                     countAttachFiles;
    int                                     n;
    str                                     tmpFileName;
    str                                     strInfo;
    boolean                                 res = false;
    ;


    new InteropPermission(InteropKind::CLRInterop).assert();


    if (!mailServer)
    {
        error('Не указан почтовый сервер!');
        return false;
    }

    if (!mailFrom)
    {
        error('Не указан обратный адрес отправителя!');
        return false;
    }

    try
    {
        mailAddressFrom = new System.Net.Mail.MailAddress(mailFrom);
    }
    catch
    {
        error("Адрес отправителя не задан или некорректен");
        return false;
    }

    mailMessage = new System.Net.Mail.MailMessage();

    mailMessage.set_From(mailAddressFrom);

    if(mailTo != "")
    {
        countMails += CDOMailNet::createMailAddressCollection(mailTo, mailMessage.get_To()); //создание коллекции
// адресатов (ниже по тексту код)
    }

    if(mailToCC != "")
    {
        countMails += CDOMailNet::createMailAddressCollection(mailToCC, mailMessage.get_CC()); //создание коллекции
// адресатов (ниже по тексту код)
    }

    if(mailToBCC != "")
    {
        countMails += CDOMailNet::createMailAddressCollection(mailToBCC, mailMessage.get_Bcc()); //создание коллекции 
// адресатов (ниже по тексту код)
    }

    if(countMails == 0)
    {
        error("Не заданы адреса получателей");
        return false;
    }

    mailMessage.set_Subject(mailSubject);

    if(highMailImportance)
    {
        mailMessage.set_Priority(System.Net.Mail.MailPriority::High);
    }

    if(attachmentFile != "")
    {
        conAttachFileName += attachmentFile;
    }

    countAttachFiles = conLen(conAttachFileName);
    if(countAttachFiles > 0)
    {
        attachmentCollection = mailMessage.get_Attachments();
        for(n=1 ; n <= countAttachFiles; n++)
        {
            tmpFileName = conpeek(conAttachFileName, n);
            if(tmpFileName != "")
            {
                fileExists = System.IO.File::Exists(tmpFileName);
                if(fileExists == true)
                {
                    try
                    {
                        attachment = new System.Net.Mail.Attachment(tmpFileName);
                        attachmentCollection.Add(attachment);
                    }
                    catch( Exception::CLRError)
                    {
                        error(strFmt("Ошибка отправки почты: %1", AifUtil::getClrErrorMessage()));
                        return false;
                    }
                }
                else
                {
                    strInfo = strFmt(@"Не найден файл для отправки: %1", tmpFileName);
                    if(isBodyHTML)
                        mailBody = strInfo + @"<br /><br />" + mailBody;
                    else
                        mailBody = strInfo + "\n\n" + mailBody;

                    error(strInfo);
                }
            }
        }
    }

    mailMessage.set_IsBodyHtml(isBodyHTML);
    mailMessage.set_Body(mailBody);

    try
    {
        smtpClient = new System.Net.Mail.SmtpClient(mailServer, port);
        if(userName != "")
        {
            smtpClient.set_UseDefaultCredentials(false);
            networkCredential = new System.Net.NetworkCredential(userName, userPass);
            smtpClient.set_Credentials(networkCredential);
        }
        smtpClient.Send(mailMessage);
        res = true;
    }
    catch( Exception::CLRError)
    {
        error(strFmt("Ошибка отправки почты: %1", AifUtil::getClrErrorMessage()));
    }


    if(attachmentCollection != null)
        attachmentCollection.Dispose();

    if(mailMessage != null)
        mailMessage.Dispose();

    return res;
}

//создание коллекции адресатов
protected static int createMailAddressCollection(str _strEmails, System.Net.Mail.MailAddressCollection  _mailAddressCollection)
{

    List                                listEmails;
    ListEnumerator                      le;
    eMail                               eMail;
    int                                 countMails = 0;
    ;

    if(_strEmails && _mailAddressCollection != null)
    {
        listEmails = strSplit(_strEmails, ";, ");
        le = listEmails.getEnumerator();

        while (le.moveNext())
        {
            eMail = le.current();
            if(eMail != "")
            {
                try
                {
                    _mailAddressCollection.Add(eMail);
                    countMails ++;
                }
                catch( Exception::CLRError)
                {
                    warning(strFmt("Адрес: %1 будет пропущен, причина: %2", eMail, AifUtil::getClrErrorMessage()));
                }
            }
        }
    }

    return countMails;
}
За это сообщение автора поблагодарили: gl00mie (5), AR® (1).
Старый 02.09.2013, 13:50   #8  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
В какой версии DAX проверен код? Что такое CDOMailNet?
Старый 02.09.2013, 14:06   #9  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Цитата:
Сообщение от AR® Посмотреть сообщение
В какой версии DAX проверен код? Что такое CDOMailNet?
Работает в Ax 2009, CDOMailNet - мое название класса, но это не важно, назовите как хотите, код самого статического метода приведен внизу.
Старый 02.09.2013, 14:21   #10  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
Вот что получил (для smtp.office365.com):
Ошибка отправки почты: Серверу SMTP требовалось защищенное соединение, или подлинность клиента не была установлена. Ответ сервера: 5.7.1 Client was not authenticated.

Где сказать, что использовать SSL ?

Справедливости ради: через smtp.yandex.ru отправилось "на ура".

Последний раз редактировалось AR®; 02.09.2013 в 14:39.
Старый 02.09.2013, 14:37   #11  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Цитата:
Сообщение от AR® Посмотреть сообщение
Вот что получил:
Ошибка отправки почты: Серверу SMTP требовалось защищенное соединение, или подлинность клиента не была установлена. Ответ сервера: 5.7.1 Client was not authenticated.

Где сказать, что использовать SSL ?
Прошу прощения, у меня просто не было необходимости использовать SSL, попробуйте добавить smtpClient.EnableSsl(true), вот здесь:

X++:
...
smtpClient = new System.Net.Mail.SmtpClient(mailServer, port);
smtpClient.EnableSsl(true);
...

Последний раз редактировалось handy-comp; 02.09.2013 в 14:41.
Старый 02.09.2013, 14:52   #12  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
Только вот так:
X++:
smtpClient.set_EnableSsl(true);
Помогло. Причем получилось и через 587-й порт (что не получилось через CDO).
Как бы еще добиться, что бы при отправке не задумывалось?
Как из Outlook'а 2010 (уходит сразу).
Старый 02.09.2013, 15:00   #13  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Цитата:
Сообщение от AR® Посмотреть сообщение
...
Как бы еще добиться, что бы при отправке не задумывалось?
Как из Outlook'а 2010 (уходит сразу).
На счет задумчивости данного примера ни чего не могу сказать,
существенных тормозов при работе у себя не заметил, а работает код в достаточно нагруженном режиме - идет большая рассылка документов.
Старый 02.09.2013, 15:16   #14  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
Хотите верьте, хотите нет - на минимальном письме без вложений ждем 8-10 секунд, из Outlook'а на той же машине - секунда или полторы.

И еще просветите, пожалуйста, почему если закомментировать добавление в коллекцию, то выпадает Exception с поясняющим текстом "Ошибка отправки почты: Необходимо указать получателя."
Разве добавлять в коллекцию обязательно?
Старый 02.09.2013, 15:28   #15  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Цитата:
Сообщение от AR® Посмотреть сообщение
Хотите верьте, хотите нет - на минимальном письме без вложений ждем 8-10 секунд, из Outlook'а на той же машине - секунда или полторы.

И еще просветите, пожалуйста, почему если закомментировать добавление в коллекцию, то выпадает Exception с поясняющим текстом "Ошибка отправки почты: Необходимо указать получателя."
Разве добавлять в коллекцию обязательно?
На счет тормозов действительно 8-10 секунд это долго, но поскольку сам не сталкивался, могу только погадать: например почтовый сервер подгружен или SSL идентификация достаточно неспешна.

Коллекция адресов нужна, без нее не знаю способа указать адресатов.
Старый 02.09.2013, 15:32   #16  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
Кстати, старый добрый Outlook Express при эксперименте тормозил примерно столько же (8-10 сек) при отправке через smtp.office365.com.

Быстро - только из Outlook 2010 (sp2)
Теги
office365, sysmailer, почта

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
amer-ax: It was a great day! Blog bot DAX Blogs 3 29.12.2012 01:02
Проблема с com Outlook Ksizorg DAX: Программирование 3 22.08.2012 15:44
dynamicsaxtraining: Purchase Blog bot DAX Blogs 0 11.03.2012 05:25
dynamicsaxbi: Screenshots of Dynamics AX 2009 Role Centers Blog bot DAX Blogs 0 18.03.2011 20:11
msdynamicsax: VB script that test the com connector for Dynamics Ax 4.0 Blog bot DAX Blogs 0 25.08.2008 18:05

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

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

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