|
|
|
| Это скрипт формы обратной связи с возможностью прикрепления файла. Взял с этого же сайта. В этом скрипте отправляемые на мыло файлы сначала сохраняются на сервере в каталоге со скриптом формы. Не могу сделать так чтобы сохранялись в другой каталог. Что-только не пробовал. Помогите пожалуйста.
<?php
if(empty($_POST['mail_to'])) exit("Введите адрес получателя");
// проверяем правильности заполнения с помощью регулярного выражения
if (!preg_match("/^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}$/i", $_POST['mail_to'])) exit("Введите адрес в виде somebody@server.com");
$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'];
$mail_to = $_POST['mail_to'];
// Отправляем почтовое сообщение
if(empty($picture)) mail($mail_to, $thm, $msg);
else send_mail($mail_to, $thm, $msg, $picture);
// Вспомогательная функция для отправки почтового сообщения с вложением (Trianon)
function send_mail($mail_to, $thema, $html, $path)
{ if ($path) {
$fp = fopen($path,"rb");
if (!$fp)
{ print "Cannot open file";
exit();
}
$file = fread($fp, filesize($path));
fclose($fp);
}
$name = $path; // в этой переменной надо сформировать имя файла (без всякого пути)
$EOL = "\r\n"; // ограничитель строк, некоторые почтовые сервера требуют \n - подобрать опытным путём
$boundary = "--".md5(uniqid(time())); // любая строка, которой не будет ниже в потоке данных.
$headers = "MIME-Version: 1.0;$EOL";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"$EOL";
$headers .= "From: address@server.com";
$multipart = "--$boundary$EOL";
$multipart .= "Content-Type: text/html; charset=windows-1251$EOL";
$multipart .= "Content-Transfer-Encoding: base64$EOL";
$multipart .= $EOL; // раздел между заголовками и телом html-части
$multipart .= chunk_split(base64_encode($html));
$multipart .= "$EOL--$boundary$EOL";
$multipart .= "Content-Type: application/octet-stream; name=\"$name\"$EOL";
$multipart .= "Content-Transfer-Encoding: base64$EOL";
$multipart .= "Content-Disposition: attachment; filename=\"$name\"$EOL";
$multipart .= $EOL; // раздел между заголовками и телом прикрепленного файла
$multipart .= chunk_split(base64_encode($file));
$multipart .= "$EOL--$boundary--$EOL";
if(!mail($mail_to, $thema, $multipart, $headers))
{return False; //если не письмо не отправлено
}
else { //// если письмо отправлено
return True;
}
exit;
}
echo $path;
?>
|
| |
|
|
|
|
|
|
|
для: blackcement
(20.08.2009 в 10:59)
| |
if (copy($_FILES['mail_file']['tmp_name'], 'ваша папка'.$path))
|
ps
1. вместо copy лучше использовать move_uploaded_file
2. проверку if(empty($picture)) я бы сделал в функции send_mail | |
|
|
|
|
|
|
|
для: ride
(20.08.2009 в 12:19)
| | Спасибо! Получилось.
Но вот ещё одна проблема.
Почему строку
$headers .= "From: address@server.com";
|
нельзя заменить на две такие?
$FR="address@server.com";
$headers .= "From: ".$FR;
|
При получении письма отправленного вторым способом, отправитель не указывается. | |
|
|
|
|
|
|
|
для: blackcement
(20.08.2009 в 14:09)
| | а так
$FR="address@server.com";
$headers .= "From: ".$FR.$EOL;
|
| |
|
|
|
|
|
|
|
для: ride
(20.08.2009 в 14:36)
| | А, я всё понял. Я просто переменную $FR объявляю за пределами функции. её туда надо передать, а потом из неё лепить уже то что надо. Во как. Спасибо, Ride :) | |
|
|
|