Formularz do wysyłki maili z załącznikiem - problem

2018-06-02 18:15:45 Post #1 gość_polak2468

 
Witam wszystkich. Mam problem z poniższym skryptem mojego autorstwa. Skrypt z założenia ma wykonywać:
1. Po kliknięciu wyślij ma być wysłany do mnie mail.
2. Schemat tematu wiadomości np. Problem/$counter/$date gdzie $counter to będzie zmienna zwiększana po każdym wysłaniu maila.
3. Dodawanie załącznika/pliku graficznego do formularza i wysyłanie go.
4. Walidacja żeby użytkownicy głupot nie wpisywali.
5. Zapisywanie do bazy danych wysłanych mailem informacji. //tego jeszcze nie ma, będzie jak się uporam z tym co jest
6. Rozmiar załączanego pliku ma być nie większy niż 2MB.

Na obecną chwilę po kliknięciu "Wyślij" żaden mail się nie wysyła. Od razu zaznaczę, że $headers ustawione na bazie przykładów znalezionych w sieci, więc mogą tam być błędy. Niestety $headers są wymagane do wysyłki maila z załącznikiem.

Bardzo proszę o wskazówki/pomoc.

<!DOCTYPE html>
<html>
	<head>
		<title>HelpDesk - wyślij problem</title>
		<style>
			.error {
				color: #FF0000;
			}
			.mailmsg {
				color: #00ddff;
			}
		</style>
	</head>
<body>

<?php


	//serwer
	//$server = "localhost";
	//admin
	//$admin = "root";
	//hasło
	//$pass = "ZAQ!2wsx";
	//nazwa bazy
	//$base = "test";
	//$dbconnection = mysqli_connect($server, $admin, $pass, $base) or die ("Brak połączenia z serwerem");

	
	$nameErr = $surnameErr = $companyErr = $emailErr = $commentErr = $upload_fileErr = "";
	$name = $surname = $company = $email = $comment = $upload_file = $mailMsg = $headers = $body = $content = "";
	$counter = 0;
	
	if ($_SERVER["REQUEST_METHOD"] == "POST"){
		/* można by było sprawdzać w jednym ifie czy pola są ustawione i jeśli nie
		 * to zwracać jedno info, że nie są ustawione i wtedy dodać walidację w js
		 * i by było lepiej bo nie po stronie serwera, czyli bez odświeżania strony
		 */
		if (empty($_POST["name"])) {
			$nameErr = "Należy podać imię.";
		} else {
			$name = prepare_data($_POST["name"]);
			#sprawdzanie czy imię zawiera tylko litery i ma od 3 - 20 znaków
			if (!preg_match("/^[A-Z]([a-z]{3,20})$/", $name)){
				$nameErr = "Należy wpisywać litery. Imię o długości 3 - 20 znaków.";
			}
		}
		
		if (empty($_POST["surname"])) {
			$surnameErr = "Należy podać nazwisko.";
		} else {
			$surname = prepare_data($_POST["surname"]);
			if (!preg_match("/^[A-Z]([a-z]{3,20})$/", $surname)){
				$surnameErr = "Należy wpisywać litery. Nazwisko o długości 3 - 20 znaków.";
			}
		}
		
		if (empty($_POST["company"])) {
			$companyErr = "Należy podać nazwę firmy.";
		} else {
			$company = prepare_data($_POST["company"]);
			if (!preg_match("/^[A-Z]([a-z])$/", $company)){
				$companyErr = "Należy wpisywać litery.";
			}
		}
		
		if (empty($_POST["email"])) {
			$emailErr = "Należy podać email kontaktowy.";
		} else {
			$email = prepare_data($_POST["email"]);
			if (!filter_var($email, FILTER_VALIDATE_EMAIL)){
				$emailErr = "Należy podać poprawny email. Będzie użyty do kontaktu zwrotnego.";
			}
		}
			
		if (empty($_POST["comment"])) {
			$commentErr = "Należy opisać problem.";
		} else {
			$comment = prepare_data($_POST["comment"]);
		}
		
		#$upload_file = $_POST["upload_file"];
		$file = ($_FILES["upload_file"]["name"]);
		$fileType = strtolower(pathinfo($file, PATHINFO_EXTENSION));
		
		#plik został wysłany i do tego bez błędów
		if ($file && (!$_FILES["upload_file"]["error"])){
			#pozwalamy na konkretne formaty
			if ($fileType != "jpg" && $fileType != "png" && $fileType != "jpeg"){
				$upload_fileErr = "Dozwolone są tylko obrazki w formatach JPG, PNG, JPEG.";
			}
			
			#plik nie może być większy niż 2MB
			if ($file > (2048000)) {
				$upload_fileErr = "Plik jest większy niż 2MB.";
			}
			$content = chunk_split(base64_encode(file_get_contents($file)));
		} //else {
			//$upload_fileErr = "Wystąpił problem z dołączeniem pliku: kod ".$_FILES["upload_file"]["error"];
		//}
			
			
		$counter += 1;
		$toEmail = "some@email.com"; #mail gdzie ma lecieć wiadomość
		$subject = "Problem/$counter/date('Y/m/d h:i:sa')"; #format tematu -> Problem/kolejny_numer_inkrementowany_po_każdym_wysłaniu_formularza/data Y/M/D H:M:S
		
		#oddziela kolejne części maila
		$strSid = md5(uniqid(time()));
		
		$eol = "\r\n";
		
		#main header
		$headers .= "From: $email" . $eol;
		$headers .= "MIME-version: 1.0" . $eol;
		$headers .= "Content-Type: multipart/mixed; boundary=\"" . $strSid . "\"" . $eol;
		$headers .= "Content-Transfer-Encoding: 7bit" . $eol;
		$headers .= "This is a MIME encoded message." . $eol;
		
		#treść
		$body .= "--" . $strSid . $eol;
		$body .= "Content-Type: text/plain; charset=utf-8" . $eol;
		$body .= "Content-Transfer-Encoding: 8bit" . $eol;
		$body .= $comment . $eol;
		
		#załącznik
		$body .= "--" . $strSid . $eol;
		$body .= "Content-Type: application/octet-stream; name=\"" . $file . "\"" . $eol;
		$body .= "Content-Transfer-Encoding: base64" . $eol;
		$body .= "Content-Disposition: attachement" .$eol;
		$body .= $content . $eol;
		$body .= "--" . $strSid . "--";

		#wysyłka maila
		if (mail($toEmail, $subject, $body, $headers)) {#za $comment moze być np. $body .= $comment
			$mailMsg = "Mail został wysłany.";
			echo '<span class="mailmsg"><?php echo $mailMsg; ?></span>"';
		} else {
			$mailMsg = "Nie udało się wysłać maila.";
			echo '<span class="mailmsg"><?php echo $mailMsg; ?></span>"';
		}
	
	}	
	
	#usuwanie niepotrzebnych znaków w razie jakby miały się pojawić
	function prepare_data($form_data) {
		$form_data = trim($form_data); #skasowanie białych znaków
		$form_data = stripslashes($form_data); #kasowanie backslashy
		#return $form_data; #ciekawe czy zwróci automatycznie dane czy trzeba je ręcznie zwracać
	}
?>
	<p><span class="error">* wymagane pola</span></p>
	
	<form action="helpdesk.php" method="post" enctype="multipart/form-data">
		<label for="name">Imię:</label>
		<input type="text" name="name"><span class="error">* <?php echo $nameErr; ?></span><br>
		<label for="surname">Nazwisko:</label> 
		<input type="text" name="surname"><span class="error">* <?php echo $surnameErr; ?></span><br>
		<label for="company">Firma:</label> 
		<input type="text" name="company"><span class="error">* <?php echo $companyErr; ?></span><br>
		<label for="email">Email:</label> 
		<input type="text" name="email"><span class="error">* <?php echo $emailErr; ?></span><br>
		<label for="comment">Problem:</label> 
		<textarea name="comment" rows="5" cols="40"></textarea><span class="error">* <?php echo $commentErr; ?></span><br>
		<label for="upload_file">Wybierz plik do podesłania:</label><br> 
		<input type="file" name="upload_file"><span class="error"><?php echo $upload_fileErr; ?></span>
		<input type="submit" name="submit" value="Wyślij">
	</form>
	
	

</body>
</html>

Odpowiedz

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer