27.08.2013, 12:43 | #1 |
Участник
|
Почту перевели на outlook.office365.com. SysMailer стал бесполезен?
Ax2009. Офис 2010 sp2.
Кто-нибудь слал почту в такой ситуации, разумеется из кода Ax? |
|
27.08.2013, 12:58 | #2 |
NavAx
|
outlook.office365.com != "SysMailer стал бесполезен"
поднимите релей и пользуйтесь |
|
27.08.2013, 13:06 | #3 |
Участник
|
А можно подробнее?
Если Вы про вызов SysMailer.SMTPRelayServer(), то использовать его как раньше не получается. Последний раз редактировалось AR®; 27.08.2013 в 13:32. |
|
27.08.2013, 17:11 | #5 |
Участник
|
По-видимому, проблема в том, что у меня в параметрах SMTP для учетной записи стоит шифрование TLS, а где это сказать в методах SysMailer, я не знаю.
|
|
30.08.2013, 13:00 | #6 |
Участник
|
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 |
Участник
|
Добавлю свои 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 |
Участник
|
В какой версии DAX проверен код? Что такое CDOMailNet?
|
|
02.09.2013, 14:06 | #9 |
Участник
|
|
|
02.09.2013, 14:21 | #10 |
Участник
|
Вот что получил (для 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 |
Участник
|
Цитата:
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 |
Участник
|
Только вот так:
X++: smtpClient.set_EnableSsl(true); Как бы еще добиться, что бы при отправке не задумывалось? Как из Outlook'а 2010 (уходит сразу). |
|
02.09.2013, 15:00 | #13 |
Участник
|
Цитата:
существенных тормозов при работе у себя не заметил, а работает код в достаточно нагруженном режиме - идет большая рассылка документов. |
|
02.09.2013, 15:16 | #14 |
Участник
|
Хотите верьте, хотите нет - на минимальном письме без вложений ждем 8-10 секунд, из Outlook'а на той же машине - секунда или полторы.
И еще просветите, пожалуйста, почему если закомментировать добавление в коллекцию, то выпадает Exception с поясняющим текстом "Ошибка отправки почты: Необходимо указать получателя." Разве добавлять в коллекцию обязательно? |
|
02.09.2013, 15:28 | #15 |
Участник
|
Цитата:
Сообщение от AR®
Хотите верьте, хотите нет - на минимальном письме без вложений ждем 8-10 секунд, из Outlook'а на той же машине - секунда или полторы.
И еще просветите, пожалуйста, почему если закомментировать добавление в коллекцию, то выпадает Exception с поясняющим текстом "Ошибка отправки почты: Необходимо указать получателя." Разве добавлять в коллекцию обязательно? Коллекция адресов нужна, без нее не знаю способа указать адресатов. |
|
02.09.2013, 15:32 | #16 |
Участник
|
Кстати, старый добрый Outlook Express при эксперименте тормозил примерно столько же (8-10 сек) при отправке через smtp.office365.com.
Быстро - только из Outlook 2010 (sp2) |
|