06.06.2011, 09:26 | #1 |
Moderator
|
Отправка писем через SysEmailBatch на внешние адреса
Здравствуйте!
Написал отправку писем в зависимости от смены статуса заказа. Вот код который отправляет: X++: static server void sendMail(Notes _text, Email _toEmail, Name _fromName, Email _fromEmail, str _subject, str _attachment = '') { EmailPriority priority = EmailPriority::High; str attachmentPath = ''; SysEmailBatch sysEmailBatch; ; if(!_toEmail) return; if (_attachment && WinAPI::fileExistsClient(_attachment)) attachmentPath = _attachment; try { sysEmailBatch = SysEmailBatch::construct(); sysEmailBatch.parmSendername(_fromName); sysEmailBatch.parmSenderAddr(_fromEmail); sysEmailBatch.parmEmailAddr(_toEmail); sysEmailBatch.parmMessageBody(_text); sysEmailBatch.parmPriority(priority); sysEmailBatch.parmSubject(_subject); sysEmailBatch.parmAttachmentfileName(attachmentPath); sysEmailBatch.run(); } catch { } } Все прекрасно работает для внутренней почты, а если попытаться отправить письмо на внешнюю почту - генерится исключение: Метод 'SendMail' в COM-объекте класса 'Dundas.mailer' возвратил код ошибки 0x80004005 (E_FAIL), который означает: The RCPT command failed. The specified account does not exsist. Поискал в интернете - нашел: http://www.mail-archive.com/developm.../msg12537.html We figured this out. On the Exchange server we had the IP addresses of the AOS's in the SMTP Default Virtual Server properties (Relay restrictions) but that does not work if you are emailing a report because the ip address of the client is used. From our understanding the AOS ip address is used when a batch job or if it is running on the server side. So we entered in the range of our Networks IP addresses and now it works great! Передал админу - он не поймет как решить. Не поможете разобраться? |
|
06.06.2011, 09:37 | #2 |
Ищущий знания...
|
когда то давно у меня тоже была похожая проблема, тоже не отправлялись письма во внешний мир (может и точно такая же, просто точно ошибку не помню).
сказал админу, он что то долго смотрел, потом сказал какой мне прокси сервер прописать в настройках и все стало замечательно отправляться исходя из этого опыта, могу предположить, что дело в настройках прокси.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
06.06.2011, 09:41 | #3 |
Участник
|
Скорее всего, на внешнем почтовом ящике включена аутентификация по SMTP.
К сожалению, через Dundas Mailer ее нельзя прикрутить
__________________
Axapta v.3.0 sp5 kr2 |
|
06.06.2011, 09:46 | #4 |
Moderator
|
Спасибо! А прокси в SysEmailParameters прописываются? (сервер исходящей почты)
|
|
06.06.2011, 09:47 | #5 |
Moderator
|
|
|
06.06.2011, 09:59 | #6 |
Участник
|
MAPI. Но должена быть настроена клиентская почтовая программа (Outlook, Outlook Express, Live Mail)
PS. DAX 3.0, полагаю? если 4.0 или 2009 - можно воспользоваться .net
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: DreamCreator (2). |
06.06.2011, 10:00 | #7 |
Ищущий знания...
|
Цитата:
Администрирование \ Настройка \ Параметры почты. Ну и там "Сервер исходящей почты", "Номер порта SMTP" и пр.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: DreamCreator (2). |
06.06.2011, 10:29 | #8 |
Moderator
|
|
|
06.06.2011, 10:33 | #9 |
Ищущий знания...
|
Кстати, посмотрел что использую у себя.
Отправляю почту через класс SysEMailBatch (он в свою очередь использует класс SysMailer) . Пример: X++: SysEMailBatch sysEMailBatch = SysEMailBatch::construct(); str txtBody; FileName fileNameServ; ; ... sysEMailBatch.parmEmailAddr(Email); sysEMailBatch.parmMessageBody(txtBody); sysEMailBatch.parmPriority(1); sysEMailBatch.parmSenderAddr(emplTable.Email); sysEMailBatch.parmSendername(emplTable.Name); sysEMailBatch.parmSubject(strFmt(" %1", emplTable.Name) + strFmt("'%1'", CompanyInfo::find().Name)); sysEMailBatch.parmAttachmentfileName(fileNameServ); sysEMailBatch.run();
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
06.06.2011, 10:41 | #10 |
Moderator
|
|
|
06.06.2011, 10:43 | #11 |
Ищущий знания...
|
Ага самое обидное что это было два года назад, и тот админ уже не работает спросить некого
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
06.06.2011, 11:04 | #12 |
Модератор
|
Цитата:
P.S. На SMTP могут быть разные требования к авторизации при отправке на локальные и внешние адреса, это нормальная практика. Начните с включения Use NTLM в Email parameters
__________________
-ТСЯ или -ТЬСЯ ? |
|
06.06.2011, 11:32 | #13 |
Moderator
|
Цитата:
А где этот параметр меняется? В SysEmailParameters такого поля не нашел.. |
|
06.06.2011, 12:03 | #14 |
Модератор
|
\Data Dictionary\Tables\SysEmailParameters\Fields\NTLM
__________________
-ТСЯ или -ТЬСЯ ? |
|
06.06.2011, 12:50 | #15 |
Moderator
|
В 3.0 значит нет
В итоге выделили проблему - почтовый сервер не проходит smtp авторизацию (отключен relay, если не ошибаюсь). SysInetMail успешно отсылает, только на двух диалогах надо Да нажать: X++: SysInetMail mail = new SysInetMail(); ; mail.sendMail('external@yandex.ru', "test sysInetMail", "test", false); |
|
06.06.2011, 12:53 | #16 |
Участник
|
SysInetMail это и есть обертка над MAPI
__________________
Axapta v.3.0 sp5 kr2 |
|
22.10.2013, 13:26 | #17 |
Участник
|
Может, кому-то пригодится:
У меня AX2009 RU2 , код выше не работает. вместо parmAttachmentfileName нужно использовать addAttachmentfileName, иначе письмо придет без аттачмента. Это связано не с настройками сервера, а с тем, чточто в run() проверяется attachmentFileNameList, который заполяется только в методе addAttachmentfileName() и остается пустам , если использовать parmAttachmentfileName Последний раз редактировалось IKA; 22.10.2013 в 13:28. |
|
|
За это сообщение автора поблагодарили: vvk (1), plumbum (3). |