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

aleks_lv

Новичок
cтрано работает функция
mail()-отправка писем на почтовый ящик yandex
1)хостинг бесплатный
http://www.hostinger.ru/
2)код отправки
php
Код:
<?php


//send email


$to="**********@yandex.ua";
    $subject = "Заказ" ;

    $server = $_SERVER['HTTP_HOST'];

$email=$_REQUEST['email'];
$name=$_REQUEST['name'];
$phone=$_REQUEST['phone'];

$forma=$_REQUEST['forma'];
if($forma=="1")
{
    $forma="Центральная";
}
if($forma=="2"){
    $forma="Закажите звонок";
}
$comp=$_REQUEST['comp'];

$body = "От: $name\n";
if(isset($email)){
    $body.="Email: $email\n";
}
if(isset($phone)){
    $body.="Телефон: $phone\n";
}
if(isset($comp)){
    $body.="Компания: $comp\n";
}

$body.="С сайта:Медицинская одежда, халаты, медицинские костюмы на заказ с доставкой по России\n";
$body.="С формы: $forma\n";
$body.="IP: " . $_SERVER["REMOTE_ADDR"];
    //$message = "If you got this message, mail sending from $server is working fine :)" ;

    mail( "$to", "$subject",

        $body, "From: *********@yandex.ru"  );



?>
данные передаются ajax

Код:
Popup.prototype.getValues = function(){
    var r = "";

    this.form.find('input:not([type=submit]),textarea').each(function(ind){
        if(ind==0){
        r+=jq_144(this).attr('rel')+"="+this.value
        }
        if(ind>0){
        r+="&" +jq_144(this).attr('rel')+"="+this.value
        }

    });
    r+="&forma="+this.form.find('.text').text();

    return r;
}; 

this.$.ajax({
        type: "POST",
        url: url,
        data: this.getValues(),
        success: function(data){
            that.afterSubmit();
        },
        error: function(){
            alert('Ошибка отправки данных. Попробуйте отправить запрос попозже.')
        },
        complete: function(){
            jq_144('#loading_bar').fadeOut();
        }
    })
проблемы
одно сообщение с формы доходит ,второе нет-код один тот что привел выше
подозрение что если вводишь кириллицу то не работает
может пробема в хостинге?или что не так?
у кого было подобное?
 

scorpion-ds

Новичок
Я бы за:
Код:
"$to", "$subject"
по рукам бил. Ну зачем спрашивается переменную брать в кавычки? Вообще считаю плохим тоном вставлять переменные в строки баз разрыва строки:
PHP:
$str = 'Привет,' . $name . '!';
Не знаю какие там потери на производительности от переменных в строках, но часто такие переменные плохо видно в коде.

Теперь по теме:
Если ты определил, что проблема в кириллице, то ты уже на пол пути к решению, вариант решения:
- сохрани файлы в UTF-8 без BOM, и делай так всегда;
- если по какой-то причине сохранить в UTF-8 нельзя, то воспользуйся функцией iconv, для преобразования отдельных строк в UTF-8;
- еще можно с base_64 поработать, но я уже не помню как там правильно надо делать.
 

AnrDaemon

Продвинутый новичок
Потерь никаких, и при использовании нормального редактора их прекрасно видно в коде.
Сохранять без BOM есть смысл только в том случае, если
1. Это реально необходимо (i.e. shell-script);
2. Предполагается использование этих файлов совместно с каменными топорами и костяными ножами.

P.S.
PHP:
<?php
/** Smarty base64 encode modifier plugin
*
* @version $Id$
*/

if(is_callable('base64_encode'))
{
  function smarty_modifier_base64($source, $wrap = 76)
  {
    $_result = base64_encode($source);

    return chunk_split($_result, $wrap);
  }
}
PHP:
<?php
/** Smarty function plugin
*/

function smarty_function_mime_header($params, Smarty_Internal_Template $template)
{
  $_name = mb_convert_case($params['name'], MB_CASE_TITLE);
  $_value = $params['value'];
  $_pref = array(
        'input-charset' => is_callable('mb_internal_encoding')
          ? mb_internal_encoding()
          : 'UTF-8',
        'output-charset' => is_callable('mb_internal_encoding')
          ? mb_internal_encoding()
          : 'UTF-8'
        );
  if(isset($params['wrap']))
  {
    $_pref['line-length'] = $params['wrap'];
  }

  switch($_name)
  {
    case 'From':
    case 'Sender':
    case 'To':
    case 'Cc':
    case 'Bcc':
    case 'Resent-From':
    case 'Resent-Sender':
    case 'Resent-To':
    case 'Resent-Cc':
    case 'Resent-Bcc':
      if(!is_array($_value))
      {
        throw new Exception('Compound address strings support not implemented yet.');
      }

      if(!isset($_value['email']))
      {
        throw new Exception('Address not defined or multi-recipient header is requested (not yet implemented).');
      }

      $_aname = isset($_value['name']) ? mb_encode_mimeheader($_value['name']) . ' ' : '';

      if(is_array($_value['email']))
      {
        $_address = '';
        foreach($_value['email'] as $v)
        {
          $_address .= (empty($_address) ? '' : ', ') . "<$v>";
        }
        $_address = mb_encode_mimeheader($_address);
      }
      else
      {
        $_address = "<{$_value['email']}>";
      }

      return "$_name: {$_aname}{$_address}";
    default:
      return iconv_mime_encode($_name, $params['value'], $_pref);
  }
}
Адреса в шаблон передавать как array([name, ] email). До ума доделать функцию пока не было времени, извини.

message.tpl:
Код:
{foreach $header as $name => $value}{mime_header name=$name value=$value}
{/foreach}
Date: {'r'|date}
Message-ID: <{$msgid}@example.com>
Content-Type: multipart/mixed; boundary="{$msgid}"
X-Priority: 3
X-Mailer: mail/1.0

--{$msgid}
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64

{include 'messageText.tpl' assign=message_body}{$message_body|base64}
--{$msgid}{if is_array($images)}{foreach $images as $cid => $file}

Content-Disposition: inline; filename="{$file}"
Content-ID: <{$cid}>
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64

{fetch file="file://{$smarty.current_dir}/{$file}" assign=imageData}{$imageData|base64}
--{$msgid}{/foreach}{/if}--
 
Последнее редактирование:

scorpion-ds

Новичок
Потерь никаких, и при использовании нормального редактора их прекрасно видно в коде.
Сохранять без BOM есть смысл только в том случае, если
1. Это реально необходимо (i.e. shell-script);
2. Предполагается использование этих файлов совместно с каменными топорами и костяными ножами.
Какой смысл сохранять файлы в cp1251, если UTF-8 более универсальная?
И на сколько я знаю BOM будет мешать на выводе, то есть производить вывод этого BOM, после вызова таких файлов уже нельзя будет выполнять функции вроде header.
 

AnrDaemon

Продвинутый новичок
Я не предлагал сохранять файлы в cp1251.
Если BOM мешает на выводе, надо чинить вывод.
В Smarty это уже исправлено.
 

scorpion-ds

Новичок
Причем тут Смарти, даже если любой php файл (без своего вывода) будет сохранен с BOM, то он будет делать вывод этого самого BOM.
 

CoolKid

Новичок
Цитата из PSR-1
В файлах с кодом PHP НЕОБХОДИМО использовать только UTF-8 без BOM.
Ребята из Framework Interoperability Group наверняка не просто так эту строчку написали :)
 

AnrDaemon

Продвинутый новичок
Да, не просто так. PHP не имеет нормальной поддержки UTF-8.
 

scorpion-ds

Новичок
В данном случае, не в PHP дело, интерпретатор PHP обрабатывает только то, что в тегах "<?php ?>", остальное он проходит мимо, а вот Apache как раз и выведет этот самый BOM, приняв его за "полезные данные".
 

AnrDaemon

Продвинутый новичок
Да-да-да. У разработчика Smarty была точно такая же аргументация.
 

WMix

герр M:)ller
Партнер клуба
Где вы этот бом берете, уже 8 лет как записываю не задумываясь, вы там случаем не нотпадом под вин2000 пишете?
 

scorpion-ds

Новичок
Берут еще и как, за последние время у меня:
- наш seo-специалист, который правил языковые файлы;
- клиент который чет решил подправить код;
- интерны, которые уже после сдачи своих заданий хотели, что-то "быстренько" поправить.
 
Сверху