Member 13120366 Ответов: 1

Ошибки в PHP отправить почту и ошибка загрузки


я создал форму, которая работает нормально, но у меня есть две проблемы:

1. я получаю сообщение об ошибке :
Warning: mail(/var/log/phpmail.log): failed to open stream: Permission denied in /www1/xxx/Contact_Us.php on line 115.

2.я не могу загружать файлы больше 20 КБ, даже в моем коде я разрешаю до 2 МБ, а на php.ini upload_max_filesize составляет 8 МБ, а post_max_size-8 МБ.

Поэтому, пожалуйста, кто-нибудь может помочь мне с этими двумя проблемами, потому что я действительно застрял там и не знаю, что делать, и это последняя проблема, с которой я сталкиваюсь, и я не могу ее решить.
Заранее спасибо;

Что я уже пробовал:

<?php
//set tiem zone
date_default_timezone_set('Asia/Dubai');
// Show errors
error_reporting(E_ALL);
ini_set('display_errors', 1);
	
// define Errors variables
$fnameErr = $lnameErr = $emailErr = $humanErr = $fileErr = $result = $result2 =  "" ;
	
// when we press submit do the following
if(isset($_POST['submit']))
{
// define contact form variables
$fname = $_POST['fname'];
$lname = $_POST['lname'];
$email = $_POST['email'];
$tel = $_POST['tel'];
$design = $_POST['design'];
$country = $_POST['country'];
$comment = $_POST['comment'];
$human = $_POST['human'];

// define Checks variables
$check1 = $check2 = $check3  = $check4  = "";

	
// Let's do some checks	
// Checking the First Name
if(empty($_POST["fname"])){
	$fnameErr = "Name is Required";
}else{
	$fname = test_input($_POST["fname"]);
	// check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$fname)) {
      $fnameErr = "Only letters and white space allowed"; 
    }else{
		$check1 = 1;
	}
}
// Checking the Last Name	
if(empty($_POST["lname"])){
	$lnameErr = "Name is Required";
}else{
	$lname = test_input($_POST["lname"]);
	// check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$lname)) {
      $lnameErr = "Only letters and white space allowed"; 
    }else{
		$check2 = 1;
	}
}
//Checking the Email Adress
if(empty($_POST["email"])){
	$emailErr = "Email is Required";
}else{
	$email = test_input($_POST["email"]);
    // check if e-mail address is well-formed
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $emailErr = "Invalid email format"; 
    }else{
		$check3 = 1;
	}
}
//Checking the Anti-Spam Question
if(empty($_POST["human"])){
	$humanErr = "Please Enter the Answer";
}else{
	if ($human != 4){
		$humanErr = "Please check your answer";
	}else{
		$check4 = 1;
	}
}
	
// checking the attachment
if(isset($_FILES) && (bool) $_FILES) {
  
	$allowedExtensions = array("pdf","doc","docx");
	
	$files = array();
	foreach($_FILES as $name=>$file) {
		$file_name = $file['name']; 
		$temp_name = $file['tmp_name'];
		$file_type = $file['type'];
		$file_size = $file['size'];
		$path_parts = pathinfo($file_name);
		$ext = $path_parts['extension'];

		if($file_size > 2000000){
        $fileErr = "Max allowed size is 2 MB";
        } else {
				if(!in_array($ext,$allowedExtensions)) {
				$fileErr = "File $file_name has the extensions $ext which is not allowed";    
				}else{
					array_push($files,$file);}
	
			   }
	}

	
// define email variables
$to = 'email@domain.com';
$from = "Job Application"; 
$subject = 'Job Application';
$message = 'From: '.$fname .$lname."\r\n".
           'E-mail: '.$email."\r\n".
           'Telephone: '.$tel."\r\n".
           'Designation: '.$design."\r\n".
           'Country Appled From: '.$country."\r\n".
           'Message: '.$comment."\r\n"."\r\n";
$headers = "From: $from";	
// boundary 
	$semi_rand = md5(time()); 
	$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 
	 
	// headers for attachment 
	$headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; 
	 
	// multipart boundary 
	$message = "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; 
	$message .= "--{$mime_boundary}\n";
	 
	// preparing attachments
	
	for($x=0;$x<count($files);$x++){
		$file = fopen($files[$x]['tmp_name'],"rb");
		$data = fread($file,filesize($files[$x]['tmp_name']));
		fclose($file);
		$data = chunk_split(base64_encode($data));
		$name = $files[$x]['name'];
		$message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$name\"\n" . 
		"Content-Disposition: attachment;\n" . " filename=\"$name\"\n" . 
		"Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
		$message .= "--{$mime_boundary}\n";
	}	
	 
	
// Emailing the Contents if all Checks are correct	
if($check1 && $check2 && $check3 && $check4  == 1){
	mail($to, $subject, $message, $headers);
	$result =  "Message Sent Sucessfully";
}else{
	$result2 = "Message Can't be sent";
}
} }
 function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
	
?>
<!-- END OF PHP CODE -->

1 Ответов

Рейтинг:
1

Jochen Arndt

Ошибка вполне понятна: "разрешение отказано".

Угадайте, что строка 115-это:

$file = fopen($files[$x]['tmp_name'],"rb");
вы должны проверить имя файла там (например, проверив возвращаемое значение fopen() и показывает сообщение об ошибке с именем файла на FALSE).

Но прежде чем пытаться получить доступ к загруженному файлу, вы должны проверить наличие ошибок загрузки (см. PHP: обработка загрузки файлов-руководство пользователя[^]):
$file_err = $file['error'];

if($file_err != UPLOAD_ERR_OK){
    $fileErr = "File upload failed";
}
else if($file_size > 2000000){
    $fileErr = "Max allowed size is 2 MB";
}
// ...


[РЕДАКТИРОВАТЬ]
Член 13120366 прокомментировал:
его функция mai() не функция fopen()
Поиск в интернете "php mail permission denied":
php-mail: не удалось открыть поток: отказано в разрешении? - переполнение стека[^].
Вероятно, это файл почтового журнала. Если да, то настройте файл журнала для использования с PHP (mail.log в в PHP.Ини), который имеет необходимые разрешения.
[/РЕДАКТИРОВАТЬ]


Member 13120366

его функция mai() не функция fopen()

Jochen Arndt

Смотрите мой обновленный ответ.
Для дальнейших вопросов всегда полезно указать строку кода, для которой возникает ошибка.

Member 13120366

я видел ваш ответ и уже создал файл на сервере с path /var/log/phpmail.log с разрешениями 777, но все равно ничего нового та же ошибка не получила

Jochen Arndt

И Вы тоже установили конфигурацию mail.log?

Файл журнала должен храниться в каталоге, где PHP уже имеет разрешение на запись. /var/log не является таким каталогом, и использование 777 не рекомендуется.

Рекомендуемый:
- Создайте каталог (например, /var/log/php) в качестве корневого
- Измените группу этого каталога на группу, используемую веб-сервером (например, wwwrun, apache); владелец по-прежнему будет root
- Измените разрешение каталога, чтобы разрешить группе читать и писать (770)
- Specvify файла в PHP.ini-файл в /var/журнал/РНР/почта.журнал
- При необходимости создайте файл с помощью сенсорного экрана, измените владельца и группу на те, которые используются веб-сервером, а также измените разрешения (660)

Member 13120366

я создал папку в корневом каталоге и изменил разрешение каталога на 770, затем я указал файл в php. ini теперь я застрял в точках
1-измените группу этого каталога на группу, используемую веб-сервером
2-создайте файл с помощью touch, так как я создал его как новый файл, и это все, так что если есть ссылка для создания этого файла, пожалуйста, пришлите его мне
извините меня, потому что все это ново для меня, и спасибо за вашу помощь, и я ценю это

Jochen Arndt

Никогда не создавайте такие каталоги на корневом уровне!

Как получить пользователя и группу вашего веб-сервера, зависит от используемого сервера и операционной системы. С Linux вы можете попробовать (как root; все следующие команды тоже как root):

lsof -ni | grep httpd

3-й столбец содержит имя учетной записи Пользователя, на котором работает веб-сервер (часто wwwrun).
Если команда lsof не существует в вашей системе используйте
ps aux | grep apache

Все вышесказанное относится к Apache. С другими серверами вы можете попробовать "http" или "www" вместо этого. 1-й столбец содержит учетную запись пользователя.

Чтобы получить группы, к которым принадлежит пользователь (здесь для wwwrun):
groups wwwrun


Непроверенный пример. Следующее предполагает:
Пользователь веб-сервера = wwwrun
Группа веб-серверов = www
PHP log sub directory name = php
Имя файла журнала PHP = mail. log
в PHP.Ини: почта.лог файл /var/журнал/РНР/почта.журнал

Перейдите в каталог, в котором вы хотите создать подкаталог журнала (например, /var/log).
$ cd /var/log
$ mkdir php
$ chown root:www php
$ chmod 770 php
$ cd php
$ touch mail.log
$ chown wwwrun:www mail.log
$ chmod 660 mail.log

Member 13120366

я очень сожалею об этом, но ни один другой форум или кто-либо из моих друзей не может помочь мне в этом, поэтому я на 100% завишу от вашего ответа