На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
  
> The_Bat, ActiveX & JavaScript
    вот в чём проблема: все, кто сталкивался с отправкой данных из формы по e-mail сталкивались, наверное, с тем, что The Bat! с явной неохотой отправляет подобные сообщения, точнее говоря, вообще их не отправляет. На этот случай всплывает в памяти технология ActiveX, но как реализовать вставку определенного текста в код письма не знаю. Может кто подскажет, как обойтись без наворотов в межпрограммном взаимодействии, а если подобного простого пути нет, то может кто-нибудь кинет простенький примерчик с ActiveX на JavaScript
      Все гораздо проще:
      ExpandedWrap disabled
        <a href="mailto:address@domain.com?subject=Тема письма&body=Содержимое сообщения">Текст ссылки</a>

      Это, конечно, если ты используешь mailto, а не серверный скрипт (тогда тебе в серверную часть).
        не всё так гладко - пишу следующую процу:
        ExpandedWrap disabled
           
          function SendOrderNow(th){
              var strMail='mailto:name@domen.ru?subject=The_order&body=';
              var tab=document.getElementById("PostTab");
              for (var i=1; i<tab.rows.length; i++) {
                  var perO='SendZak.ta_'+i+'.value';
                  if (tab.rows[0].cells[2].innerText=='Кол-во') {
                      strMail+=tab.rows[i].cells[1].innerText+' кол-во='+tab.rows[i].cells[2].innerText+' Описание='+eval(perO)+' /n';
                  }
                  else {
                      strMail+=tab.rows[i].cells[1].innerText+' Описание='+eval(perO)+' /n';
                  }
              }
              th.href=strMail;
          }

        так отправляется всякая хренотень: в таблице ведь по-русски написаны слова - он их в href загонять не хочет. Что делать в таком случае?

        P.S.:
        SendZak - форма
        ta_xxx - элемент формы типа textarea
        th - указатель this на ссылку, которой и присваиваем href
        Сообщение отредактировано: Malicious Babai -
          Во-первых, надо указать кодировку (точно так же - &charset=windows-1251).
          Во-вторых, нужна функция типа urlencode() (она есть в PHP, но не знаю, есть ли в JS). Могу ее написать, если в JS ее нет.
            Параметры значение параметров Subject, Body надо брать в кавычки. Твой код мне поднять не удалось, а свой написал - работает.
            [html]
            <script>
            function mail(th) {
            var body = 'Привет! Это пробное письмо';
            var subject = 'Привет, Roman!';
            var to = 'some@wh.ere';

            th.href = 'mailto:' + to + '?Subject="' + subject + '"&Body="' + body + '"';
            }
            </script>

            <a href="#" onclick="mail(this);">Mail Me</a>
            [/html]

            У меня тока The Bat. Под другими не тестил;)
              Malicious Babai, вариант Rom@nych'а работает? Если да, то я могу спать спокойно.

              Попробовал написать urlencode:
              ExpandedWrap disabled
                function CharToHex(c) {
                    var HEX_TABLE = "0123456789ABCDEF";
                    var got = c.charCodeAt(0);
                    var left = 0;
                    var result = "";
                    var result2 = "";
                    left = got % 16;
                    result += HEX_TABLE.charAt(left);  
                    got = Math.floor(got/16);
                    result += HEX_TABLE.charAt(got);
                    for(var cnt = result.length; cnt >= 0; cnt--) result2 += result.charAt(cnt);
                    return result2;
                }
                 
                function str_urlencode(str) {
                    var LAT_TABLE = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
                    var result = "";
                    var c = "";
                    for(var i = 0; i < str.length; i++) {
                        c = str.charAt(i);
                        if((LAT_TABLE.indexOf(c) == -1) && (c != '_') && (c != ' ')) {
                            result += '%' + CharToHex(c);
                        }
                        else {
                            if(c == ' ') result += '+';
                            else result += c;
                        }
                    }
                    return result;
                }

              С обычными кодировками работает. Но с unicode символами - жестокий облом.
                Понимаешь, в чём бяка. Я тоже хотел написать так, но когда я пишу строку
                [html]
                <a href="mailto:some@wh.ere?Subject=Hello%20user&Body=Some%20text">Mail!</a>
                [/html]
                оно тоже не работает. Поэтому - кавычки рулят%)
                  Закрываем тему.
                    Rom@nych, у меня при отправке слова Прювет (заключенного в кавычках) в теле письма помещается вот такая запись: " 2CF0F0FFE0E2EE52F2 ". Думаю согласишься, что выглядит довольно-таки нечитабельно :( (хотя без кавычек и этого нет). Тоже самое происходит при отправке всей таблицы (разница только в результирующем выражении)

                    Trustmaster, я с PHP знаком весьма слабо, но судя по твоему коду я так понял, что urlencode() преобразует кириллицу (и другие нелатинские литеры) к 16-тиричному формату. Я вставляю твою функцию в код и получается такая строка:
                    ExpandedWrap disabled
                       
                      str=str_urlencode(strBody)+'charset=windows-1251';
                      th.href=strMail+str;

                    функция как доходит до этого фрагмента, так вообще перестает выполняться. Может я не правильно что-то понял или сделал - поправь меня, пожалуйста. В JS есть функция преобразования строки к ASCII-кодированной строке escape(), но она тож не ах-ти как помогает. К примеру, тот же "Прювет" выводит в теле письма вот таким образом: " 2u041F0u04400u044E0u04320u04350u0442 "
                    В общем, ерундистика какая-то получается :wall:

                    P.S.: уж извиняйте, что раз в день на форуме бываю и не отвечаю сразу - рабочий график не позволяет
                      Я функцию на JS написал! Попробуй так:
                      ExpandedWrap disabled
                        th.href='mailto:address@domain.com?subject=Subject&charset=windows-1251&body=' + str_urlencode(strBody);

                      Только эта функция с unicode символами работать не будет (а набирается, скорее всего, юникод) - вот в чем проблема. Можно еще использовать html-макросы (&1024; например) и content-type=text/html. Тебе так пойдет?
                        Malicious Babai, выложи всю страницу (если там нет супер секюрной инфы;)) и мы попробуем в ней разобраться:) А не под The bat'ом пробовал? Мой код работает (в таком виде как я написал). Можно ещё и систему для прикола указать;))
                          Trustmaster, да я понял, что проца на JS написана - я про то говорил, что не знал до этого момента назначения данной функциии (а она ведь из PHP, в принципе, взята).
                          Цитата
                          Можно еще использовать html-макросы (&1024; например)

                          а можно поподробнее с этого момента, а то у меня понятие об html-макросах весьма туманное.
                          Цитата
                          и content-type=text/html.

                          т.е. в мета-тэгах прописать? так это всё и так прописано и кодировка выставлена win-1251, так что Юникод здесь не виноват. Что-то здесь другое, при чём самое интересное, что из IE6 SP1 отправка сообщения по предложенному тобой методу осужществляется примерно в таком виде: @@15-17,5   1 а /n ( 1,5-10; Ш250-1500 Ђ   1 а /n (это две строки из таблицы), а Opera 7.10 вообще отказывается глотать эти скрипты и блокирует выполнение всех действий на странице ( при этом не выполняются ряд процедур не причастные к отправке сообщений) :wacko:
                            Rom@nych, по твоей просьбе выкладываю... тока учтите, что сначала пускается файл ааа2.htm , а потом уже в файле заказа происходит отправка по мылу (т.е. между формами данные передаются между всем этим)... странички тестовые, так что графику к ним не прилагаю и замечания по поводу дизайна просьба не высказывать :D как тока скрипты все напишу и дизайн проработаю обязательно выложу линк для оценки в соответствующем разделе
                            Сообщение отредактировано: Malicious Babai -

                            Прикреплённый файлПрикреплённый файл2.zip (7.49 Кбайт, скачиваний: 124)
                              Функция urlencode взята из протокола HTTP, она применяется для отправки данных скриптам. Данный код я перевел со своей же функции на C#.
                              Что до html-макросов, то это тот же
                              ExpandedWrap disabled
                                 
                              , например. Для каждого символа unicode есть свой макрос. Если задать тип письма text/html (опять-таки в href, а не в header скрипта) и тело написать макросами, то должно работать. Но по-моему, это далеко не лучшая идея.
                              Гораздо лучше написать online форму и генерировать/отсылать письмо прямо из скрипта. Как насчет PHP/Perl?
                                Trustmaster, начальство жадным бывает ;) - потому на free-хостинге сижу пока что. Приходиться выпутываться посредством JS (если страницы смотрел, то заметил, что там и передача данных от одной формы к другой, и отправка по почте... в данный момент еще и над алгоритмом поиска в каталоге думаю... Всё это, без сомнения, проще и разумнее реализовать на PHP, но пока что сами всё видите...
                                  Когда мы однажды обсуждали на форуме хостинг, я сказал то, что повторю тебе сейчас: за сколько лодку купишь, так она и поплывет. Так что придется тебе пока помучиться.
                                    Trustmaster, в вопросе хостинга ты, без всякого сомнения, прав на все 100, но всё-таки приходиться довольствоваться тем, что есть. Хотелось бы услышать еще какой совет по JS в ракурсе данной темы, а то у меня тока одна идея в голове - писать процу OnTranslit(), которая переведет все русские буквы в английские... :( , но все-таки хочеться, чтобы тело письма на нормальном русском было
                                      Могу сделать функцию перевода русского языка в макросы для подстановки в писмо в HTML. Тут 2 момента: 1) не все клиенты поддерживают html, 2) Размер такого письма в несколько раз больше.
                                        Trustmaster, был бы благодарен, если алгоритмом поделишься (если, конечно, это не обычное замещение рус. символа html-кодом)... но этот варинт неприемлем, т.к. многие юзеры в последнее время настраивают mail-клиенты так, чтобы отправка писем осуществлялась в текстовом формате по умолчанию... хотя если генерировать на стороне клиента страничку и отправлять её уже потом по мылу (если такой вариант все-таки возможен), то идея очень неплохая... к сожалению, те кто защищен файрволом в этом случае наших стараний оценить не смогут :(
                                          Кодом-то я поделюсь, без проблем:
                                          ExpandedWrap disabled
                                            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                                            "http://www.w3.org/TR/html4/loose.dtd">
                                            <html>
                                            <head>
                                            <title>Untitled Document</title>
                                            <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
                                            <script>
                                            function safe_encode(str) {
                                                var LAT_TABLE = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
                                                var result = "";
                                                var c = "";
                                                for(var i = 0; i < str.length; i++) {
                                                    c = str.charAt(i);
                                                    if(LAT_TABLE.indexOf(c) == -1) {
                                                        result += '&' + str.charCodeAt(i) + ';';
                                                    }
                                                    else {
                                                        result += c;
                                                    }
                                                }
                                                return result;
                                            }
                                             
                                            function mail(text, address, subject, aObj) {
                                                var href_str = "";
                                                var safe_text = safe_encode(text);
                                                var mail_body = "<html><head><title>" + subject + "</title></head><body>" + safe_text + "</body></html>";
                                                href_str = "mailto:" + address + "?subject=" + subject + "&charset=windows-1251&ctype=text/html&body=" + mail_body;
                                                aObj.href = href_str;
                                                return true;
                                            }
                                            </script>
                                            </head>
                                            <body>
                                            <a href="javascript:void(0)" onClick="mail('Будет чудо, если это сработает!', 'somewhat@somewhere.com', 'Coool!', this)">Ссылка</a>
                                            </body>
                                            </html>

                                          Но этот вариант не работает. Как оказалось, аттрибут href ограничен по длине, так что твой способ отправки писем не подходит вообще. Так что либо серверные скрипты, либо письма придется писать вручную.
                                            Хорошо что я в своё время не полинился написать функцию
                                            конвертирующюу код символа из Unicode в Windows-1251.
                                            Пробуйте:
                                            [HTML]
                                            <html>
                                            <head>
                                            <title>Untitled Document</title>
                                            <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
                                            <script language=JScript>
                                            function toWin(N)
                                            {
                                            /*код громоздкий, но шустрый :)*/
                                            if(N<=127)R=N;else if(1040<=N&&N<=1103)R=N-848;else if(1026<=N&&N<=1027)R=N-898;else if(N==8218)R=130;else if(N==1107)R=131;else if(N==8222)R=132;else if(N==8230)R=133;else if(8224<=N&&N<=8225)R=N-8090;else if(N==8364)R=136;else if(N==8240)R=137;else if(N==1033)R=138;else if(N==8249)R=139;else if(N==1034)R=140;else if(N==1036)R=141;else if(N==1035)R=142;else if(N==1039)R=143;else if(N==1106)R=144;else if(8216<=N&&N<=8217)R=N-8071;else if(8220<=N&&N<=8221)R=N-8073;else if(N==8226)R=149;else if(8211<=N&&N<=8212)R=N-8061;else if(N==0)R=152;else if(N==8482)R=153;else if(N==1113)R=154;else if(N==8250)R=155;else if(N==1114)R=156;else if(N==1116)R=157;else if(N==1115)R=158;else if(N==1119)R=159;else if(N==160)R=160;else if(N==1038)R=161;else if(N==1118)R=162;else if(N==1032)R=163;else if(N==164)R=164;else if(N==1168)R=165;else if(166<=N&&N<=167)R=N;else if(N==1025)R=168;else if(N==169)R=169;else if(N==1028)R=170;else if(171<=N&&N<=174)R=N;else if(N==1031)R=175;else if(176<=N&&N<=177)R=N;else if(N==1030)R=178;else if(N==1110)R=179;else if(N==1169)R=180;else if(181<=N&&N<=183)R=N;else if(N==1105)R=184;else if(N==8470)R=185;else if(N==1108)R=186;else if(N==187)R=187;else if(N==1112)R=188;else if(N==1029)R=189;else if(N==1109)R=190;else if(N==1111)R=191;
                                            else R=63;//символ вопроса - '?'
                                            return R;
                                            }

                                            function uni2winEsc(s)
                                            {
                                            var res='';
                                            for(var i=0;i<s.length;i++)
                                            res+="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_.!~*'()#".indexOf( s.charAt(i) )>= 0 ? s.charAt(i) : "%"+toWin(s.charCodeAt(i)).toString(16).toUpperCase();
                                            return res;
                                            }

                                            function mail(text, address, subject) {
                                            location.href="mailto:" + address + "?subject=" + uni2winEsc(subject) + "&charset=windows-1251&body=" + uni2winEsc(text)
                                            }
                                            </script>
                                            </head>
                                            <body>
                                            <a href="javascript:void(0)" onClick="mail('Ну как? Работает?', 'somewhat@somewhere.com', '! Тема !')">Ссылка</a>
                                            </body>
                                            </html>
                                            [/HTML]
                                              Хочу сразу (пусть и с большим запозданием) извиниться перед Rom@nych, т.к. его код работает, но исключительно через IE, а потому он мне не подошел... Не знаю, чего эт я тогда сказал, что он совсем не рабочий???

                                              Mixxx,
                                              ExpandedWrap disabled
                                                 
                                                function SendOrderNow() {
                                                    var tab=document.getElementById("PostTab");
                                                    var strBody='';
                                                    var str;
                                                    for (var i=1; i<tab.rows.length; i++) {
                                                        var perO='SendZak.ta_'+i+'.value';
                                                        if (tab.rows[0].cells[2].innerText=='Кол-во') {
                                                            strBody+=tab.rows[i].cells[1].innerText+' кол-во='+tab.rows[i].cells[2].innerText;
                                                            strBody+=' Описание='+eval(perO)+' /n';
                                                        }
                                                        else {
                                                            strBody+=tab.rows[i].cells[1].innerText+' Описание='+eval(perO)+' /n';
                                                        }
                                                    }
                                                    location.href='mailto:company@domen.ru?subject=The_Order&charset=windows-1251&body="'+uni2winEsc(strBody)+'"';
                                                }

                                              не работает как под IE6, так и под Opera 7.10... даже если в uni2winEsc() изменять значение входящего параметра для toString()... мож я чего не понимаю?
                                              Проверял с отдельными словами - эффект тот же
                                                Malicious Babai
                                                Кавыки( " ) уберите:
                                                ExpandedWrap disabled
                                                  location.href='mailto:company@domen.ru?subject=The_Order&charset=windows-1251&body='+uni2winEsc(strBody);

                                                А у вас в опере просто ссылка
                                                [html]
                                                <a href="mailto:xxx@mail.ru">mailto test</a>
                                                [/html]
                                                работает???
                                                Сообщение отредактировано: Mixxx -
                                                  Еще как! А ты сомневаешься?
                                                  Значит проблема в том, что Опера обрубает строку в href символах так на 256-ти.
                                                    Mixxx, все ссылки в Опере работают превосходно... и не только ссылки, но также и направление через location.href тоже
                                                    кстати, нашел ошибку в собственном коде, из-за которой uni2winEsc(strBody) не срабатывала, так что можете не переживать - функция рабочая, но через Оперу она в майл-клиент записывает следующее:
                                                    Цитата
                                                    2C2CE5EEDEF2FE8EEBEFFFF2FEEEF0FFB BEA--EE=1 ECEDEF= //

                                                    а там должна быть строка следующего типа
                                                    Цитата
                                                    Вентиляторы к-во=1 Оп=//

                                                    т.е. результат ровным счетом тот же, что и без применения этой функции :huh:

                                                    Trustmaster, на этот случай можно предусмотреть ограничение по количеству отправляемых элементов... хотя тут возникает серьезное неудобство, но другого выхода не вижу, ежели href ограничен величниной стандартной строки :unsure:
                                                    Сообщение отредактировано: Malicious Babai -
                                                      Trustmaster, кстати, мы с тобой оказались неправы в том, что строка URL-адреса должна быть не более 255 символов... Только в тело письма Опера 7+ передает до 500 символов, а IE, как минимум, раза в полтора больше :o , и это не говоря о сабже письма, адресе и пресловутом mailto:
                                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                      0 пользователей:


                                                      Рейтинг@Mail.ru
                                                      [ Script execution time: 0,0617 ]   [ 15 queries used ]   [ Generated: 27.04.24, 19:39 GMT ]