Форумы портала PHP.SU » Разное » Обсуждение статей » Проблема с формой "отправка письма с вложением"

Страниц (1): [1]
 

1. Guooff - 20 Февраля, 2010 - 18:50:45 - перейти к сообщению
Доброе время суток, я очень долгое время искал, как создать форму отправки изображений и вот на мой взгляд нашёл ( http://php.su/articles/?cat=exam...les&page=060 ), но я столкнулся с проблемой, наверно начну с начала самого...

создал у себя на сервере папку gallery_forma в неё вложил 2ва файла - index.php и simple_mail.php


Файл index.php имеет код таков:

CODE (htmlphp):
скопировать код в буфер обмена
  1. <HTML>
  2.  
  3. <HEAD>
  4.  
  5. <TITLE>Отправка сообщения с вложением</TITLE>
  6.  
  7. </HEAD>
  8.  
  9. <BODY>
  10.  
  11. <H3> <center><font color=#1E90FF>Отправка сообщения с вложением</font></H3>
  12.  
  13. <center>
  14.  
  15. <table width=1 border=0>
  16.  
  17. <form action=simple_mail.php enctype='multipart/form-data' method=post>
  18.  
  19.  
  20.  
  21. <tr><td width=50%>To:</td><td align=right><input type=text name=mail_to maxlength=32></td></tr>
  22.  
  23. <tr><td width=50%>Subject:</td><td align=right><input type=text name=mail_subject maxlength=64></td></tr>
  24.  
  25. <tr><td colspan=2>Сообщение:<br><textarea cols=50 rows=8 name=mail_msg></textarea></td>
  26.  
  27. <tr><td width=50%>Photo:</td><td align=right><input type=file name=mail_file maxlength=64></td></tr>
  28.  
  29. </tr><tr><td colspan=2><input type=submit value='Отправить'></td></tr>
  30.  
  31. </form>
  32.  
  33. </table>
  34.  
  35. </center>
  36.  
  37. </BODY>
  38.  
  39. </HTML>



Файл simple_mail.php имеет код таков:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3.  
  4.  if(empty($_POST['mail_to'])) exit(" ТУТ Я ПИШУ СВОЙ ЭМЕИЛ ");
  5.  
  6.  // проверяем правильности заполнения с помощью регулярного выражения
  7.  
  8.  if (!preg_match("/^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}$/i", $_POST['mail_to']))
  9.     exit("Введите адрес в виде somebody@server.com");
  10.  
  11.  $_POST['mail_to'] = htmlspecialchars(stripslashes($_POST['mail_to']));
  12.  
  13.  $_POST['mail_subject'] = htmlspecialchars(stripslashes($_POST['mail_subject']));
  14.  
  15.  $_POST['mail_msg'] = htmlspecialchars(stripslashes($_POST['mail_msg']));
  16.  
  17.  $picture = "";
  18.  
  19.  // Если поле выбора вложения не пустое - закачиваем его на сервер
  20.  
  21.  if (!empty($_FILES['mail_file']['tmp_name']))
  22.  
  23.  {
  24.  
  25.    // Закачиваем файл
  26.  
  27.    $path = $_FILES['mail_file']['name'];
  28.  
  29.    if (copy($_FILES['mail_file']['tmp_name'], $path)) $picture = $path;
  30.  
  31.  }
  32.  
  33.  $thm = $_POST['mail_subject'];
  34.  
  35.  $msg = $_POST['mail_msg'];
  36.  
  37.  $mail_to = $_POST['mail_to'];
  38.  
  39.  // Отправляем почтовое сообщение
  40.  
  41.  if(empty($picture)) mail($mail_to, $thm, $msg);
  42.  
  43.  else send_mail($mail_to, $thm, $msg, $picture);
  44.  
  45.  // Вспомогательная функция для отправки почтового сообщения с вложением
  46.  
  47.  function send_mail($to, $thm, $html, $path)
  48.  
  49.  {
  50.  
  51.    $fp = fopen($path,"r");
  52.  
  53.    if (!$fp)
  54.  
  55.    {
  56.  
  57.      print "Файл $path не может быть прочитан";
  58.  
  59.      exit();
  60.  
  61.    }
  62.  
  63.    $file = fread($fp, filesize($path));
  64.  
  65.    fclose($fp);
  66.  
  67.    
  68.  
  69.    $boundary = "--".md5(uniqid(time())); // генерируем разделитель
  70.  
  71.    $headers .= "MIME-Version: 1.0\n";
  72.  
  73.    $headers .="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
  74.  
  75.    $multipart .= "--$boundary\n";
  76.  
  77.    $kod = 'koi8-r'; // или $kod = 'windows-1251';
  78.  
  79.    $multipart .= "Content-Type: text/html; charset=$kod\n";
  80.  
  81.    $multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
  82.  
  83.    $multipart .= "$html\n\n";
  84.  
  85.  
  86.  
  87.    $message_part = "--$boundary\n";
  88.  
  89.    $message_part .= "Content-Type: application/octet-stream\n";
  90.  
  91.    $message_part .= "Content-Transfer-Encoding: base64\n";
  92.  
  93.    $message_part .= "Content-Disposition: attachment; filename = \"".$path."\"\n\n";
  94.  
  95.    $message_part .= chunk_split(base64_encode($file))."\n";
  96.  
  97.    $multipart .= $message_part."--$boundary--\n";
  98.  
  99.  
  100.  
  101.    if(!mail($to, $thm, $multipart, $headers))
  102.  
  103.    {
  104.  
  105.      echo "К сожалению, письмо не отправлено";
  106.  
  107.      exit();
  108.  
  109.    }
  110.  
  111.  }
  112.  
  113. ?>
  114.  
  115.  


то есть всё как в примере.... http://php.su/articles/?cat=exam...les&page=060

и всё, когда я к примеру всё заполняю... мне пишет - Введите адрес в виде somebody@server.com, но а если не чего не заполнять и нажать просто кнопку отправить, то выдаёт мой эмеил на который должна форма отправки отправлять все данные + фото (вот сама форма http://www[dot]freestyle-sk8[dot]com[dot]ua/gallery_forma/ )

Что делать и как быть - я совершенно не знаю... Помогите пожалуйста решить данную проблему

За благовременно спасибо!!!!
2. RomAndry - 20 Февраля, 2010 - 20:30:14 - перейти к сообщению
ну все правильно
Цитата:
когда я к примеру всё заполняю... мне пишет - Введите адрес в виде somebody@server.com

попробуйте нормальный адрес
Цитата:
но а если не чего не заполнять и нажать просто кнопку отправить, то выдаёт мой эмеил

так и есть по коду
PHP:
скопировать код в буфер обмена
  1.  if(empty($_POST['mail_to'])) exit(" ТУТ Я ПИШУ СВОЙ ЭМЕИЛ ");
3. Bioslave - 20 Февраля, 2010 - 22:18:03 - перейти к сообщению
А может на серваке не установлен sendmail ?
4. Itan - 09 Сентября, 2010 - 16:04:07 - перейти к сообщению
движок бесплатный = может и хостинг бесплатный? => на большинстве нету функции mail
5. Мелкий - 09 Сентября, 2010 - 20:26:30 - перейти к сообщению
/^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}$/i
не очень хорошая регулярка...
0) любой более чем корректный домен в зоне .info не пропустит, это не говоря уже про .рф, который по-хорошему надо бы начинать учитывать.
1) в имени ящика ещё группа символов может стоять, например дефис.
Может ещё чего невалидного не заметил.

А с версии PHP5.2 есть вообще нативная функция валидации: filter_var('bob@example.com', FILTER_VALIDATE_EMAIL)

И ваша проблема, очевидно, где-то тут и порылась.
6. nurmkm - 22 Октября, 2010 - 07:43:32 - перейти к сообщению
Warning: copy(logo_kaz.gif) [function.copy]: failed to open stream: Permission denied in /var/www/simple_mail.php on line 22
Помогите Огорчение
Но письмо приходить к почте но без файла!!!
7. Дениска57 - 11 Мая, 2011 - 13:40:28 - перейти к сообщению
Мелкий пишет:
/^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}$/i
не очень хорошая регулярка...


Вот-вот) но всё равно автору спасибо за код.
Я немного добавил и у меня стало отсылаться вроде на любые E-mail адреса (которые я знаю) вот регулировка
PHP:
скопировать код в буфер обмена
  1.   if (!preg_match("/^[0-9a-z_.]+@[0-9a-z_^\.]+\.[a-z]{2,3}$/i", $_POST['mail_to']))
  2.  
8. Professorsha - 11 Сентября, 2011 - 10:54:53 - перейти к сообщению
[quote=Дениска57]
Мелкий пишет:
/^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}$/i
не очень хорошая регулярка...


У меня вообще письмо не отсылается((((
9. kopro - 05 Марта, 2013 - 01:03:50 - перейти к сообщению
Такой вопрос: если тестировать скрипт на Denwer - письма в sendmail приходят без файла-вложения. Это значит скрипт не работает как надо, или потому что Denwer ?

В коде ничего не менял, как в примере:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2.  if(empty($_POST['mail_to'])) exit("Введите адрес получателя");
  3.  // проверяем правильности заполнения с помощью регулярного выражения
  4.  if (!preg_match("/^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}$/i", $_POST['mail_to'])) exit("Введите адрес в виде somebody@server.com");
  5.  $picture = "";
  6.  // Если поле выбора вложения не пустое - закачиваем его на сервер
  7.  if (!empty($_FILES['mail_file']['tmp_name']))
  8.  {
  9.    // Закачиваем файл
  10.    $path = $_FILES['mail_file']['name'];
  11.    if (copy($_FILES['mail_file']['tmp_name'], $path)) $picture = $path;
  12.  }
  13.  $thm = $_POST['mail_subject'];
  14.  $msg = $_POST['mail_msg'];
  15.  $mail_to = $_POST['mail_to'];
  16.  // Отправляем почтовое сообщение
  17.  if(empty($picture)) mail($mail_to, $thm, $msg);
  18.  else send_mail($mail_to, $thm, $msg, $picture);
  19.  // Вспомогательная функция для отправки почтового сообщения с вложением (Trianon)
  20.  function send_mail($mail_to, $thema, $html, $path)  
  21.  { if ($path) {  
  22.    $fp = fopen($path,"rb");  
  23.    if (!$fp)  
  24.    { print "Cannot open file";  
  25.      exit();  
  26.    }  
  27.    $file = fread($fp, filesize($path));  
  28.    fclose($fp);  
  29.    }  
  30.  
  31.    
  32.  
  33.    $boundary = "--".md5(uniqid(time())); // генерируем разделитель
  34.  
  35.    $headers .= "MIME-Version: 1.0\n";
  36.  
  37.    $headers .="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
  38.  
  39.    $multipart .= "--$boundary\n";
  40.  
  41.    $kod = 'koi8-r'; // или $kod = 'windows-1251';
  42.  
  43.    $multipart .= "Content-Type: text/html; charset=$kod\n";
  44.  
  45.    $multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
  46.  
  47.    $multipart .= "$html\n\n";
  48.  
  49.  
  50.  
  51.    $message_part = "--$boundary\n";
  52.  
  53.    $message_part .= "Content-Type: application/octet-stream\n";
  54.  
  55.    $message_part .= "Content-Transfer-Encoding: base64\n";
  56.  
  57.    $message_part .= "Content-Disposition: attachment; filename = \"".$path."\"\n\n";
  58.  
  59.    $message_part .= chunk_split(base64_encode($file))."\n";
  60.  
  61.    $multipart .= $message_part."--$boundary--\n";
  62.  
  63.        if(!mail($mail_to, $thema, $multipart, $headers))  
  64.         {echo "Fail";           //если не письмо не отправлено
  65.      }  
  66.    else { //// если письмо отправлено
  67. echo "Weeeee";  
  68.    }  
  69.  exit;  
  70.  }
  71. ?>

 

Powered by ExBB FM 1.0 RC1