За последние 24 часа нас посетили 19298 программистов и 1625 роботов. Сейчас ищут 840 программистов ...

Не приходит письмо из формы обратной связи на сайте

Тема в разделе "Прочие вопросы по PHP", создана пользователем ATV, 6 фев 2013.

  1. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    больше ничего не трогал, честно!!!

    вот файл с формой:
    Код (Text):
    1. <head>
    2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    3. </head>
    4. <body>
    5. <form action="sendmail.php" method="POST" data-enhance="false" />
    6. <div class="groupBox">
    7.                   <ul>
    8.                     <li>
    9.                       <input type="text" placeholder="Name" required name="contactName" id="contactName" />
    10.                     </li>
    11.                     <li>
    12.                         <input type="email" placeholder="Email" required name="contactEmail" id="contactEmail" />
    13.                     </li>
    14.                     <li>
    15.                         <input type="tel" placeholder="Phone" name="contactPhone" id="contactPhone" />
    16.                     </li>
    17.                     <li>
    18.                         <textarea placeholder="Message" required name="contactMessage" id="contactMessage"></textarea>
    19.                     </li>
    20.                   </ul>
    21.                  
    22.                   <input type="submit" class="button buttonStrong right" value="Отправить" name="buttonSubmit" value="submit" />
    23.                   <div class="clearfix"></div>
    24.                  
    25.                 </div>
    26.                 <!-- end group box -->
    27.               </form>
    28.  
    29. <script src="js/script.js"></script>
    30. </body>
    31. </html>
    вот файл script.js:
    Код (Text):
    1.  
    2.  
    3.  
    4.  $(document).ready(function(){
    5.    //hide address bar if content is long (safari)
    6.    //MBP.hideUrlBarOnLoad();
    7.      
    8.       var myScroll;
    9.      
    10.       var runFlexsliders = function(){
    11.          
    12.           //run sliders if they're not run already
    13.           var winWidth = $('#container').outerWidth();
    14.           var paddingPercent = (winWidth *2)/100;
    15.           var marginPercent = (winWidth*22)/100;
    16.           var availableWidth = winWidth - marginPercent;
    17.           var perItemWidth = (availableWidth / 3);// - paddingPercent;
    18.           $('.flexslider').each(function(){
    19.                if ($(this).hasClass('pagesMenu')){
    20.                    
    21.                  $(this, ':not(.flexslidered)').addClass("flexslidered").flexslider({
    22.                       animation: "slide",
    23.                       controlNav: false,
    24.                       directionNav: true,
    25.                       slideshow: false,
    26.                       animationLoop: false,
    27.                       itemWidth: perItemWidth
    28.                  });
    29.                  
    30.                } else{
    31.                     $(this, ':not(.flexslidered)').addClass("flexslidered").flexslider({
    32.                          animation: "slide",
    33.                          controlNav: false,
    34.                          directionNav: true
    35.                     });
    36.                }
    37.             });
    38.       }
    39.      
    40.  
    41.    
    42.          var App = {
    43.             init: function() {
    44.                this.ENTER_KEY = 13;
    45.                this.$duration = 700;
    46.                
    47.                //hide splash
    48.                setTimeout(function(){
    49.                     $('#splash').fadeOut('1000');
    50.                }, 2000);
    51.              
    52.                
    53.                runFlexsliders();
    54.                
    55.                          
    56.                if ($('#pivotTabs').length> 0) {
    57.                   myScroll = new iScroll('pivotTabs', {
    58.                      snap: 'li',
    59.                      momentum: true,
    60.                      hScrollbar: false,
    61.                      vScrollbar: false
    62.                   });
    63.                }
    64.                
    65.                
    66.                
    67.                this.Forms.bind();
    68.  
    69.                this.createAndCacheElements();
    70.                this.bindEvents();
    71.                
    72.                $('li:last-child').addClass('last');
    73.                $('li:first-child').addClass('first');
    74.                
    75.            
    76.                var tabs = this.$tabs;
    77.                $(tabs).find('li:first-child a').trigger('click');
    78.                  
    79.                  
    80.                //portfolio - instruction - tap to change
    81.                if ($('#pagePortfolio').length > 0){
    82.                      $('.instruction').fadeIn(App.duration);
    83.                  
    84.                   var options = {};
    85.                  
    86.                  
    87.           $('.portfolioProjects a.thumb:not(.photoswiped)').addClass('photoswiped').photoSwipe(options);
    88.                  
    89.                   $('#pagePortfolio .tab').hide();
    90.                   $('#pagePortfolio .tabsPortfolio li:nth-child(2) a').trigger('click');
    91.                  
    92.                  
    93.                     $(window).load(function(){
    94.                          setTimeout(function(){
    95.                               $(".list a.thumb iframe").height($(".list a.thumb img").height());
    96.                          }, 1000);
    97.                     });
    98.                    
    99.                }
    100.                
    101.                
    102.                //run the map
    103.                App.refreshMaps();
    104.                
    105.             },
    106.            
    107.             createAndCacheElements:function(){
    108.                this.$tabs = $('#pivotTabs');
    109.                
    110.              
    111.             },
    112.            
    113.             bindEvents: function(){
    114.                var me = this;
    115.                
    116.                $('.page').each(function(){
    117.                     if($(this).hasClass('bound')){
    118.                          return;
    119.                     }
    120.                     $('.page').addClass('bound');
    121.                    
    122.                    
    123.                     var tabs = me.$tabs;
    124.                     tabs.on('click', 'li a', me.enablePivotTab);
    125.                    
    126.                     $('.tabsPortfolio').on('click', 'li a', me.portfolioTabChange)
    127.                    
    128.                    
    129.                     //if has website link, don't show the gallery
    130.                     $('.portfolioProjects').on('click', 'li', function(){
    131.                        if ($(this).find('a.website').length == 0){
    132.                           $(this).find('a.thumb').trigger('click');
    133.                        }
    134.                     });
    135.                    
    136.                    
    137.                     $('.menuButton').click(function(e){
    138.                          e.preventDefault();
    139.                          
    140.                          if ($(this).hasClass('open')){
    141.                               $(this).removeClass('open');
    142.                              
    143.                               $('.upperMenu .pagesMenu').animate({
    144.                                    opacity: 0
    145.                               }, function(){
    146.                                    $('.upperMenu').removeClass('opened');
    147.                               });
    148.                                  
    149.                          } else{
    150.                               $(this).addClass('open');
    151.                               //we give a delay of 300 because our CSS3 transitions are timed at 0.3s for the menu button (the up arrow) to rotate.
    152.                               setTimeout(function(){
    153.                                    $('.upperMenu').addClass('opened');
    154.                                    $('.upperMenu .pagesMenu').animate({
    155.                                         opacity: 1
    156.                                    });
    157.                               }, 300);
    158.                              
    159.                                                
    160.                          }
    161.                          
    162.                     });
    163.  
    164.                });
    165.  
    166.                
    167.             },
    168.            
    169.             portfolioTabChange: function(e){
    170.                e.preventDefault();
    171.                
    172.                if ($(this).hasClass('active')){
    173.                   return;
    174.                }
    175.                
    176.                $('.tabsPortfolio li a').removeClass('active');
    177.                $(this).addClass('active');
    178.                
    179.                var classToAdd = $(this).attr('data-value');
    180.                
    181.                $('.portfolioProjects').show().animate({
    182.                   'opacity': 0
    183.                }, 200, function(){
    184.                   var me = $(this);
    185.                   if (classToAdd == "grid"){
    186.                      $('.instruction').addClass('lefter');
    187.                   } else{
    188.                      $('.instruction').removeClass('lefter');                    
    189.                   }
    190.                   $(me).removeClass('list grid').addClass(classToAdd).animate({
    191.                      'opacity': 1
    192.                   }, 200);
    193.                });
    194.                
    195.             },
    196.            
    197.             enablePivotTab: function(e){
    198.                e.preventDefault();
    199.                if ($(this).hasClass('active')){
    200.                   return;
    201.                }
    202.                var me = $(this);
    203.                if ($(this).hasClass('goToFirst')){
    204.                   $(this).parents('ul').find('li:first-child a').trigger('click');
    205.                   return false;
    206.                }
    207.                var myLi = $(this).parent();
    208.                var myLiIndex = $(myLi).index() + 1;
    209.                var activeIndex = $('#pivotTabs a.active').parent().index() + 1;
    210.                var direction1 = "left";
    211.                var direction2 = "right";
    212.                
    213.                if (myLiIndex > activeIndex){
    214.                   direction1 = "left";
    215.                   direction2 = "right";
    216.                } else{
    217.                   direction1 = "right";
    218.                   direction2 = "left";
    219.                }
    220.                
    221.                
    222.                $(this).parents('ul').find('a').removeClass('active');
    223.                $(this).addClass('active');
    224.                
    225.                
    226.                //scroll all tabs and contents
    227.                myScroll.scrollToElement('li:nth-child(' + myLiIndex + ')', 200);
    228.                $('.pivotTab').slideUp(App.duration);
    229.                var targetDiv = $(me).attr('data-value');
    230.                $(targetDiv).slideDown(App.duration, function(){
    231.                     if ($(targetDiv).find('.map').length > 0){
    232.                          App.refreshMaps();
    233.                     }
    234.                });
    235.                
    236.             },
    237.            
    238.                
    239.                
    240.           refreshMaps: function(){
    241.                
    242.                $('.map').each(function(){
    243.                     var me = $(this);
    244.                     var locationTitle = $(this).attr('data-location');
    245.                     var myId = $(me).attr('id');
    246.                     var geocoder = new google.maps.Geocoder();
    247.                     geocoder.geocode({
    248.                          address: locationTitle
    249.                      }, function(locResult) {
    250.                          var latVal = locResult[0].geometry.location.lat();
    251.                          var longVal = locResult[0].geometry.location.lng();
    252.                          App.initializeMap(myId, locationTitle, latVal, longVal);
    253.                      });
    254.                });
    255.           },
    256.          
    257.          
    258.           initializeMap: function(locationVal, titleVal, latVal, longVal) {
    259.                      var latlng = new google.maps.LatLng(latVal, longVal);
    260.                      var settings = {
    261.                              zoom: 13,
    262.                              center: latlng,
    263.                              mapTypeControl: false,
    264.                              mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},
    265.                              navigationControl: false,
    266.                              navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},
    267.                              streetViewControl: false,
    268.                              zoomControl: true,
    269.                              mapTypeId: google.maps.MapTypeId.ROADMAP
    270.                      };
    271.                      var map = new google.maps.Map(document.getElementById(locationVal), settings);
    272.                      
    273.                      
    274.                      var nibrasPos= new google.maps.LatLng(latVal, longVal);
    275.                      var nibrasMarker = new google.maps.Marker({
    276.                                position: nibrasPos,
    277.                                map: map,
    278.                                title:titleVal
    279.                      });
    280.                        
    281.                
    282.            },
    283.            
    284.            
    285.                
    286.                
    287.            
    288.            
    289.             Forms: {
    290.                bind: function() {
    291.                   // Add required class to inputs
    292.                   $(':input[required]').addClass('required');
    293.                  
    294.                   // Block submit if there are invalid classes found
    295.                   $('form:not(.html5enhanced)').addClass("html5enhanced").submit(function() {
    296.                         var formEl = this;
    297.                           $('input,textarea').each(function() {
    298.                                   App.Forms.validate(this);
    299.                           });
    300.                          
    301.                           if(($(this).find(".invalid").length) == 0){
    302.                                   // Delete all placeholder text
    303.                                   $('input,textarea').each(function() {
    304.                                           if($(this).val() == $(this).attr('placeholder')) $(this).val('');
    305.                                   });
    306.                                  
    307.                                   //now submit form via ajax
    308.                                   $.ajax({
    309.                                     url: $(formEl).attr("action"),
    310.                                     type: $(formEl).attr("method"),
    311.                                     data: $(formEl).serialize(),
    312.                                     success: function(r) {
    313.                                        $(".successMessage").slideDown('fast');
    314.                                        $('html,body').stop().animate({
    315.                                           scrollTop: $(".successMessage").offset().top - 30
    316.                                        }, 300);
    317.                                        
    318.                                        $(formEl).find('input[type="text"], input[type="email"], input[type="tel"], select').val('');
    319.                                        $(formEl).find('textarea').val('');
    320.                                        setTimeout(function(){
    321.                                           $(".successMessage").slideUp('fast');
    322.                                        }, 4000);
    323.                                     }
    324.                                   })
    325.                                   return false;
    326.                           }else{
    327.                                   return false;
    328.                           }
    329.                   });
    330.          
    331.                },
    332.                is_email: function(value){
    333.                  return (/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])(([a-z0-9-])*([a-z0-9]))+(\.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)+$/).test(value);
    334.                },
    335.                is_url: function(value){
    336.                        return (/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i).test(value);
    337.                },
    338.                is_number: function(value){
    339.                        return (typeof(value) === 'number' || typeof(value) === 'string') && value !== '' && !isNaN(value);
    340.                },
    341.                validate: function(element) {
    342.                   var $$ = $(element);
    343.                   var validator = element.getAttribute('type'); // Using pure javascript because jQuery always returns text in none HTML5 browsers
    344.                   var valid = true;
    345.                   var apply_class_to = $$;
    346.                  
    347.                   var required = element.getAttribute('required') == null ? false : true;
    348.                   switch(validator){
    349.                           case 'email': valid = App.Forms.is_email($$.val()); break;
    350.                           case 'url': valid = App.Forms.is_url($$.val()); break;
    351.                           case 'number': valid = App.Forms.is_number($$.val()); break;
    352.                   }
    353.                  
    354.                   // Extra required validation
    355.                   if(valid && required && $$.val().replace($$.attr('placeholder'), '') == ''){
    356.                           valid = false;
    357.                   }
    358.                  
    359.                   // Set input to valid of invalid
    360.                   if(valid || (!required && $$.val() == '')){
    361.                           apply_class_to.removeClass('invalid');
    362.                           apply_class_to.addClass('valid');
    363.                           return true;
    364.                   }else{
    365.                           apply_class_to.removeClass('valid');
    366.                           apply_class_to.addClass('invalid');
    367.                           return false;
    368.                   }
    369.                }
    370.             }
    371.            
    372.          };
    373.          App.init();
    374.  
    375.    
    376.    
    377.    
    378.    var pageChange = function(){
    379.       App.init();
    380.    }
    381.    
    382.    //this is needed because we are enabling navigation via jQuery Mobile.
    383.    //for each time a new page is loaded, the javascript is not run on itself.
    384.    //Hence, we call the application initialize method assuming that all javascript has to be run, since the entire page content is changed.
    385.    
    386.    //to disable the jquery ajax navigation system, please refer to the footer area where the $.mobile.xyz default parameters are set.
    387.    $(document).bind('pagechange', pageChange);
    388.                                  
    389.    
    390. });
    и вот файл sendmail.php:
    Код (Text):
    1.  
    2. <?php
    3.  
    4. $to = 'мой@адрес.ru';
    5. $subject = 'Письмо с мобильного сайта';
    6.  
    7. $name = substr( $_POST['contactName'], 0, 64 );
    8. $email = substr( $_POST['contactEmail'], 0, 64 );
    9. $phone = substr( $_POST['contactPhone'], 0, 11 );
    10. $message = substr( $_POST['contactMessage'], 0, 250 );
    11.  
    12. $body = "Имя: ".$name."\r\n\r\n";
    13. $body .= "Телефон: ".$phone."\r\n\r\n";
    14. $body .= "E-Mail: ".$email."\r\n\r\n";
    15. $body .= "Текст: ".$message;
    16.  
    17. $headers = $headers."MIME-Version: 1.0";
    18. $headers = $headers."Content-Transfer-Encoding: 8bit";
    19. $headers = $headers."Content-Type: text/html; charset=utf-8";
    20. $headers = "From: Мобильный сайт <mobile.мойсайт.ru>\r\n";
    21. $headers = $headers."Return-path: <".$email.">\r\n";
    22.  
    23. mail($to, $subject, $body, $headers);
    24. ?>
    попробуйте у себя проверить. если есть ошибки, прошу исправьте сразу их, а то мне их искать дооооооооооооооолго придется... голова вообще не соображает уже. к тому же сами время свое сэкономите ;)
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вот это $body =
    Код (Text):
    1. "Имя: ".$name."\r\n\r\n";
    2. $body .= "Телефон: ".$phone."\r\n\r\n";
    3. $body .= "E-Mail: ".$email."\r\n\r\n";
    4. $body .= "Текст: ".$message;
    не будет работать при этом
    Код (Text):
    1.  "Content-Type: text/html; charset=utf-8";
    - слепит все в одну строку.

    про двойное окончание строки - читайте RFC по электронной почте и поймете почему так делать нельзя.
    в коде формирования письма много логических ошибок, которые формируют некорректное письмо.
    у меня (с исправлением логики) письмо нормально отправляется и читается.
    по поводу вин под юникодом - вы все же должны сами проконтролировать процесс общения сервера с браузером и на каждом этапе проверить используемую кодировку. я давно на юникоде сижу и знаю что где поправить в случае неожиданностей. в вашем случае был просвет при котором достаточно было сменить кодировку скрипта формирования письма. но пока вы ковыряли вы что-то убили и теперь скорее вам везде cp1251 проще выставить

    Добавлено спустя 1 минуту 23 секунды:
    и да, enhanced
     
  3. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    возможно что-то и убил, но при установки кодировки (везде) на windows-1251, письмо все равно не корректно отображается(

    напишите ваш вариант, а лучше полностью пхп-файл (рабочий). дело в том, что мне не в лом, но я в этом пхп вообще ноль полнейший и беру готовые варианты в инете и переделываю их. но в этот раз я попал в ступор и не знаю что делать.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    прочитайте внимательно свой листинг, построчно. прикиньте что в какой переменной находится на каждом этапе исполнения каждой строки. почему я за вас должен дебаг делать? вы что-то написали. работает не так. вместо того чтоб провести нормальную отладку вы сразу бежите на форум. и тут с вас спросят что не так. а в ответ - "не работает ничего". мы-то откуда знаем что вы ждете и что имеете?
     
  5. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    напишите как у вас?

    Добавлено спустя 1 минуту 4 секунды:
    если бы я знал так хорошо php, то не стал бы обращаться за помощью на форумы.
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а что мешает сделать вот так?
    Код (Text):
    1. var_dump( $to, $subject, $body, $headers, $_POST, mail($to, $subject, $body, $headers));
     
  7. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    аналогично все! опять знаки вопроса, ничего не поменялось.
    я поменял эту строку в коде:

    Код (Text):
    1.  
    2.  
    3. <?php
    4.  
    5. $to = 'мой@адрес.ru';
    6. $subject = 'Письмо с мобильного сайта';
    7.  
    8. $name = substr( $_POST['contactName'], 0, 64 );
    9. $email = substr( $_POST['contactEmail'], 0, 64 );
    10. $phone = substr( $_POST['contactPhone'], 0, 11 );
    11. $message = substr( $_POST['contactMessage'], 0, 250 );
    12.  
    13. $body = "Имя: ".$name."\r\n\r\n";
    14. $body .= "Телефон: ".$phone."\r\n\r\n";
    15. $body .= "E-Mail: ".$email."\r\n\r\n";
    16. $body .= "Текст: ".$message;
    17.  
    18. $headers = $headers."MIME-Version: 1.0";
    19. $headers = $headers."Content-Transfer-Encoding: 8bit";
    20. $headers = $headers."Content-Type: text/html; charset=utf-8";
    21. $headers = "From: Мобильный сайт <mobile.мойсайт.ru>\r\n";
    22. $headers = $headers."Return-path: <".$email.">\r\n";
    23.  
    24. var_dump( $to, $subject, $body, $headers, $_POST, mail($to, $subject, $body, $headers));
    25. ?>
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. <form action="send-email.php" method="POST" data-enhance="false" />
    2. <div class="groupBox">
    3. ..........................
    4. </div>
    5. </form>
    У формы нет такого "/>"
    Тег <form>-это же контейнер имеющий закрывающий тег.
    Код (PHP):
    1. <input type="text" placeholder="Name" required name="contactName" id="contactName" />
    Вы не используете "xhtml", эта фишка "/>" закрывания, у обычных тегов не контейнеров, у вас DOCTYPE-доктип html5, а не xhtml. =)
    Попробуйте так:
    Код (PHP):
    1. <?php
    2. header('Content-type:text/html;charset=utf-8');
    3. $error='';
    4. $title='Отправте сообщение!';
    5. if(isset($_POST['buttonSubmit'])) {
    6.     if(isset($_POST['contactName'],$_POST['contactEmail'],$_POST['contactMessage'])) {
    7.         $name = substr( $_POST['contactName'],0,64);
    8.         $email = substr( $_POST['contactEmail'],0,64);
    9.         $subject = substr( $_POST['contactPhone'],0,11);
    10.         $message = substr( $_POST['contactMessage'],0,250);
    11.         $header="Content-type:text/plain;charset=utf-8\r\n";
    12.         $header.="From: ".$email."\r\n";
    13.         if(mail($admin,$theme,$body,$header)) {
    14.             $error='Сообщение успешно отправлено!';
    15.             $title=$error;
    16.             $_SESSION['success']=true;
    17.         } else {
    18.             $_SESSION['success']=false;
    19.             header('Location: '.$_SERVER['PHP_SELF']);
    20.             exit;
    21.         }
    22.     } else {
    23.         $error='Заполните все поля!';
    24.     }
    25. }
    26. ?>
    27. <!DOCTYPE html>
    28. <html>
    29. <head>
    30.     <meta charset="utf-8">
    31.     <title>
    32.         <?=$title?>
    33.     </title>
    34. </head>
    35. <body>
    36.     <div>
    37.         Файл скрипта проверки формы на Jquery: 
    38.         http://www29.zippyshare.com/v/43446505/file.html и есть PHP файл отправки письма на почту (send-email.php):
    39.     </div>
    40.     <div>
    41.         <?=$error?>
    42.     </div>
    43.     <form method="post" data-enhance="false">
    44.         <input type="text" placeholder="Name" required name="contactName" id="contactName">
    45.         <input type="email" placeholder="Email" required name="contactEmail" id="contactEmail">
    46.         <input type="tel" placeholder="Phone" name="contactPhone" id="contactPhone">
    47.         <textarea placeholder="Message" required name="contactMessage" id="contactMessage"></textarea>
    48.         <input type="submit" class="button buttonStrong right" value="Отправить" name="buttonSubmit" value="submit">
    49.     </form>
    50. </body>
    51. </html>
    Файл скрипта должен быть сохранен в UTF-8 (без BOM).
     
  9. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    вообще ничего не понял!(((
    форма никуда не отправляется, скрипт не работает поэтому (он не задействован!)
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вот же-ж интересно почему? она работает, совершенно не корректно, но работает. полагаю Your специально для вас оставил там ошибки. форма отправляется, письма ходют, но не такие как ожидается.
     
  11. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    короче еще раз повторюсь что у меня есть сейчас.
    вот файл с формой:
    Код (Text):
    1.  
    2. <!doctype html>
    3. <head>
    4.   <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    5. <title>Мобильная версия сайта</title>
    6.   </head>
    7. <body>
    8. ..................
    9. <form action="sendmail.php" method="POST" data-enhance="false">
    10.                 <div class="groupBox">
    11.                  
    12.                   <ul>
    13.                     <li>
    14.                         <input type="text" placeholder="Name" required name="contactName" id="contactName">
    15.                     </li>
    16.                     <li>
    17.                         <input type="email" placeholder="Email" required name="contactEmail" id="contactEmail">
    18.                     </li>
    19.                     <li>
    20.                         <input type="tel" placeholder="Phone" name="contactPhone" id="contactPhone">
    21.                     </li>
    22.                     <li>
    23.                         <textarea placeholder="Message" required name="contactMessage" id="contactMessage"></textarea>
    24.                     </li>
    25.                   </ul>
    26.                  
    27.                   <input type="submit" class="button buttonStrong right" value="Отправить" name="buttonSubmit" value="submit">
    28.                   <div class="clearfix"></div>
    29.                  
    30.                 </div>
    31.                 <!-- end group box -->
    32.               </form>
    33. <script src="js/script.js"></script>
    34. ......................
    35. </body>
    36. </html>
    далее файл обработки формы на jquery - script.js (ссылка на него есть выше)
    и есть файл отправки формы мне на почту - sendmail.php (сохранен в кодировке utf-8):
    Код (Text):
    1.  
    2. <?php
    3.  
    4. $to = 'мой@адрес.ru';
    5. $subject = 'Мобильная версия сайта';
    6.  
    7. $name = substr( $_POST['contactName'], 0, 64 );
    8. $email = substr( $_POST['contactEmail'], 0, 64 );
    9. $phone = substr( $_POST['contactPhone'], 0, 11 );
    10. $message = substr( $_POST['contactMessage'], 0, 250 );
    11.  
    12. $body = "Имя: ".$name."\r\n\r\n";
    13. $body .= "Телефон: ".$phone."\r\n\r\n";
    14. $body .= "E-Mail: ".$email."\r\n\r\n";
    15. $body .= "Текст: ".$message;
    16.  
    17. $headers = $headers."MIME-Version: 1.0";
    18. $headers = $headers."Content-Transfer-Encoding: 8bit";
    19. $headers = $headers."Content-Type: text/html; charset=utf-8";
    20. $headers = "From: <mobile.мойсайт.ru>\r\n";
    21. $headers = $headers."Return-path: <".$email.">\r\n";
    22.  
    23. var_dump($to, $subject, $body, $headers, $_POST, mail($to, $subject, $body, $headers));
    24. ?>
    и на сервере почты стоит кодировка utf-8, в итоге письма приходят с заполненными полями на русском языке. а вот заголовки - одни знаки вопроса.
    кодировку файла с формой ставил на utf-8, все равно одно и тоже - знаки вопроса. короче перепробывал все возможное - ничего не помогает от вопросов. только если поменять заголовки с русского на инглиш, тогда письма корректно отображаются, но на инглише.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    сурс письма в студию. вот прям так как его выдает mta
     
  13. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    Код (Text):
    1.  
    2. Return-Path: <host1268207@serv23.hostland.ru>
    3. X-Original-To: мой@адрес.ru
    4. Delivered-To: мой@адрес.ru
    5. Received: from serv23.hostland.ru (serv23-220.hostland.ru [77.234.200.220])
    6.     by mailserver.hostland.ru (Postfix) with ESMTP id DB5A2549C5
    7.     for <мой@адрес.ru>; Fri,  8 Feb 2013 09:40:24 +0400 (GMT-4)
    8. Received: from localhost.localdomain (unknown [127.0.0.100])
    9.     by localhost (Postfix) with ESMTP id 6FDD32E031
    10.     for <мой@адрес.ru>; Fri,  8 Feb 2013 09:40:24 +0400 (MSK)
    11. Received: by serv23.hostland.ru (Postfix, from userid 2600)
    12.     id 1237C2E059; Fri,  8 Feb 2013 09:40:24 +0400 (MSK)
    13. To: мой@адрес.ru
    14. Subject: Mobile.mysite.ru
    15. From: <mobile.mysite.ru@serv23.hostland.ru>
    16. Message-Id: <20130208054024.1237C2E059@serv23.hostland.ru>
    17. Date: Fri,  8 Feb 2013 09:40:24 +0400 (MSK)
    18.  
    19. ???: админ
    20.  
    21. ???????: 123
    22.  
    23. E-Mail: test@mail.ru
    24.  
    25. ?????: проверка!
    я тут в коде оставил на инглише запись - Mobile.mysite.ru, а в теге body оставил на русском и вот в результате где были русские буквы, появились знаки "?"
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    это не юникод
     
  15. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    а что надо тогда? я не понимаю
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    письмо приходит в однобайтной кодировке. с учетом того что в момент составления международных таблиц символов винды еще не существовало - почта чаще всего использует КОИ-8.
    ваш мта прислал письмо, в котором очевиден русский текст в однобайтной кодировке. так же, судя по "???" вместо "Имя" - остальная часть сообщения, формируемая скриптом - так же в однобайтной кодировке, но не в той, в которой приходят данные от пользователя. следовательно, у вас начиная с этапа "нажали кнопку отправки" начинается какая-то карусель с кодировками.
    например еще потому что форма у вас подписана метатегом с кодировкой cp1251. не удивлюсь, если в заголовках обмена еще что-нибудь указано интересное.
     
  17. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    короче говоря надо попробывать с кодировкой KOI-8 да? т.е. файл отправки формы (sendmail.php) сохранить в КОИ-8 и на сервере почты выставить эту кодировку?

    Добавлено спустя 1 минуту 38 секунд:
    в метатегах, вы имеете ввиду?
     
  18. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    нет. для начала проконтролировать кодировки. от запроса формы до получения письма.

    Добавлено спустя 1 минуту 33 секунды:
    нет
     
  19. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    давайте я вам в личку пришлю мои файлы и вы посмотрите что там не так?
     
  20. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    давайте, только не особо рассчитывайте на помощь - у меня все настроено как часы и подобных ситуаций возникнуть не может. а если и возникнут - я знаю что где как настроено и куда копать. с вашими скриптами я ведь максимум смогу их кодировку изменить. но исполняться-то они будут в моей "швейцарской" экосистеме.
     
  21. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    все таки я надеюсь на вашу помощь, иначе я сюда напрасно пришел(
     
  22. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну о чем я и говорил... мне было достаточно поправить то о чем я говорил вам еще вчера и генерируемое письмо меня удовлетворяет.
    вы так и не стали отлаживать ваше приложение, вы так и не поняли что нужно ожидать и почему ваши действия не соответствуют вашим ожиданиям.

    
    Код (PHP):
    1. <?php
    2. $to = 'test@example.com';
    3. $subject = 'Mobile.Example.com';
    4. // из солидарности потер ваши данные
    5.  
    6.  
    7. $name = substr( $_POST['contactName'], 0, 64 );
    8. $email = substr( $_POST['contactEmail'], 0, 64 );
    9. $phone = substr( $_POST['contactPhone'], 0, 11 );
    10. $message = substr( $_POST['contactMessage'], 0, 250 );
    11. // а что будет если человек просто запустит скрипт? в журналах появится 4 сообщения о несуществующих индексах
    12. // а переменные будут пустыми
    13. // и вы получите пустое письмо
    14.  
    15.  
    16. $body = "Имя: ".$name."\r\n\r\n";
    17. $body .= "Телефон: ".$phone."\r\n\r\n";
    18. $body .= "E-Mail: ".$email."\r\n\r\n";
    19. $body .= "Текст: ".$message;
    20. // тут - кому было сказано почитать про множественные переводы строк? так не надо делать
    21.  
    22. // вот в этом блоке самая ржака. если бы вы понимали какую строку
    23. // ожидаете и в процессе дебага увидели расхождение - проблема была бы решена.
    24.  
    25. $headers = $headers."MIME-Version: 1.0";
    26. // итак: "присвоить хидерс результат конкатенации хидерс со строкой". постойте, какой в жопу хидерс?
    27. // ладно, инициализовали пустую строку и прилепили к ней текст. далее.
    28.  
    29. $headers = $headers."Content-Transfer-Encoding: 8bit";
    30. // формулировка как и у действия1. но! результат - я прилепляю заданную строку в ту же строку что и действие1
    31. // с этих пор заголовок невалидный.
    32.  
    33. $headers = $headers."Content-Type: text/html; charset=utf-8";
    34. // формулировка д1, резульат как у д2
    35. // заголовок уже не спасти - он уже такой длинной строкой что напоминает
    36. // нитевидный пусль. доктор, сообщите время смерти.
    37. // кстати, когда этот заголовок таки сработает - хоть 100500 раз сделай \r\n при формировании $body - будет одна строка.
    38.  
    39. $headers = "From: <test@example.com>\n";
    40. // внезапно! "присвоить хидерсу значение строки с переносом строки". ок, присвоили (новое) значение.
    41. $headers = $headers."Return-path: <".$email.">\n";
    42. // "присвоить результат конкатенации", ок, присвоили.
    43.  
    44. // внимание, вопрос! ЧТО БУДЕТ В ПЕРЕМЕННОЙ $headers?
    45. ВНИМАНИЕ, ОТВЕТ - 2 СТРОКИ С From И Return-path
    46.  
    47.  
    48. var_dump($to, $subject, $body, $headers, $_POST, mail($to, $subject, $body, $headers));
    49. // эту строку можно выкинуть на помойку, так как вы все равно не стали читать что она выводит
    50. ?>
     
  23. ATV

    ATV Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    36
    Симпатии:
    0
    ну хорошо, а дальше то что и как исправить? а то вы загадками (для меня) говорите, а готовый исправленный скрипт так и не хотите выложить((( и вам время сэкономили бы и я со спокойной душой ушел бы.
    понимаю что именно в php-файле отправки скрыта ошибка, но если бы я знал язык программирования, я бы быстрее определился где и что у меня не так, но увы - его не знаю.
     
  24. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Скрипт готовый я вам выложил, полностью рабочий... Проверял лично...
    Выбросите все и забейте на программирование! Лучший выход для вас.

    Либо включите мозги и учитесь, а не орите...
     
  25. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну не выкладываю для вашего же блага - вы обязаны мозги включить для реализации своей задачи. или оплатить, если считаете ситуацию тупиковой и опускаете руки.

    держите. бесплатно...
    Код (PHP):
    1. <?php
    2. $to = 'text@example.com';
    3. $subject = 'Mobile.Example.com';
    4.  
    5. $name = isset( $_POST['contactName'] ) ? substr( $_POST['contactName'], 0, 64 ) : null;
    6. $email = isset( $_POST['contactEmail'] ) ? substr( $_POST['contactEmail'], 0, 64 ) : null;
    7. $phone = isset( $_POST['contactPhone'] ) ? substr( $_POST['contactPhone'], 0, 11 ) : null;
    8. $message = isset( $_POST['contactMessage'] ) ? substr( $_POST['contactMessage'], 0, 250 ) : null;
    9.  
    10. if( null !== $name && null !== $email && null !== $phone && null !== $message )
    11. {
    12.     $body = sprintf("<html><body>
    13. <dl><dt>Имя</dt><dd>%s</dd></dl>
    14. <dl><dt>Телефон</dt><dd>%s</dd></dl>
    15. <dl><dt>E-Mail</dt><dd>%s</dd></dl>
    16. <dl><dt>Текст</dt><dd>%s</dd></dl>
    17. </body></html>"
    18.             ,   htmlspecialchars( $name )
    19.             ,   htmlspecialchars( $phone )
    20.             ,   htmlspecialchars( $email )
    21.             ,   nl2br( htmlspecialchars( $message ) )
    22.         );
    23.     $headers = <<<HDRS
    24. From: <text@example.com>
    25. Return-path: <{$email}>
    26. MIME-Version: 1.0
    27. Content-Transfer-Encoding: 8bit
    28. Content-Type: text/html; charset=utf-8
    29. HDRS;
    30.  
    31.     var_dump($to, $subject, $body, $headers, $_POST, mail($to, $subject, $body, $headers));
    32. }
    33. ?>
    по успешной отработке создает письмо с кодом (например):
    Код (Text):
    1. X-Sendmail-Dummy: /usr/sbin/sendmail -t -i
    2. To: text@example.com
    3. Subject: Mobile.Example.com
    4. X-PHP-Originating-Script: 1000:sendmail.php
    5. From: <text@example.com>
    6. Return-path: <test@example.com>
    7. MIME-Version: 1.0
    8. Content-Transfer-Encoding: 8bit
    9. Content-Type: text/html; charset=utf-8
    10.  
    11. <html><body>
    12. <dl><dt>а˜аМб</dt><dd>б„б‹аВаА</dd></dl>
    13. <dl><dt>аЂаЕаЛаЕб„аОаН</dt><dd>бб‡баМ</dd></dl>
    14. <dl><dt>E-Mail</dt><dd>test@example.com</dd></dl>
    15. <dl><dt>аЂаЕаКбб‚</dt><dd>аЙб†бƒаПаИб„аВаАаПб„</dd></dl>
    16. </body></html>
    которое в почтовом клиенте выглядит как:
    Код (Text):
    1.  
    2.  
    3. Имя
    4.     фыва
    5.  
    6. Телефон
    7.     ячсм
    8.  
    9. E-Mail
    10.     test@example.com
    11.  
    12. Текст
    13.     йцупифвапф
    в последнем случае это не с кодировкой проблемы а кириллица от балды набрана.

    удачи.