Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Formularz do wysyłki maili z załącznikiem - problem
Forum PHP.pl > Forum > PHP
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.
7. W celach ćwiczeniowych wszystko w php.

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.

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>HelpDesk - wyślij problem</title>
  5. <style>
  6. .error {
  7. color: #FF0000;
  8. }
  9. .mailmsg {
  10. color: #00ddff;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15.  
  16. <?php
  17.  
  18.  
  19. //serwer
  20. //$server = "localhost";
  21. //admin
  22. //$admin = "root";
  23. //hasło
  24. //$pass = "ZAQ!2wsx";
  25. //nazwa bazy
  26. //$base = "test";
  27. //$dbconnection = mysqli_connect($server, $admin, $pass, $base) or die ("Brak połączenia z serwerem");
  28.  
  29.  
  30. $nameErr = $surnameErr = $companyErr = $emailErr = $commentErr = $upload_fileErr = "";
  31. $name = $surname = $company = $email = $comment = $upload_file = $mailMsg = $headers = $body = $content = "";
  32. $counter = 0;
  33.  
  34. if ($_SERVER["REQUEST_METHOD"] == "POST"){
  35. /* można by było sprawdzać w jednym ifie czy pola są ustawione i jeśli nie
  36. * to zwracać jedno info, że nie są ustawione i wtedy dodać walidację w js
  37. * i by było lepiej bo nie po stronie serwera, czyli bez odświeżania strony
  38. */
  39. if (empty($_POST["name"])) {
  40. $nameErr = "Należy podać imię.";
  41. } else {
  42. $name = prepare_data($_POST["name"]);
  43. #sprawdzanie czy imię zawiera tylko litery i ma od 3 - 20 znaków
  44. if (!preg_match("/^[A-Z]([a-z]{3,20})$/", $name)){
  45. $nameErr = "Należy wpisywać litery. Imię o długości 3 - 20 znaków.";
  46. }
  47. }
  48.  
  49. if (empty($_POST["surname"])) {
  50. $surnameErr = "Należy podać nazwisko.";
  51. } else {
  52. $surname = prepare_data($_POST["surname"]);
  53. if (!preg_match("/^[A-Z]([a-z]{3,20})$/", $surname)){
  54. $surnameErr = "Należy wpisywać litery. Nazwisko o długości 3 - 20 znaków.";
  55. }
  56. }
  57.  
  58. if (empty($_POST["company"])) {
  59. $companyErr = "Należy podać nazwę firmy.";
  60. } else {
  61. $company = prepare_data($_POST["company"]);
  62. if (!preg_match("/^[A-Z]([a-z])$/", $company)){
  63. $companyErr = "Należy wpisywać litery.";
  64. }
  65. }
  66.  
  67. if (empty($_POST["email"])) {
  68. $emailErr = "Należy podać email kontaktowy.";
  69. } else {
  70. $email = prepare_data($_POST["email"]);
  71. if (!filter_var($email, FILTER_VALIDATE_EMAIL)){
  72. $emailErr = "Należy podać poprawny email. Będzie użyty do kontaktu zwrotnego.";
  73. }
  74. }
  75.  
  76. if (empty($_POST["comment"])) {
  77. $commentErr = "Należy opisać problem.";
  78. } else {
  79. $comment = prepare_data($_POST["comment"]);
  80. }
  81.  
  82. #$upload_file = $_POST["upload_file"];
  83. $file = ($_FILES["upload_file"]["name"]);
  84. $fileType = strtolower(pathinfo($file, PATHINFO_EXTENSION));
  85.  
  86. #plik został wysłany i do tego bez błędów
  87. if ($file && (!$_FILES["upload_file"]["error"])){
  88. #pozwalamy na konkretne formaty
  89. if ($fileType != "jpg" && $fileType != "png" && $fileType != "jpeg"){
  90. $upload_fileErr = "Dozwolone są tylko obrazki w formatach JPG, PNG, JPEG.";
  91. }
  92.  
  93. #plik nie może być większy niż 2MB
  94. if ($file > (2048000)) {
  95. $upload_fileErr = "Plik jest większy niż 2MB.";
  96. }
  97. } //else {
  98. //$upload_fileErr = "Wystąpił problem z dołączeniem pliku: kod ".$_FILES["upload_file"]["error"];
  99. //}
  100.  
  101.  
  102. $counter += 1;
  103. $toEmail = "some@email.com"; #mail gdzie ma lecieć wiadomość
  104. $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
  105.  
  106. #oddziela kolejne części maila
  107. $strSid = md5(uniqid(time()));
  108.  
  109. $eol = "\r\n";
  110.  
  111. #main header
  112. $headers .= "From: $email" . $eol;
  113. $headers .= "MIME-version: 1.0" . $eol;
  114. $headers .= "Content-Type: multipart/mixed; boundary=\"" . $strSid . "\"" . $eol;
  115. $headers .= "Content-Transfer-Encoding: 7bit" . $eol;
  116. $headers .= "This is a MIME encoded message." . $eol;
  117.  
  118. #treść
  119. $body .= "--" . $strSid . $eol;
  120. $body .= "Content-Type: text/plain; charset=utf-8" . $eol;
  121. $body .= "Content-Transfer-Encoding: 8bit" . $eol;
  122. $body .= $comment . $eol;
  123.  
  124. #załącznik
  125. $body .= "--" . $strSid . $eol;
  126. $body .= "Content-Type: application/octet-stream; name=\"" . $file . "\"" . $eol;
  127. $body .= "Content-Transfer-Encoding: base64" . $eol;
  128. $body .= "Content-Disposition: attachement" .$eol;
  129. $body .= $content . $eol;
  130. $body .= "--" . $strSid . "--";
  131.  
  132. #wysyłka maila
  133. if (mail($toEmail, $subject, $body, $headers)) {#za $comment moze być np. $body .= $comment
  134. $mailMsg = "Mail został wysłany.";
  135. echo '<span class="mailmsg"><?php echo $mailMsg; ?></span>"';
  136. } else {
  137. $mailMsg = "Nie udało się wysłać maila.";
  138. echo '<span class="mailmsg"><?php echo $mailMsg; ?></span>"';
  139. }
  140.  
  141. }
  142.  
  143. #usuwanie niepotrzebnych znaków w razie jakby miały się pojawić
  144. function prepare_data($form_data) {
  145. $form_data = trim($form_data); #skasowanie białych znaków
  146. $form_data = stripslashes($form_data); #kasowanie backslashy
  147. #return $form_data; #ciekawe czy zwróci automatycznie dane czy trzeba je ręcznie zwracać
  148. }
  149. ?>
  150. <p><span class="error">* wymagane pola</span></p>
  151.  
  152. <form action="helpdesk.php" method="post" enctype="multipart/form-data">
  153. <label for="name">Imię:</label>
  154. <input type="text" name="name"><span class="error">* <?php echo $nameErr; ?></span><br>
  155. <label for="surname">Nazwisko:</label>
  156. <input type="text" name="surname"><span class="error">* <?php echo $surnameErr; ?></span><br>
  157. <label for="company">Firma:</label>
  158. <input type="text" name="company"><span class="error">* <?php echo $companyErr; ?></span><br>
  159. <label for="email">Email:</label>
  160. <input type="text" name="email"><span class="error">* <?php echo $emailErr; ?></span><br>
  161. <label for="comment">Problem:</label>
  162. <textarea name="comment" rows="5" cols="40"></textarea><span class="error">* <?php echo $commentErr; ?></span><br>
  163. <label for="upload_file">Wybierz plik do podesłania:</label><br>
  164. <input type="file" name="upload_file"><span class="error"><?php echo $upload_fileErr; ?></span>
  165. <input type="submit" name="submit" value="Wyślij">
  166. </form>
  167.  
  168.  
  169.  
  170. </body>
  171. </html>
markonix
No ale co znaczy, że nie wysyła? Wyświetla błąd, że nie wysłano czy masz komunikat że wysłano tylko e-mail nie dociera?
polak2468
Dokładnie tak - komunikat informuje, że mail wysłany, a nic nie dociera. Czy jest możliwe, że coś powinienem skonfigurować/włączyć na serwerze? Testuję lokalnie na kompie na xampp i włączałem tylko apache.

PS
Pogoglowałem chwilę, skonfigurowałem i wysyłanie maila działa, ale są błędy. Wiadomość, która dociera zawiera załącznik, który waży 0kb i nie mam treści w wiadomości. Natomiast w przeglądarce pojawia się Warning: file_get_contents(TRS 301 with full upgrades.jpg): failed to open stream: No such file or directory in D:\programy\xampp\htdocs\skrypt.php on line 108. Fakt, nie ma tego pliku w tej ścieżce, ale klikając na "Przeglądaj..." wskazałem ten plik, bo on fizycznie istnieje, tyle że nie w tej lokalizacji z powyższego warninga.
Poza tym nie rozumiem dlaczego po wciśnięciu "Wyślij" wszystkie pola są walidowane tak jakby w ogóle nic w nie nie było wpisane. Żaden komunikat przy którymkolwiek inpucie nie powinien się pojawić po wciśnięciu "Wyślij".
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.