[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не работает кодировка enctype=multipart/form-data
Aleks-prog
Здравствуйте,

Вообщем сразу к делу) Проблема, при отправке формы с прикрепленным файлом и соответственно с параметром enctype="multipart/form-data", обнаружил что кодировка "благодаря" этому параметру изменяется на кракозябру, нужно чтобы отправил на почту с прикрепленным файлом

вот что показал ПОСТ запрос:(слева параметры, справа значения)

org	мывп
name ывпы
email Aleksaaa@yandex.ru
tel 56856856856
sroch Срочно!
notar Заверить!
apostil Апостиль!
coments егнекгкгекгкегекегытпыршдаопрдадырид
sendmail Отправить заказ


Код

<?php
session_start();
$admin = 'login@yandex.ru';
error_reporting(E_ALL ^ E_NOTICE);
if ( isset( $_POST['sendMail'] ) ) {

$name = substr( $_POST['name'], 0, 64 );
$email = substr( $_POST['email'], 0, 64 );
$org = substr( $_POST['org'], 0, 64 );
$tel = substr( $_POST['tel'], 0, 250 );
$file_name = $_FILES['file_name'];
$sroch = isset($_POST['sroch'])? substr( $_POST['sroch'], 0,255):'не срочно';
$notar = isset($_POST['notar'])? substr( $_POST['notar'], 0, 255):'не заверять';
$apostil = isset($_POST['apostil'])? substr( $_POST['apostil'], 0, 255):'без Апостиля';
$coments = isset($_POST['coments'])? substr( $_POST['coments'], 0):'нет';


$error = '';
if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>';
if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>';
if ( empty( $org ) ) $error = $error.'<li>Не заполнено поле "Организация"</li>';
if ( empty( $tel ) ) $error = $error.'<li>Не заполнено поле "Телефон"</li>';
if ( empty( $file_name ) ) $error = $error.'<li>Не выбран файл</li>';
if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
$error = $error.'<li>поле "E-mail" должно соответствовать формату somebody@somewhere.ru</li>';
if ( !empty( $error ) ) {
$_SESSION['form1']['error'] = '<p>При заполнении формы были допущены ошибки:</p><ul>'.$error.'</ul>';
$_SESSION['form1']['name'] = $name;
$_SESSION['form1']['email'] = $email;
$_SESSION['form1']['org'] = $org;
$_SESSION['form1']['tel'] = $tel;
$_SESSION['form1']['file_name'] = $file_name;
$_SESSION['form1']['sroch'] = $sroch;
$_SESSION['form1']['notar'] = $notar;
$_SESSION['form1']['apostil'] = $apostil;
$_SESSION['form1']['coments'] = $coments;

header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$file="";
$filepath = array();
$filename = array();
for( $i = 0; $i < count($_FILES['file_name']); $i++) {
if ( !empty( $_FILES['file_name']['tmp_name'][$i] ) and $_FILES['file_name']['error'][$i] == 0 ) {
$filepath[] = $_FILES['file_name']['tmp_name'][$i];
$filename[] = $_FILES['file_name']['name'][$i];
}
}


$body = "КОНТАКТНОЕ ЛИЦО:\r\n".$name."\r\n\r\n";
$body .= "E-MAIL:\r\n".$email."\r\n\r\n";
$body .= "ОРГАНИЗАЦИЯ:\r\n".$org."\r\n\r\n";
$body .= "ТЕЛЕФОН:\r\n".$tel."\r\n\r\n";;
$body .= "СРОЧНОСТЬ:\r\n".$sroch."\r\n\r\n";
$body .= "НОТАРИАЛЬНОЕ ЗАВЕРЕНИЕ:\r\n".$notar."\r\n\r\n";
$body .= "АПОСТИЛЬ:\r\n".$apostil."\r\n\r\n";
$body .= "КОММЕНТАРИИ:\r\n".$coments;


function quoted_printable_encode ( $string ) {
// rule #2, #3 (leaves space and tab characters in tact)
$string = preg_replace_callback (
'/[^\x21-\x3C\x3E-\x7E\x09\x20]/',
'quoted_printable_encode_character',
$string
);
$newline = "=\r\n"; // '=' + CRLF (rule #4)
// make sure the splitting of lines does not interfere with escaped characters
// (chunk_split fails here)

$string = preg_replace ( '/(.{73}[^=]{0,3})/', '$1'.$newline, $string);
return $string;
}


// Вспомогательная функция для отправки почтового сообщения с вложением
function send_mail($admin, $body, $email, $filepath, $filename)
{
$subject = '=?utf-8?B?'.base64_encode('Заполнена форма на сайте').'?=';
$boundary = "--".md5(uniqid(time())); // генерируем разделитель
$headers = "From: ".strtoupper($_SERVER['SERVER_NAME'])."<login@yandex.ru>\r\n";
$headers .= "Return-path: <".$email.">\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .="Content-Type: multipart/mixed; boundary=\"".$boundary."\"\r\n";
$multipart = "--".$boundary."\r\n";
$multipart .= "Content-type: text/plain; charset=\"utf-8\"\r\n";
$multipart .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";

$body = quoted_printable_encode( $body )."\r\n\r\n";

$multipart .= $body;

$file = '';
$count = count( $filepath );
if ( $count > 0 ) {
for ( $i = 0; $i < $count; $i++ ) {
$fp = fopen($filepath[$i], "r");
if ( $fp ) {
$content = fread($fp, filesize($filepath[$i]));
fclose($fp);
$file .= "--".$boundary."\r\n";
$file .= "Content-Type: multipart/form-data\r\n";
$file .= "Content-Transfer-Encoding: base64\r\n";
$file .= "Content-Disposition: attachment; filename=\"".$filename[$i]."\"\r\n\r\n";
$file .= chunk_split(base64_encode($content))."\r\n";
iconv('WINDOWS-1251', 'UTF-8', $name);
iconv('WINDOWS-1251', 'UTF-8', $email);
iconv('WINDOWS-1251', 'UTF-8', $org);
iconv('WINDOWS-1251', 'UTF-8', $tel);
iconv('WINDOWS-1251', 'UTF-8', $sroch);
iconv('WINDOWS-1251', 'UTF-8', $notar);
iconv('WINDOWS-1251', 'UTF-8', $apostil);
iconv('WINDOWS-1251', 'UTF-8', $coments);
}
}
}

$multipart .= $file."--".$boundary."--\r\n";

if( mail($admin, $subject, $multipart, $headers) )
return true;
else
return
false;
}

function quoted_printable_encode_character ( $matches ) {
$character = $matches[0];
return sprintf ( '=%02x', ord ( $character ) );
}


if ( send_mail($admin, $body, $email, $filepath, $filename) ){
$_SESSION['success'] = true;

}else{
$_SESSION['success'] = false;
header("location:".$_SERVER['PHP_SELF']."?result=error");
die();
}

}

?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--<
link href="Accordion.css" rel="stylesheet" type="text/css">-->

</
head>

<
body bgcolor="#FFFFFF">
<
div class="main">

</
div>
<
div class="middle">




<
div class="content">
<
div class="zagol"><h4 align="center">Ценообразование:</h4></div>




<?php
$a="";
$a .= "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
?>
<p> </p>

<
form id="form1" name="form1" enctype="multipart/form-data" method="post" action="">

<
p><label for="org">Организация: </label> <input type="text" id="org" name="org" /></p>

<
p> </p>

<
p><label for="name">Контактное лицо: </label> <input type="text" id="name" name="name" /></p>

<
p> <label for="email">Контактный e-mail:</label> <input type="text" id="email" name="email" /></p>

<
p> </p>

<
p><label for="tel">Телефон: </label> <input type="text" id="tel" name="tel" /></p>

<
p> </p>

<
p> <label for="file_name">Добавьте текстовый файл для перевода:</label> <input type="file" id="file_name" name="file_name" /></p>

<
p>принимаются файлы форматов .doc .docx .txt .xml .pdf .jpg .ttf .zip</p>



<
p>Дополнительно:</p>



<
table border="0" cellspacing="0" cellpadding="0">

<
tbody>

<
tr>

<
td width="127" valign="top">

<
p style="text-align: right;">Срочный заказ</p>

</
td>

<
td width="24" valign="top">

<
p><input type="checkbox" value="Срочно!" id="sroch" name="sroch" /> <label for="sroch"></label></p>

</
td>

<
td width="192" valign="top">

<
p style="text-align: right;">Нотариальное заверение</p>

</
td>

<
td width="24" valign="top">

<
p><input type="checkbox" value="Заверить!" id="notar" name="notar" /> <label for="notar"></label></p>

</
td>

<
td width="88" valign="top">

<
p style="text-align: right;">Апостиль</p>

</
td>

<
td width="24" valign="top">

<
p><input type="checkbox" value="Апостиль!" id="apostil" name="apostil" /> <label for="apostil"></label></p>

</
td>

</
tr>

</
tbody>

</
table>

<
p> </p>

<
p>Ваши комментарии:</p>

<
p> </p>

<
p><label for="coments"></label> <textarea rows="5" cols="45" id="coments" name="coments"></textarea></p>



<
p><input type="submit" value="Отправить заказ" id="sendmail" name="sendmail" /></p>

<
pre>
<?php
echo $_POST;
echo $_FILES;
?>
</pre>
</
form>

<?php
if ( isset( $_POST['sendMail'] ) ) {
if( $_SESSION['success'] == true){
?>
<script type="text/javascript">
location.href($a);
</
script>
<?php
echo '<font color="green">Сообщение отправлено!</font>';

}else{

?>
<script type="text/javascript">
location.href($a);
</
script>
<?php
echo '<font color="red">Произошла ошибка при отправке сообщения!</font>';

}
}

?>
</div>
</
div>
<
div class="footer">
<
div class="main1"><h4><i><font color="#000000"> </font></i></h4></div>
<
div class="main2"></div>
<
div class="main3"></div>
</
div>

</
body>
</
html>



Помогите пожалуйста исправить проблему с кодировкой... замучался уже ничто в голову не лезет
Весь код:

все кодировки utf8 стоят и файлы и страницы и php



Спустя 1 час, 8 минут, 49 секунд (4.11.2011 - 15:00) Winston написал(а):
meta тег с кодировкой имеет более низкий приоритет чем header
Потому поставь вверху перед session_start()
header('Content-Type: text/html; charset=utf-8');

Спустя 8 часов, 23 минуты, 4 секунды (4.11.2011 - 23:23) Aleks-prog написал(а):
Винстон, спасибо завтра, то есть сегодня утром попробую laugh.gif

С ПРАЗДНИКОМ!

Спустя 5 минут, 45 секунд (4.11.2011 - 23:29) Winston написал(а):
Цитата (Aleks-prog @ 4.11.2011 - 22:23)
С ПРАЗДНИКОМ!

День наро́дного еди́нства ?

Спустя 17 минут, 17 секунд (4.11.2011 - 23:46) Aleks-prog написал(а):
ДА, но не для всех канеш это праздник wink.gif

Спустя 6 минут, 41 секунда (4.11.2011 - 23:53) Winston написал(а):
Первый раз такой праздник слышу...
На Украине нету такого.

Спустя 8 часов, 45 минут, 6 секунд (5.11.2011 - 08:38) Aleks-prog написал(а):
все равно не работает Вот что выводит

Заголовки Post Ответ Кэш HTML
Части multipart/form-data
org мывп
name ывпы
email login@yandex.ru
tel 56856856856
sroch Срочно!
notar Заверить!
apostil Апостиль!
coments впвопаоаоап
sendmail Отправить заказ

Спустя 57 минут, 10 секунд (5.11.2011 - 09:35) imbalance_hero написал(а):
Aleks-prog
Кодировка на странице формы, и кодировка на странице-обработчике - точно одинаковая? В самом начале скрипта напиши
echo '<pre>'.print_r($_POST,1).'</pre>';
exit();

Спустя 10 минут, 54 секунды (5.11.2011 - 09:46) Aleks-prog написал(а):
В начале скрипта
Array
(
[org] => мывп
[name] => ывпы
[email] => log@yandex.ru
[tel] => 56856856856
[sroch] => Срочно!
[notar] => Заверить!
[apostil] => Апостиль!
[coments] => патавроаварва
[sendmail] => Отправить заказ
)

а потом билеберда)

Спустя 2 минуты, 26 секунд (5.11.2011 - 09:49) imbalance_hero написал(а):
Aleks-prog
Потом - это когда? Я вижу у тебя в скрипте много iconv, зачем? Ты получил в норм кодировке данные.

Спустя 4 минуты, 6 секунд (5.11.2011 - 09:53) Aleks-prog написал(а):
в firebug билеберду пишет
iconv это раньше когда я отправлял тоже вроде кодировка нормальная а на почту приходила билеберда

Спустя 2 часа, 26 минут, 2 секунды (5.11.2011 - 12:19) imbalance_hero написал(а):
Aleks-prog
Надо начать с чистого листа, 1 файл, форма+обработчик. Всё в одной кодировке. smile.gif

Спустя 1 час, 33 минуты, 34 секунды (5.11.2011 - 13:52) Aleks-prog написал(а):
Сообщение без прикрепленного файла отправляет а с ним пишет что отправил, но не от правляет, логи не написали ничего абсолютно

<?
$mailto = "aleksaaa555@mail.ru";
$charset = "utf-8";
$subject = "Имя письма";
$content = "text/html";
$status="<br>";
if (!empty($_POST))
{
$name = htmlspecialchars(stripslashes($_POST['imko']));
$message = htmlspecialchars(stripslashes($_POST['tikstik']));
$mail = htmlspecialchars(stripslashes($_POST['posta']));
$picture = "";//
if(empty($_POST['posta']))
{
$status = "Вы не указали свой E-mail!";
}
elseif (!preg_match("/^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$/i", $mail))
{
$status = "Вы ввели некорректный адрес";
}
else
{
$headers = "MIME-Version: 1.0\r\n";
$headers .= "From: \"".$name."\" <".$mail.">\r\n";
$headers .= "Bcc: aleksaaa555@mail.ru\r\n";
$headers .= "X-Mailer: E-mail from my super-site \r\n";
$sendmessage = "<html><body>
<p><b>E-mail для связи:</b> "
.$mail."</p>
<p><b>Сообщение:</b> "
.$message."</p>
</body></html>"
;
/**/// Если поле выбора вложения не пустое - закачиваем его на сервер
if (!empty($_FILES['mail_file']['tmp_name']))
{
$path = $_FILES['mail_file']['name'];
if (copy($_FILES['mail_file']['tmp_name'], $path)) $picture = $path;
}
if(empty($picture))
{
$headers .= "Content-Type: ".$content." charset=".$charset."\r\n";
if (mail($mailto,$subject,$sendmessage,$headers))
{
$status = "Ваше сообщение отправлено!";
}
else
{
$status = "По техническим причинам сообщение не было отправлено. Попробуйте снова, а если не получится, обратитесь к разработчикам";
}
}
//отправка сообщения с вложением
else
{
$fp = fopen($path,"r");
if (!$fp)
{
print "Файл ".$path." не может быть прочитан";
exit();
}
$file = fread($fp, filesize($path));
fclose($fp);

$boundary = "--".md5(uniqid(time())); // генерируем разделитель

$headers .="Content-Type: multipart/mixed; boundary=\"".$boundary."\"\n";
$multipart .= "--".$boundary."\n";

$multipart .= "Content-Type: text/html; charset=$charset\n";
$multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
$multipart .= "$sendmessage\n\n";

$message_part = "--".$boundary."\n";
$message_part .= "Content-Type: application/octet-stream\n";
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: attachment; filename = \"".$picture."\"\n\n";
$message_part .= chunk_split(base64_encode($file))."\n";
$multipart .= $message_part."--".$boundary."--\n";

if(!mail($mailto, $subject, $multipart, $headers)) $status = "По техническим причинам сообщение не было отправлено. Попробуйте снова, а если не получится, обратитесь к разработчикам";
else $status = "Ваше сообщение отправлено!";
}
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>
Ценообразование</title>
</head>
<body>
<form
method='post' name='formname' enctype='multipart/form-data'>
<p>
<label
for='imko'>Контактное лицо:</label><br>
<input
name='imko' maxlength='50' type='text' size='10'>
</p>
<p>
<label
for='posta'>Почта для связи:</label><br>
<input
name='posta' type='text' size='10' value=''>
</p>
<p>
<label
for='tikstik'>Сообщение:</label><br>
<textarea
rows='5' cols='14' name='tikstik'></textarea>
</p>
<p>
<label
for='mail_file'>Фотография/файл:</label><br>
<input
type='file' name='mail_file' size='10'>
</p>
<p>
<input
name='submit' type='submit' value='Отправить'>
</p>
</form>


<?=$status;?>
</body>
</html>

Спустя 1 минута, 53 секунды (5.11.2011 - 13:54) Aleks-prog написал(а):
да еще - копирует файл на сервер, но имя у файла получается вот такое Текстовый документ.txt huh.gif

Спустя 19 минут (5.11.2011 - 14:13) Renden написал(а):
Aleks-prog
Поставь кодировку самого php и html файла в utf-8 без BOM

Спустя 6 минут, 46 секунд (5.11.2011 - 14:20) Aleks-prog написал(а):
уже стоит

Спустя 42 минуты, 21 секунда (5.11.2011 - 15:02) Aleks-prog написал(а):
Можно с самого простого - не отправляет тоже

форма

<form action=""  method="POST" enctype="multipart/form-data">
<table
class="tableview">
<tr><td>
Имя:</td><td><input type="text" name="name" maxlength="64" value="" /></td></tr>
<tr><td>
Файл:</td><td><input type="file" name="f" maxlength="64" value="" /></td></tr>
<tr><td>
 </td><td><input type="submit" name="sendMail" value="Отправить" /></td></tr>
</table>
</form>


обработчик php

<?php
$m = '';
if(isset($_POST['sendMail'])){
$mailto = "login@mail.ru";
$subject = "Письмо";
$message = "Текст!";
if(isset($_POST)){
$name = $_POST['name'];

$m = mail($mailto,$subject,$message);
}
}

?>


в sendmail логах ничего нового, а в error.log апача записалось вот что

‘«ЁиЄ®¬ ¤«Ё­­ п Є®¬ ­¤­ п бва®Є .


...

<?php
if(isset($_POST['sendMail'])){
if ( $m == TRUE ) {
echo '<font color="green">Сообщение отправлено!</font>';

}else{

echo '<font color="red">Произошла ошибка при отправке сообщения!</font>';

}
}

?>


здесь переходит по ветке
echo '<font color="green">Сообщение отправлено!</font>';

Спустя 19 минут, 35 секунд (5.11.2011 - 15:22) Renden написал(а):
Aleks-prog
Подозрительно... iconv() пробывал? (у тя крякозябры воде похожи на виндовую кодировку...)

Спустя 2 минуты, 43 секунды (5.11.2011 - 15:25) Aleks-prog написал(а):
ну все равно sendmail же должен присылать поячту не зависимо от кодировки а он даже логи не пишет, такое ощущение что до него дело и не доходит

Спустя 4 часа, 6 минут, 7 секунд (5.11.2011 - 19:31) Aleks-prog написал(а):
Вообщем все работает на удаленном сервере, как не настраивал локалный почтовик, безрезультатно, НОООО проблема:

файл который передается из формы отображается в почтовик как Untitled.bin, хотя я передавал текстовый, вообще любой файл передаю, он все равно на почте отображается как Untitled.bin и весит 2 кб, подскажите пожалуйста в каком направлении копать

Спустя 17 часов, 27 минут, 4 секунды (6.11.2011 - 12:58) Aleks-prog написал(а):
UP
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.