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?
Теги
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, время: 16:45.