[php] Прикрепление файла к письму - теряется часть информации

Rus But
На сайте с 30.05.2006
Offline
111
1818

Имеется форма обратной связи, одной из функцией которой является прикрепление файлов к письму.

Столкнулся с такой проблемой что из прикрепляемого файла удаляется информация, после чего файл невозможно использовать!

Пример: через форму был отправлен текстовый файл со следующей информацией

Возможность создания файловых вложений определяется для каждого из форумов в отдельности, и возможно вы сможете это делать в одном форуме, но не...

на почту пришел файл уже с такой информацией

аждого из форумов в отдельности, и возможно вы сможете это делать в одном форуме, но не...

файл отвечающий за сборку письма имеет следующий код


<?php
//часть кода отсутствует
//=======Прикрепление файла======//


if(!empty($fid))
{
for($i = 0; $i < sizeof($fid); $i++)
{
$key = 'file-id-' . $fid[$i];
//dump($key);
if(is_uploaded_file($_FILES[$key]['tmp_name']))
{
$uploaddir=ROOT_DIR."/img/";
$file_name=$_FILES[$key]["name"];
$uploadfile=$uploaddir.$file_name;
$size=$_POST['size']*1024;
if($_FILES[$key]['size'] > $size)
{
$file_st="error"; msgbox($form_lang['USER_TEXT_3'],"<center><font color='red' size=2>{$form_lang['USER_TEXT_4']} {$_POST['size']} Kb.</font></center>");
}
else
{
if(move_uploaded_file($_FILES[$key]['tmp_name'], $uploadfile))
{
echo $uploadfile;
$file[$i]=$uploadfile;
$file_type[$i]=$_FILES[$key]["type"];
}
}
}
}
}
//=============================//

if($_POST['email']) { $from_email=$_POST['email']; } else { $from_email=$config['admin_mail']; }

if($row2['code']==1) {
$code.=<<<HTML
<script language='JavaScript' type="text/javascript">
function reload () {

var rndval = new Date().getTime();

document.getElementById('dle-captcha').innerHTML = '<a onclick="reload(); return false;" href="#">{$lang['reload_code']}</a><br><img src="{$path['path']}engine/modules/antibot.php?rndval=' + rndval + '" border="0" width="120" height="50">';

};
</script>
HTML;
$code.="<p><font color='red' size=2>*</font> <b>{$form_lang['USER_TEXT_5']}</b><br>
<span id='dle-captcha'><a onclick='reload(); return false;' href='#'>{$lang['reload_code']}</a><br><img src='{$path['path']}engine/modules/antibot.php' alt='{$lang['sec_image']}' border='0'></span>
<br><input type='text' name='passe' style='width:113px;'></p>";
}
$code.="<p><input type='submit' name='ok' value='{$form_lang['USER_TEXT_6']}'></form></p>";
$code.="{$form_lang['USER_TEXT_7']} <font color='red' size=2>*</font> {$form_lang['USER_TEXT_8']}";
}
#####
if($row2['code']==1) {
if($_POST['passe']==$_SESSION['sec_code_session']) { $stop_code="ok"; } else { $stop_code="err"; }
} else { $stop_code="ok"; }

if($_POST['ok']) {

// инициализация переменной, сообщающей об ошибке.
$obz = '';

$res=$db->query("SELECT * FROM `$db_items` WHERE id_project='{$_GET['id']}'"); $row=$db->get_row($res);
do
{
if($row['objaz']==1)
{
$name="pole_".$row['id'];

// Если поле обязательное, то проверяем его на корректность //
switch( $row['type'] )
{
case 'text':
case 'textarea':
{
if($_POST[$name]=="")
{
//print 'te';
$obz="<center><font color='red' size=2>{$form_lang['USER_TEXT_9']}</font>";
}
break;
}
case 'radio':
{
if (!(isset($_POST[ $name ]) && $_POST[ $name ] !== ''))
{
//print 'ra: '.$_POST[$name];
$obz="<center><font color='red' size=2>{$form_lang['USER_TEXT_9']}</font>";
}
break;
}
case 'checkbox':
{
$values = explode(',', $row['value']);
$count_sel = 0;
for($i=0; $i<count($values); $i++) {
if (isset($_POST[$name.'_'.$i])) {
$count_sel++;
}
}
if ($count_sel == 0) {
$obz="<center><font color='red' size=2>{$form_lang['USER_TEXT_9']}</font>";
}

/*
if (!isset($_POST[$name]))
{
//print 'chk: '.$_POST[$name];
$obz="<center><font color='red' size=2>{$form_lang['USER_TEXT_9']}</font>";
}
*/
break;
}
case 'select':
{
/*if (!isset($_POST[$name]) ||
empty($_POST[$name]) ||
(is_array($_POST[$name]) && count($_POST[$name])==0) ||
(!is_array($_POST[$name]) && ($_POST[$name] == '-1'))) */
if (@$_POST[ $name ] === '')
{
//print 'sel';
$obz="<center><font color='red' size=2>{$form_lang['USER_TEXT_9']}</font>";
}
break;
}
}

//$name="pole_".$row['id'];
//if($_POST[$name]=="") { $obz="<center><font color='red' size=2>{$form_lang['USER_TEXT_9']}</font>"; }
}
} while($row=$db->get_row($res));
if($file_st!="error") {
if(!$obz) {
if ($stop_code=="ok") {
$subject=$_POST['subject'];
$msg=msg();
$row2=$db->super_query("SELECT * FROM `$db_project` WHERE id={$_GET['id']}");
if($row2['email']!="") {
print 'before send';
XMail($from_email, $row2['email'], $subject, $msg);
} else {
$val=explode(",",$row2['email2']); foreach($val as $v) { XMail($from_email, $v, $subject, $msg);}
}

} else { msgbox($form_lang['USER_TEXT_3'],"<center><font color='red' size=2>{$form_lang['USER_TEXT_10']}</font></center>"); }
} else { msgbox($form_lang['USER_TEXT_3'],$obz."<br>{$form_lang['USER_TEXT_7']} <font color='red' size=2>*</font> {$form_lang['USER_TEXT_8']}</center>"); }
}
}



} else { $code.="<center><h1>{$row2['text_not_prav']}</h1></center>"; }
//-------Функции-------//
### Функция Отправки на email
function XMail($from, $to, $subject, $msg) {
global $form_lang,$config,$file;

if(isset($file))
{
$un = strtoupper(uniqid(time()));
$head = "From: $from\n";
$head .= "To: $to\n";
$head .= "Subject: $subject\n";
$head .= "X-Mailer: PHPMail Tool\n";
$head .= "Reply-To: $from\n";
$head .= "Mime-Version: 1.0\n";
$head .= "Content-Type:multipart/mixed;";
$head .= "boundary=\"----------".$un."\"\n";
$zag = "";
$zag .= "------------".$un."\nContent-Type:text/html; charset=\"windows-1251\"\n";
$zag .= "Content-Transfer-Encoding: 8bit\n\n$msg\n";
$zag .= "------------".$un."\n";
for($i = 0; $i < sizeof($file); $i++)
{
$f = @fopen($file[$i],"rb");
$zag .= "Content-Type: ".$file_type[$i].";";
$zag .= "name=\"".basename($file[$i])."\"\n";
$zag .= "Content-Transfer-Encoding:base64\n";
$zag .= "Content-Disposition:attachment;";
$zag .= "filename=\"".basename($file[$i])."\"\n";
$zag .= chunk_split(base64_encode(fread($f,filesize($file[$i]))))."\n";
$zag .= "------------".$un."\n";
fclose($f); unlink($file[$i]);
}
}
else
{
$un = strtoupper(uniqid(time()));
$head = "From: $from\n";
$head .= "To: $to\n";
$head .= "Subject: $subject\n";
$head .= "X-Mailer: PHPMail Tool\n";
$head .= "Reply-To: $from\n";
$head .= "Mime-Version: 1.0\n";

$head .= "Content-Type: text/html; charset=windows-1251\n";
//$head .= "Content-Length: ".strlen($msg)."\n";

$zag = $msg;
}


$result=mail("$to", $subject, $zag, $head);

if ($result!=TRUE) { msgbox($form_lang['USER_TEXT_13']," {$form_lang['USER_TEXT_11']} <a href='{$config['http_home_url']}'>{$form_lang['USER_TEXT_12']}</a>");
} else { msgbox($form_lang['USER_TEXT_13']," {$form_lang['USER_TEXT_14']} <a href='{$config['http_home_url']}'>{$form_lang['USER_TEXT_12']}</a>"); }

}
### Функция Сборки текста сообщения
function msg()
{
global $db_items,$db_project,$db,$form_lang;

$date=date("d/m/Y - H:i:s");

$proj_id = intval(@$_GET['id']);

$res=$db->query("SELECT * FROM `$db_items` WHERE id_project='{$proj_id}'");
$row=$db->get_row($res);
do
{
$id=$row['id'];
$name="pole_".$id;
unset($tex);

if($row['type']=="radio" or $row['type']=="select")
{
$n=$_POST[$name];
$array = $row['value'];
$val = explode(",",$array);
$tex="{$val[$n]}";
}

if($row['type']=="checkbox")
{
$array = $row['value'];
$val=explode(",",$array);
foreach($val as $k=>$v)
{
$name2="pole_".$id."_".$k;
//$name2 = 'pole_'.$id;
if ( isset($_POST[$name2]) )
{
$tex.="{$val[$k]}<br>";
}
}
}

if($row['type']=="text" || $row['type'] == 'textarea')
{
$tex=$_POST[$name];
}

$msg.="<dl><dt><font size=4>{$row['title']}</font></dt>";
$msg.="<dd><font size=3>{$tex}</font></dd></dl>";
} while( $row = $db->get_row($res) );

$msg.="<br><b>{$form_lang['USER_TEXT_15']}</b> $date";
return $msg;

}



### Функция Сборка полей типа: (radio,checkbox,select)
function radio($id)
{
global $db_items,$db;
$val=array();
$ro=$db->super_query("SELECT * FROM `$db_items` WHERE id='$id'"); $array=$ro['value'];
$val=explode(",",$array);
$pol="";
foreach($val as $n=>$v)
{
$name="pole_".$ro['id']; $name2="pole_".$ro['id']."_".$n;
if($ro['type']=="checkbox") { $pol.="<input name='$name2' value=$n type='{$ro['type']}'>{$val[$n]}&nbsp;"; }
elseif($ro['type']=="radio") { $pol.="<input name='$name' value=$n type='{$ro['type']}'>{$val[$n]}&nbsp;"; }
elseif($ro['type']=="select") { $sel1="<select name='$name'><option value=''></option>"; $pol.="<option value=$n>{$val[$n]}</option>"; $sel2="</select>"; }

}
return $sel1.$pol.$sel2;
}
// часть кода отсутствует
?>
Разработка сайтов на Modx Evo/Revo ( http://citypeople.ru/ ) | SEoDOR промокод 15% ( https://vk.cc/aw78s4 ) : L43G7
[Удален]
#1

юзай это и не парь моск людям))

http://phpmailer.codeworxtech.com/

Rus But
На сайте с 30.05.2006
Offline
111
#2

Меня по большей части интересует вопрос куда может терятся 64 бита информации?

[Удален]
#3

там потерялось явно больше чем 64 бита.

Да вариантов миллион. Самый вероятный - лишний перенос строки, который вставляет chunk_split

Rus But
На сайте с 30.05.2006
Offline
111
#4

Хотелось бы получить конкретный совет для исправления!

[Удален]
#5
cocacola:
Хотелось бы получить конкретный совет для исправления!

погугли и получишь

[Удален]
#6
cocacola:
Меня по большей части интересует вопрос куда может терятся 64 бита информации?

Лучше бы задаться вопросом - на каком этапе?

Сам сильно не вникал, но вижу - есть места, где это можно проверить.

Но тут

1. Много кода для такой небольшой задачи.

2. Глобальные переменные. фи...

3. Имеет ли смысл? Уже неоднократно это описывалось. ИМХО лучше взять готовое решение и под свои задачи поправить. Например, есть хорошие классы - пхпмейлер. Рекомендую.

Rus But
На сайте с 30.05.2006
Offline
111
#7

ПРОБЛЕМА РЕШЕНА

Было

$zag      .= "filename=\"".basename($file[$i])."\"\n";

А надо было

$zag      .= "filename=\"".basename($file[$i])."\"\n\n";
На Других Надейся,но Сам Не Плошай!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий