Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Отправка письма с вложением с сайта
 
 автор: ВЛ   (18.08.2005 в 09:51)
 
 

У вас есть пример скрипта отправки письма с вложением - http://softtime.ru/scripts/mailattach.php . Меня интересует, безопасный ли такой скрипт? Файл сначала на сервер попадает, а если это файл php будет? Как разрешить закачивать только рисунки и файлы типа zip ?

   
 
 автор: cheops   (18.08.2005 в 12:34)   письмо автору
 
   для: ВЛ   (18.08.2005 в 09:51)
 

Да такая защита не реализована, это лишь демонстрационный скрипт, который показывает основную идею и не по возможности не перегружен деталями. Для защиты от такой загрузки следует проверить тип загружаемого файла при помощи конструкции
<?php
 
if($_FILES['mail_file']['type'] != 'image/pjpeg' || $_FILES['mail_file']['type'] != 'image/gif')
 {
   exit(
"Недопустимый формат файла");
 }
?>

А после отправки письма файл вообще лучше уничтожить от греха, как во временной директории, так и в директории Web-приложения.
<?php
  unlink
($picture);
  
unlink($_FILES['mail_file']['tmp_name']);
?>

   
 
 автор: ВЛ   (18.08.2005 в 12:44)
 
   для: cheops   (18.08.2005 в 12:34)
 

Я давно хочу сделать для своего сайта раздел загрузки файлов на сайт с возможностью его описания. Меня устраивает, если это будет в виде письма приходить мне на почтовый ящик, нужно, чтобы поля формы были: Автор файла, название, описание и сам файл. Файлы должны быть в форматах только zip, jpg, gif. Как можно сделать такой скрипт? Я на других сайтах видел такие разделы загрузки.

   
 
 автор: cheops   (18.08.2005 в 13:12)   письмо автору
 
   для: ВЛ   (18.08.2005 в 12:44)
 

Тогда, если расширений много и могут появляться новые лучше проверять файлы по расширению
<?php
    
// Извлекаем из имени файла расширение
    
$ext strrchr($_FILES['mail_file']['name'], "."); 
    
// Разрешаем загружать файлы только определённого форматм
    
$extentions = array(".jpg"".gif"".zip");
    
// Проверяем, обладает ли файл, зарегистрированным расширением    
    
if(!in_array($ext$extentions)) $ext("Недопустимый формат файла"); 
?>

   
 
 автор: Anatoly   (30.01.2006 в 09:04)   письмо автору
 
   для: cheops   (18.08.2005 в 12:34)
 

Прошу помощи знатоков, как правильно описать заголовок "From: ", если:

в html форму добавляем поле:

<tr><td width=50%>Ваш e-mail:</td><td align=right><input type=text name=from maxlength=32></td></tr>


Я добавил в Обработчик simple_mail.php:

  $_POST['from'] = htmlspecialchars(stripslashes($_POST['from'])); 

 $from = $_POST['from'];

  $headers .= "From: $from\nReply-To: $from\n";



но письмо вообще не приходит! Если же я убираю переменную в заголовке:

$headers .= "From: TEXTa\nReply-To:TEXTb\n";


то все ok, но без нужного мне e-mail'a... :(


Дополнительно размещаю весь код ниже, там есть моя версия доработки:

index.php

<HTML> 
<HEAD> 
<TITLE>Отправить письмо</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251
</head> 
</HEAD> 
<BODY> 
<p>&nbsp;</p>
<center> 
<table width=1 border=0> 
<form action=simple_mail.php enctype='multipart/form-data' method=post> 

<tr><td width=50%>Ваш e-mail:</td><td align=right><input type=text name=from maxlength=32></td></tr>
<tr><td width=50%>Тема:</td><td align=right><input type=text name=mail_subject maxlength=64></td></tr> 
<tr><td colspan=2>Сообщение:<br><textarea cols=60 rows=8 name=mail_msg></textarea></td> 
<tr><td width=50%>Фото1:</td><td align=right><input type=file name=mail_file maxlength=64></td></tr>
<tr><td width=50%>Фото2:</td><td align=right><input type=file name=mail_fileb maxlength=64></td></tr>
<tr><td width=50%>Фото3:</td><td align=right><input type=file name=mail_filec maxlength=64></td></tr> 
<tr><td width=50%>Фото4:</td><td align=right><input type=file name=mail_filed maxlength=64></td></tr> 
</tr><tr>
  <td colspan=2><input name="submit" type=submit value='Отправить'></td>
</tr> 
</form> 
</table> 
</center> 
</BODY> 
</HTML>




simple_mail.php:

<?php 
if(empty($_POST['from'])) exit("Надо было ввести правильный e-mail"); 
  
// проверяем правильности заполнения с помощью регулярного выражения 
if (!preg_match("/^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}$/i"$_POST['from'])) exit("Надо было ввести правильный e-mail"); 
$mail_to "supertolyan@mail.ru";  // e-mail
$endmsg "Спасибо, Ваше сообщение было отправлено!";



  
$_POST['from'] = htmlspecialchars(stripslashes($_POST['from'])); 
  
$_POST['mail_subject'] = htmlspecialchars(stripslashes($_POST['mail_subject'])); 
  
$_POST['mail_msg'] = htmlspecialchars(stripslashes($_POST['mail_msg'])); 
  
$picture ""
  
// Если поле выбора вложения не пустое - закачиваем его на сервер 
  
if (!empty($_FILES['mail_file']['tmp_name'])) 
  { 
    
// Закачиваем файл 
    
$path $_FILES['mail_file']['name']; 
    if (
copy($_FILES['mail_file']['tmp_name'], $path)) $picture $path
  } 
  
$thm $_POST['mail_subject'];
  
$msg $_POST['mail_msg'];
  
$from $_POST['from'];
  
// Отправляем почтовое сообщение 
  
if(empty($picture))
  {
   
mail($mail_to$thm$msg);
   echo 
"Сообщение отправлено. <br><br>";
   }
  else
  {
  
send_mail($mail_to$thm$msg$picture);
  echo 
"11 <br><br>";
  } 
  
  
///////////////2
$picture "";
    if (!empty(
$_FILES['mail_fileb']['tmp_name'])) 
  { 
    
// Закачиваем файл 
    
$path $_FILES['mail_fileb']['name']; 
    if (
copy($_FILES['mail_fileb']['tmp_name'], $path)) $picture $path
  } 
  
$thm $_POST['mail_subject'];
  
$msg $_POST['mail_msg'];
////  $mail_to = $_POST['mail_to'];
  // Отправляем почтовое сообщение 
  
if(!empty($picture))
  {
   
//// mail($mail_to, $thm, $msg); 
  
send_mail($mail_to$thm$msg$picture);
  echo 
"22 <br><br>";

  }
  else exit;
///////////////


////////////////3
$picture "";
  if (!empty(
$_FILES['mail_filec']['tmp_name'])) 
  { 
    
// Закачиваем файл 
    
$path $_FILES['mail_filec']['name']; 
    if (
copy($_FILES['mail_filec']['tmp_name'], $path)) $picture $path
  } 
  
$thm $_POST['mail_subject'];
  
$msg $_POST['mail_msg'];
////  $mail_to = $_POST['mail_to'];
  // Отправляем почтовое сообщение 
  
if(!empty($picture))
  {
   
//// mail($mail_to, $thm, $msg); 
  
send_mail($mail_to$thm$msg$picture);
  echo 
"33 <br><br>";

  }
  else exit;
/////////////



/////////////4
$picture "";
  if (!empty(
$_FILES['mail_filed']['tmp_name'])) 
  { 
    
// Закачиваем файл 
    
$path $_FILES['mail_filed']['name']; 
    if (
copy($_FILES['mail_filed']['tmp_name'], $path)) $picture $path
  } 
  
$thm $_POST['mail_subject'];
  
$msg $_POST['mail_msg'];
////  $mail_to = $_POST['mail_to'];
  // Отправляем почтовое сообщение 
  
if(!empty($picture))
  {
   
//// mail($mail_to, $thm, $msg); 
  
send_mail($mail_to$thm$msg$picture);
  echo 
"44 <br><br>";

  }
  else exit;

///////////////  
  
  
  
   
  // Вспомогательная функция для отправки почтового сообщения с вложением 
  
function send_mail($to$thm$html$path
  { 
    
$fp fopen($path,"r"); 
    if (!
$fp
    { 
      print 
"Файл $path не может быть прочитан"
      exit(); 
    } 
    
$file fread($fpfilesize($path)); 
    
fclose($fp); 
    
    
$boundary "--".md5(uniqid(time())); // генерируем разделитель
    
$headers .= "From: $from\nReply-To: $from\n";
//    $headers .= "From: $mail_to\nReply-To: $mail_to\n"; //////так переменная тоже не работает :(
    
$headers .= "MIME-Version: 1.0\n"
    
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
    
$multipart .= "--$boundary\n"
    
$kod 'koi8-r'// или $kod = 'windows-1251'; 
    
$multipart .= "Content-Type: text/html; charset=$kod\n"
    
$multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n"
    
$multipart .= "$html\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 = \"".$path."\"\n\n"
    
$message_part .= chunk_split(base64_encode($file))."\n"
    
$multipart .= $message_part."--$boundary--\n"

    if(!
mail($to$thm$multipart$headers)) 
    { 
      echo 
"К сожалению, письмо не отправлено"
      exit(); 
    } 
  } 
?>


   
 
 автор: cheops   (30.01.2006 в 13:54)   письмо автору
 
   для: Anatoly   (30.01.2006 в 09:04)
 

А выведите строку с $from в окно браузера - что она из себя представляет?

PS Большие листинги лучше прикреплять к сообщению в виде файла.

   
 
 автор: Anatoly   (31.01.2006 в 17:54)   письмо автору
 
   для: cheops   (30.01.2006 в 13:54)
 


  send_mail($mail_to, $thm, $msg, $picture);
  echo "11 <br><br>";
  echo "$from <br><br>";


а вот так выводит то что ввели в поле e-mail......:(

в Header не идет:
ПИСЬМО ПРИХОДИТ С ПУСТЫМ "from":

писал и по другому

    $headers .= "From: $from<$from>\n";


Не подхватывает почему-то........

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования