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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.02.2013, 14:07   #1  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Работа с почтой в Ах2009
Во момент обработки заявки на регистрацию нового пользователя Портала сотрудник компании должен отправить потенциальному пользователю е-мэйл со ссылкой активации.
Аксапта из формы регистрации пользователей Портала такое письмо, действительно, отправляет. Вот пара строк кода, с помощью которых формируется часть текста письма:

msg = strfmt("@SYS98188",_ecpCustSignUp.UserEmail) + '\n\n';
msg += "@SYS98189" + '\n\n';

В коде явно присутствуют символы перевода строки \n\n , но в пришедшем на почту письме все сообщение выводится одной строкой.

Адрес электронной почты (***) использовался для регистрации учетной записи. Чтобы стать пользователем, подтвердите свой запрос, щелкнув следующую ссылку: http://ax.***.ru/Enterprise%20Portal...D4BC26A5EF441A С наилучшими пожеланиями info@***.ru

И при этом в некоторых почтовых клиентах сама ссылка активации не выводится как ссылка, а просто текстом. Но, стоит попытаться отредактировать ссылку или переслать на другую почту, как она становится нажимабельной.

Если кто-то разбирался с таким эффектом, прошу подсказать в чем дело.
Старый 07.02.2013, 14:29   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Narayana Посмотреть сообщение
но в пришедшем на почту письме все сообщение выводится одной строкой.
...
И при этом в некоторых почтовых клиентах сама ссылка активации не выводится как ссылка, а просто текстом.
Эффект не в аксапте, а в почтовых клиентах.
некоторые клиенты умные и делают постобработку полученного письма.

во всех клиентах можно получить ИСХОДНЫЙ текст письма.
например, в Outlook
= Файл, свойства - позволяет увидеть заголовки письма
= Правая кнопка мыши, Источник - позволяет увидеть исходный текст до постобработки.

вот исходный текст и проверяйте.
а дальше смотрите на параметры постобработки в разных клиентах
Миниатюры
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 333
Размер:	57.7 Кб
ID:	8051  
За это сообщение автора поблагодарили: Narayana (1).
Старый 07.02.2013, 16:08   #3  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
Эффект не в аксапте, а в почтовых клиентах.
некоторые клиенты умные и делают постобработку полученного письма.

во всех клиентах можно получить ИСХОДНЫЙ текст письма.
например, в Outlook
= Файл, свойства - позволяет увидеть заголовки письма
= Правая кнопка мыши, Источник - позволяет увидеть исходный текст до постобработки.

вот исходный текст и проверяйте.
а дальше смотрите на параметры постобработки в разных клиентах
Замена '/n' на ...здесь символ не воспроизводится, но в текст редактора Аксапты вводится как Alt+011 (011 на цифровой клавиатуре), помогла.
Правда, только в Аутлуке. На mail.ru все отображается сплошной строкой, а настройки пока найти не удается. Да и потенциальным пользователям объяснить про дополнительные настройки вряд ли удастся. В общем, бяда.
Старый 07.02.2013, 16:15   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
А не пробовали использовать стандартную пару "\n\r"?

Т.е. у некоторых систем символ новой строки - это num2char(13), у некоторых num2char(10), а MS по умолчанию использует их оба, чтобы не путаться
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 07.02.2013, 16:33   #5  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
А не пробовали использовать стандартную пару "\n\r"?

Т.е. у некоторых систем символ новой строки - это num2char(13), у некоторых num2char(10), а MS по умолчанию использует их оба, чтобы не путаться

Попробовал сейчас. Ни в Аутлуке, ни в mail.ru не получилось. К сожалению.
Старый 07.02.2013, 16:57   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
А как Вы формируете собственно письмо? В смысле, куда передаете сформированное значение переменной msg? В какой объект?

Кстати, Вы по совету mazzy посмотрели текст источника? В этом самом источнике есть перевод строк? Т.е. где произошла ошибка: при формировании письма в портале или при его чтении в почтовом клиенте?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 07.02.2013, 17:28   #7  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
А как Вы формируете собственно письмо? В смысле, куда передаете сформированное значение переменной msg? В какой объект?

Кстати, Вы по совету mazzy посмотрели текст источника? В этом самом источнике есть перевод строк? Т.е. где произошла ошибка: при формировании письма в портале или при его чтении в почтовом клиенте?
msg передается в:
mail.quickSend(name, _ecpCustSignUp.UserEmail, "@SYS98191", msg);
из класса SysMailer, но, насколько я понял, форматирует строку функция strfmt еще перед передачей в этот метод.

Исходный текст я посмотрел, но только в Аутлуке.
Он как раз нормальный.
А в mail.ru посмотреть исходный текст не получается. Не знаю как.
То есть, можно было бы сказать, что виноват почтовый клиент.
Но, ведь другие письма отображаются с форматированием, значит используются какие-то другие символы превода строки.

В Аутлуке сработал символ ручного перевода каретки, который вводится с помощью Alt+011(код символа), но в mail.ru это все-равно не работает.

Поэтому пока версия такая, что Аксапта правильно генерирует строку, но использует управляющие символы, которые не везде работают.
Стало быть, нужно найти такие символы, которые везде работают.
Если, конечно, они есть.
Старый 07.02.2013, 18:34   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Narayana Посмотреть сообщение
Вот пара строк кода, с помощью которых формируется часть текста письма: [...]В коде явно присутствуют символы перевода строки \n\n , но в пришедшем на почту письме все сообщение выводится одной строкой.
Цитата:
Сообщение от Narayana Посмотреть сообщение
msg передается в:
mail.quickSend(name, _ecpCustSignUp.UserEmail, "@SYS98191", msg);
из класса SysMailer
Исходный текст я посмотрел, но только в Аутлуке. Он как раз нормальный. То есть, можно было бы сказать, что виноват почтовый клиент.
Почтовые клиенты не виноваты, особенно mail.ru Они обычно отображают сообщения с форматированием, обычно такие сообщения приходят в формате html, Outlook вот еще rtf поддерживает, а вы, судя по всему, отправляете письмо plain text'ом. Потом почтовый клиент его преобразует, как умеет, в html-формат (потому что он заточен на отображение писем в таком формате), скармливает его HTML-компоненту или браузеру, там все ваши переводы строки пропадают - и вы получаете то, что получаете.
Не используйте quickSend и обычный текстовый формат сообщений, используйте формат html и форматируйте письма соотв. образом - тогда будут вам и переводы строк, и работающие гиперссылки:
X++:
msg = strfmt(@'<p>%1<br/>Адрес электронной почты (%2) bla-bla-bla.<br/>'
           + @'Чтобы подтвердить, щелкните по ссылке: <a href="%3">%3</a><br/>'
           + @'С наилучшими пожеланиями, <a href="mailto:%4">%4</a></p>',
             "@SYS98189", _ecpCustSignUp.UserEmail, confirmationUrl, helpdeskEmail);
За это сообщение автора поблагодарили: sukhanchik (4).
Старый 07.02.2013, 19:30   #9  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Почтовые клиенты не виноваты, особенно mail.ru Они обычно отображают сообщения с форматированием, обычно такие сообщения приходят в формате html, Outlook вот еще rtf поддерживает, а вы, судя по всему, отправляете письмо plain text'ом. Потом почтовый клиент его преобразует, как умеет, в html-формат (потому что он заточен на отображение писем в таком формате), скармливает его HTML-компоненту или браузеру, там все ваши переводы строки пропадают - и вы получаете то, что получаете.
Не используйте quickSend и обычный текстовый формат сообщений, используйте формат html и форматируйте письма соотв. образом - тогда будут вам и переводы строк, и работающие гиперссылки:
X++:
msg = strfmt(@'<p>%1<br/>Адрес электронной почты (%2) bla-bla-bla.<br/>'
           + @'Чтобы подтвердить, щелкните по ссылке: <a href="%3">%3</a><br/>'
           + @'С наилучшими пожеланиями, <a href="mailto:%4">%4</a></p>',
             "@SYS98189", _ecpCustSignUp.UserEmail, confirmationUrl, helpdeskEmail);
Ага, уже просвет ))
Но, ведь quickSend, насколько я понял, только пересылает строку, а в каком она формате, зависит только от того, как вы эту строку собрали, - plain text'ом или в html-формате? Или plain и html должны разными методами отсылаться по почте?
Старый 07.02.2013, 22:02   #10  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Narayana Посмотреть сообщение
plain и html должны разными методами отсылаться по почте?
Да, разными. Если вы посмотрите на методы SysMailer из 4-ки или 3-ки, то увидите у него отдельно body()/bodyCharSet() и htmlBody()/htmlBodyCharSet(). В 2009-й первые два убрали, однако, COM-объект, для которого SysMailer является оберткой, от этого не изменился, он все ещё умеет отсылать текст писем plain text'ом, и метод quickSend() для обратной совместимости так их и шлет.
Старый 08.02.2013, 19:17   #11  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Да, разными. Если вы посмотрите на методы SysMailer из 4-ки или 3-ки, то увидите у него отдельно body()/bodyCharSet() и htmlBody()/htmlBodyCharSet(). В 2009-й первые два убрали, однако, COM-объект, для которого SysMailer является оберткой, от этого не изменился, он все ещё умеет отсылать текст писем plain text'ом, и метод quickSend() для обратной совместимости так их и шлет.
А можно вас попросить завершить мой ликбез?
Возможно, еще кому-то будет полезно.

Итак, что я понял...
Почтовым клиентом письмо воспринимается как в формате "текст" или как в формате "html".
При этом в шапке письма должно существовать поле Content-Type, хотя в сорсе страницы на mail.ru я такого поля в заголовке письма не вижу.

Соответственно, если мы хотим отправить письмо простым текстом, мы должны воспользоваться методом quickSend, а если хотим отправить письмо с html контентом, то методом sendMail.
Но, вот здесь с этим методом sendMail я уже ничего не понимаю, потому как вот все его содержание:

public void sendMail()
{
InteropPermission permission = new InteropPermission(InteropKind::ComInterop);
;
permission.assert();
//BP Deviation Documented
_COM.send();
}

Где COM уже системный класс.

В общем, никаких параметров, никаких полей заголовка письма и никакой документации куда че толкать.

РасскАжите как этим пользоваться?
Я так понимаю, ваш пример должен был пересылаться как раз этим методом, потому как quickSend строку с объектами html отослать-то может, но почтовые клиенты этого снова не поймут.

Кстати, если все-таки пытаться цеплять html-ные тэги в строку для quickSend, кое-что происходит. Например </br> таки переводит строку, а если расметить что-то типа полного линка, то сам линк не отображается, зато начинает отображаться следующая за ним строка, начинающаяся с "http://".
Старый 08.02.2013, 19:17   #12  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Да, разными. Если вы посмотрите на методы SysMailer из 4-ки или 3-ки, то увидите у него отдельно body()/bodyCharSet() и htmlBody()/htmlBodyCharSet(). В 2009-й первые два убрали, однако, COM-объект, для которого SysMailer является оберткой, от этого не изменился, он все ещё умеет отсылать текст писем plain text'ом, и метод quickSend() для обратной совместимости так их и шлет.
А можно вас попросить завершить мой ликбез?
Возможно, еще кому-то будет полезно.

Итак, что я понял...
Почтовым клиентом письмо воспринимается как в формате "текст" или как в формате "html".
При этом в шапке письма должно существовать поле Content-Type, хотя в сорсе страницы на mail.ru я такого поля в заголовке письма не вижу.

Соответственно, если мы хотим отправить письмо простым текстом, мы должны воспользоваться методом quickSend, а если хотим отправить письмо с html контентом, то методом sendMail.
Но, вот здесь с этим методом sendMail я уже ничего не понимаю, потому как вот все его содержание:

public void sendMail()
{
InteropPermission permission = new InteropPermission(InteropKind::ComInterop);
;
permission.assert();
//BP Deviation Documented
_COM.send();
}

Где COM уже системный класс и посмотреть че в нем нельзя.

В общем, никаких параметров, никаких полей заголовка письма и никакой документации куда че толкать.

РасскАжите как этим пользоваться?
Я так понимаю, ваш пример должен был пересылаться как раз этим методом, потому как quickSend строку с объектами html отослать-то может, но почтовые клиенты этого снова не поймут.

Кстати, если все-таки пытаться цеплять html-ные тэги в строку для quickSend, кое-что происходит. Например </br> таки переводит строку, а если расметить что-то типа полного линка, то сам линк не отображается, зато начинает отображаться следующая за ним строка, начинающаяся с "http://".
Старый 08.02.2013, 20:04   #13  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Во методе SysMailer.quickSend() из Ax2009 завершающей командой идет вызов this.sendMail(). Т.е. не надо его отдельно вызывать. Надо по прежнему использовать SysMailer.quickSend(), просто в качестве параметра body передавать строку с HTML-тегами
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 08.02.2013 в 20:09.
Старый 08.02.2013, 20:22   #14  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Во методе SysMailer.quickSend() из Ax2009 завершающей командой идет вызов this.sendMail(). Т.е. не надо его отдельно вызывать. Надо по прежнему использовать SysMailer.quickSend(), просто в качестве параметра body передавать строку с HTML-тегами
О-о-о!!!
********
Попробовал.
Вот метод, который отсылает мое письмо:

Цитата:
static void sendMail_UserActivationKey(ECPCustSignUp _ecpCustSignUp)
{
str msg;
EPWebSiteParameters webSite;
str name = CompanyInfo::find().Email;
int pos;
SysMailer mail = new SysMailer();
WebUrlMenuFunction urlMenuFunction = new WebUrlMenuFunction(weburlitemstr(EPCSSCustSignUpUserActivation));
;
//Build mail message
msg = '<HTML><BODY><a href=www.tran.ru"www.tran.ru"></a></br></BODY></HTML>';

select firstonly ExternalUrl from webSite
where webSite.AnonymousAccess == true;
if (!webSite)
throw warning("@SYS98752");

pos = strfind(name,' ', 1, 250);
while (pos)
{
name = strpoke(name, '_', pos);
pos = strfind(name, ' ', 1, 250);
}
mail.quickSend(name, _ecpCustSignUp.UserEmail, "@SYS98191", msg);
}
Вроде бы, все сделано, как вы говорите, но сообщение на почтовый клиент приходит пустым, а если строку msg сделать обычной текстовой, то нормально пересылается.

*******

Ой, извините, все работает.
Это я просто html не знаю.

Вместо:

Цитата:
msg = '<HTML><BODY><a href=www.tran.ru"www.tran.ru"></a></br></BODY></HTML>';
нужно было:

Цитата:
msg = '<HTML><BODY><a href="www.tran.ru"> www.tran.ru</a></br></BODY></HTML>';

Последний раз редактировалось Narayana; 08.02.2013 в 21:44.
Теги
mail, почта

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Стоимость перехода с AX3.0 на АХ2009 Pustik DAX: Прочие вопросы 18 30.03.2011 16:21
функционал Работа с документами и создание договора в Word GM2005 DAX: Функционал 5 28.09.2009 14:49
В АХ2009 проблема с General Ledger->Chart of accounts AndrianG DAX: Администрирование 3 12.02.2009 13:15
Доступ к меню "Работа с документами" Kuat DAX: Администрирование 4 16.11.2007 17:07
Совместная работа заказчика и исполнителя в разных или одном слое? Кузин Владимир В. DAX: Программирование 6 08.08.2006 10:02

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:20.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.