За последние 24 часа нас посетили 36512 программистов и 1713 роботов. Сейчас ищут 798 программистов ...

кодировка текста письма функция mail()

Тема в разделе "PHP для новичков", создана пользователем greenzlat, 28 окт 2014.

  1. greenzlat

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

    С нами с:
    27 апр 2008
    Сообщения:
    255
    Симпатии:
    0
    Создал обработчик формы через конструктор форм, отправляю на почту письмо. Письмо приходит с абракатаброй... Понимаю что надо кодировку прописать. В каком куске кода сделать?
    Код (Text):
    1. <?php
    2. $form = new ProcessForm();
    3. $form->field_rules = array(
    4.     'dlina_karniza'=>'required',
    5.     'stik'=>'required',
    6.     'tip_karniza'=>'required',
    7.     'wes_shtor'=>'required',
    8.     'kolvo_poloten'=>'required',
    9.     'upravlenie'=>'required',
    10.     'phone'=>'required'
    11. );
    12. $form->validate();
    13.  
    14. class ProcessForm
    15. {
    16.     public $field_rules;
    17.     public $error_messages;
    18.     public $fields;
    19.     private $error_list;
    20.     private $is_xhr;
    21.      function __construct()
    22.     {
    23.         $this->error_messages = array(
    24.             'required' => 'This field is required',
    25.             'email' => 'Please enter a valid email address',
    26.             'number' => 'Please enter a numeric value',
    27.             'url' => 'Please enter a valid URL',
    28.             'pattern' => 'Please correct this value',
    29.             'min' => 'Please enter a value larger than the minimum value',
    30.             'max' => 'Please enter a value smaller than the maximum value'
    31.         );
    32.  
    33.         $this->field_rules = array();
    34.         $this->error_list = '';
    35.         $this->fields = $_POST;
    36.         $this->is_xhr = $this->xhr();
    37.     }
    38.      function validate()
    39.     {
    40.         if (!empty($this->fields))
    41.         {
    42.             //Validate each of the fields
    43.             foreach ($this->field_rules as $field => $rules)
    44.             {
    45.                 $rules = explode('|', $rules);
    46.  
    47.                 foreach ($rules as $rule)
    48.                 {
    49.                     $result = null;
    50.  
    51.                     if (isset($this->fields[$field]))
    52.                     {
    53.                         $param = false;
    54.  
    55.                         if (preg_match("/(.*?)\[(.*?)\]/", $rule, $match))
    56.                         {
    57.                             $rule = $match[1];
    58.                             $param = $match[2];
    59.                         }
    60.                          $this->fields[$field] = $this->clean($this->fields[$field]);
    61.  
    62.                         //if the field is a checkbox group create string
    63.                         if (is_array($this->fields[$field]))
    64.                             $this->fields[$field] = implode(', ', $this->fields[$field]);
    65.  
    66.                         // Call the function that corresponds to the rule
    67.                         if (!empty($rule))
    68.                             $result = $this->$rule($this->fields[$field], $param);
    69.  
    70.                         // Handle errors
    71.                         if ($result === false)
    72.                             $this->set_error($field, $rule);
    73.                     }
    74.                 }
    75.             }
    76.              if (empty($this->error_list))
    77.             {
    78.                 if ($this->is_xhr)
    79.                     echo json_encode(array('status' => 'success'));
    80.                  $this->process();
    81.             }
    82.             else
    83.             {
    84.                 if ($this->is_xhr)
    85.                     echo json_encode(array('status' => 'invalid', 'errors' => $this->error_list));
    86.                 else echo $this->error_list;
    87.             }
    88.         }
    89.     }
    90.      function process()
    91.     {
    92.           $msg = "Form Contents: \n\n";
    93.           foreach($this->fields as $key => $field)
    94.                 $msg .= "$key :  $field \n";
    95.  
    96.           $to = 'greenzlat@mail.ru';
    97.           $subject = 'Form Submission';
    98.           $from = 'emailaddress@domain.com';
    99.  
    100.           mail($to, $subject, $msg, "From: $from\r\nReply-To: $from\r\nReturn-Path: $from\r\n");
    101.      }
    102.  
    103.  
    104.  
    105.     function set_error($field, $rule)
    106.     {
    107.         if ($this->is_xhr)
    108.         {
    109.             $this->error_list[$field] = $this->error_messages[$rule];
    110.         }
    111.         else $this->error_list .= "<div class='error'>$field: " . $this->error_messages[$rule] . "</div>";
    112.     }
    113.  
    114.  
    115.  
    116.  
    117.  
    118.     function xhr()
    119.     {
    120.         return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') ? true : false;
    121.     }
    122.  
    123.  
    124.  
    125.  
    126.  
    127.     /** Validation Functions */
    128.     function required($str, $val = false)
    129.     {
    130.  
    131.         if (!is_array($str))
    132.         {
    133.             $str = trim($str);
    134.             return ($str == '') ? false : true;
    135.         }
    136.         else
    137.         {
    138.             return (!empty($str));
    139.         }
    140.     }
    141.  
    142.  
    143.  
    144.  
    145.  
    146.     function email($str)
    147.     {
    148.         return (!preg_match("/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD", $str)) ? false : true;
    149.     }
    150.  
    151.  
    152.  
    153.  
    154.  
    155.     function number($str)
    156.     {
    157.         return (!is_numeric($str)) ? false : true;
    158.     }
    159.  
    160.  
    161.  
    162.  
    163.  
    164.     function min($str, $val)
    165.     {
    166.         return ($str >= $val) ? true : false;
    167.     }
    168.  
    169.     function max($str, $val)
    170.     {
    171.         return ($str <= $val) ? true : false;
    172.     }
    173.  
    174.     function pattern($str, $pattern)
    175.     {
    176.         return (!preg_match($pattern, $str)) ? false : true;
    177.     }
    178.      function clean($str)
    179.     {
    180.         $str = is_array($str) ? array_map(array("ProcessForm", 'clean'), $str) : str_replace('\\', '\\\\', strip_tags(trim(htmlspecialchars((get_magic_quotes_gpc() ? stripslashes($str) : $str), ENT_QUOTES))));
    181.         return $str;
    182.     }
    183. }
    184.   ?>
    Добавлено спустя 7 минут:
    Изменил строку на эту:
    Код (Text):
    1.  mail($to, $subject, $msg, "Content-type: text/plain; charset=utf-8");
    Вроде заработало)
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Вместо вот этого ужаса:
    Код (PHP):
    1.  function email($str)
    2.     {
    3.         return (!preg_match("/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD", $str)) ? false : true;
    4.     }
    5.  
    можно сделать проще:
    Код (Text):
    1.  
    2.  function email($str)
    3.  {
    4.       return filter_var($str, FILTER_VALIDATE_EMAIL) !== false;
    5. }
     
  3. MitS

    MitS Новичок

    С нами с:
    30 окт 2014
    Сообщения:
    2
    Симпатии:
    0
    Адрес:
    Москва
    Главное, чтобы кодировка сервера, скрипта и сообщения совпадали.
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    зачем это?
     
  5. MitS

    MitS Новичок

    С нами с:
    30 окт 2014
    Сообщения:
    2
    Симпатии:
    0
    Адрес:
    Москва
    Чтобы абракатабры небыло.
     
  6. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    в браузере одна кодировка, интернал сервера другая, файла - третья, письма - четвертая. и всё нормально работает. что я делаю не так?
    это не ГЛАВНОЕ как вы утверждаете. если человек не понимает, что у него с кодом происходит - будет абракадабра вылезать. когда человек понимает зачем существуют кодировки - ему не составит труда ими манипулировать для корректной работы в любой ситуации. иными словами если человеку лениво - надо настраивать так,
    и вы даже себе представить не можете.... конечный пользователь все равно может увидеть абракадабру. ведь вы не всё учли... сервер/скрипт/сообщение это не еще не залог успеха. это только то о чем вы знаете.