07.02.2013, 14:07 | #1 |
Участник
|
Работа с почтой в Ах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 |
Участник
|
Цитата:
некоторые клиенты умные и делают постобработку полученного письма. во всех клиентах можно получить ИСХОДНЫЙ текст письма. например, в Outlook = Файл, свойства - позволяет увидеть заголовки письма = Правая кнопка мыши, Источник - позволяет увидеть исходный текст до постобработки. вот исходный текст и проверяйте. а дальше смотрите на параметры постобработки в разных клиентах |
|
|
За это сообщение автора поблагодарили: Narayana (1). |
07.02.2013, 16:08 | #3 |
Участник
|
Цитата:
Сообщение от mazzy
Эффект не в аксапте, а в почтовых клиентах.
некоторые клиенты умные и делают постобработку полученного письма. во всех клиентах можно получить ИСХОДНЫЙ текст письма. например, в Outlook = Файл, свойства - позволяет увидеть заголовки письма = Правая кнопка мыши, Источник - позволяет увидеть исходный текст до постобработки. вот исходный текст и проверяйте. а дальше смотрите на параметры постобработки в разных клиентах Правда, только в Аутлуке. На mail.ru все отображается сплошной строкой, а настройки пока найти не удается. Да и потенциальным пользователям объяснить про дополнительные настройки вряд ли удастся. В общем, бяда. |
|
07.02.2013, 16:15 | #4 |
Участник
|
А не пробовали использовать стандартную пару "\n\r"?
Т.е. у некоторых систем символ новой строки - это num2char(13), у некоторых num2char(10), а MS по умолчанию использует их оба, чтобы не путаться
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
07.02.2013, 16:33 | #5 |
Участник
|
Цитата:
Попробовал сейчас. Ни в Аутлуке, ни в mail.ru не получилось. К сожалению. |
|
07.02.2013, 16:57 | #6 |
Участник
|
А как Вы формируете собственно письмо? В смысле, куда передаете сформированное значение переменной msg? В какой объект?
Кстати, Вы по совету mazzy посмотрели текст источника? В этом самом источнике есть перевод строк? Т.е. где произошла ошибка: при формировании письма в портале или при его чтении в почтовом клиенте?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
07.02.2013, 17:28 | #7 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
А как Вы формируете собственно письмо? В смысле, куда передаете сформированное значение переменной msg? В какой объект?
Кстати, Вы по совету mazzy посмотрели текст источника? В этом самом источнике есть перевод строк? Т.е. где произошла ошибка: при формировании письма в портале или при его чтении в почтовом клиенте? mail.quickSend(name, _ecpCustSignUp.UserEmail, "@SYS98191", msg); из класса SysMailer, но, насколько я понял, форматирует строку функция strfmt еще перед передачей в этот метод. Исходный текст я посмотрел, но только в Аутлуке. Он как раз нормальный. А в mail.ru посмотреть исходный текст не получается. Не знаю как. То есть, можно было бы сказать, что виноват почтовый клиент. Но, ведь другие письма отображаются с форматированием, значит используются какие-то другие символы превода строки. В Аутлуке сработал символ ручного перевода каретки, который вводится с помощью Alt+011(код символа), но в mail.ru это все-равно не работает. Поэтому пока версия такая, что Аксапта правильно генерирует строку, но использует управляющие символы, которые не везде работают. Стало быть, нужно найти такие символы, которые везде работают. Если, конечно, они есть. |
|
07.02.2013, 18:34 | #8 |
Участник
|
Цитата:
Цитата:
Не используйте 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 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
Да, разными. Если вы посмотрите на методы SysMailer из 4-ки или 3-ки, то увидите у него отдельно body()/bodyCharSet() и htmlBody()/htmlBodyCharSet(). В 2009-й первые два убрали, однако, COM-объект, для которого SysMailer является оберткой, от этого не изменился, он все ещё умеет отсылать текст писем plain text'ом, и метод quickSend() для обратной совместимости так их и шлет.
|
|
08.02.2013, 19:17 | #11 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
Во методе SysMailer.quickSend() из Ax2009 завершающей командой идет вызов this.sendMail(). Т.е. не надо его отдельно вызывать. Надо по прежнему использовать SysMailer.quickSend(), просто в качестве параметра body передавать строку с HTML-тегами
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 08.02.2013 в 20:09. |
|
08.02.2013, 20:22 | #14 |
Участник
|
Цитата:
******** Попробовал. Вот метод, который отсылает мое письмо: Цитата:
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); } ******* Ой, извините, все работает. Это я просто 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, почта |
|
|