Wątek przeniesiony 2021-04-08 19:36 z Webmastering przez Patryk27.

Wysłanie treści formularza html na email

0

Cześć

Stworzyłem na własne potrzeby stronkę internetową, na której umieściłem formularz kontaktowy. Chciałbym, aby po kliknięciu przycisku, zawartość formularza została wysłana na mój adres email. Wykorzystałem do tego skrypt .php, który dostosowałem do swoich potrzeb, jednak wiadomości nie dochodzą.
Nie jestem web devloperem, ale lubię robić wszystko sam, dlatego proszę o wyrozumiałość i możliwie jasne wskazówki, co robię nie tak.

Fragment kodu odpowiedzialnego za formularz wygląda tak:

<form name="contactform" action="sendform3.php" id="contactform" class="p-5 bg-white"> 
 
  <div class="row form-group">
	<div class="col-md-6 mb-3 mb-md-0">
	  <label class="text-black" for="fname">Imię</label>
	  <input type="text" id="fname" name="fname" class="form-control rounded-0">
	</div>
  </div>

  <div class="row form-group">
	<div class="col-md-12">
	  <label class="text-black" for="email">E-mail</label>
	  <input type="email" id="email" name="email" class="form-control rounded-0">
	</div>
  </div>

  <div class="row form-group">
	<div class="col-md-12">
	  <label class="text-black" for="subject">Temat</label>
	  <input type="subject" id="subject"  name="subject" class="form-control rounded-0">
	</div>
  </div>

  <div class="row form-group">
	<div class="col-md-12">
	  <label class="text-black" for="message">Wiadomość</label>
	  <textarea name="message" id="message"  name="message" cols="30" rows="7" class="form-control rounded-0" placeholder="Zostaw swoją wiadomość tutaj..."></textarea>
	</div>
  </div>

  <div class="row form-group">
	<div class="col-md-12">
	  <input type="submit" value="Wyślij!" class="btn btn-primary mr-2 mb-2">
	</div>
  </div>
</form>

Skrypt sendform3.php, który wywołuję przyciskiem wygląda następująco:

<?php
if(isset($_POST['email'])) {
 
    // EDIT THE 2 LINES BELOW AS REQUIRED
    $email_to = "kontakt@domena.me";
    $email_subject = "Kontakt ze strony ";
 
    function died($error) {
        // your error code can go here
        echo "We are very sorry, but there were error(s) found with the form you submitted. ";
        echo "These errors appear below.<br /><br />";
        echo $error."<br /><br />";
        echo "Please go back and fix these errors.<br /><br />";
        die();
    }
 
 
    // validation expected data exists
    if(!isset($_POST['fname']) ||
        !isset($_POST['lname']) ||
        !isset($_POST['email']) ||
        !isset($_POST['subject']) ||
        !isset($_POST['message'])) {
        died('We are sorry, but there appears to be a problem with the form you submitted.');       
    }
 
     
    $fname = $_POST['fname']; // required
    $lname = $_POST['lname']; // required
    $email_from = $_POST['email']; // required
    $subject = $_POST['subject']; // not required
    $message = $_POST['message']; // required
 
    $error_message = "";
    $email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
 
  if(!preg_match($email_exp,$email_from)) {
    $error_message .= 'The Email Address you entered does not appear to be valid.<br />';
  }
 
    $string_exp = "/^[A-Za-z .'-]+$/";
 
  if(!preg_match($string_exp,$fname)) {
    $error_message .= 'The First Name you entered does not appear to be valid.<br />';
  }
 
  if(!preg_match($string_exp,$lname)) {
    $error_message .= 'The Last Name you entered does not appear to be valid.<br />';
  }
 
  if(strlen($message) < 2) {
    $error_message .= 'The message you entered do not appear to be valid.<br />';
  }
 
  if(strlen($error_message) > 0) {
    died($error_message);
  }
 
    $email_message = "Zawartość formularza kontaktowego:\n\n";
 
    function clean_string($string) {
      $bad = array("content-type","bcc:","to:","cc:","href");
      return str_replace($bad,"",$string);
    }
 
    $email_message .= "Imię: ".clean_string($fname)."\n";
    $email_message .= "Nazwisko: ".clean_string($lname)."\n";
    $email_message .= "Email: ".clean_string($email_from)."\n";
    $email_message .= "Temat: ".clean_string($subject)."\n";
    $email_message .= "Wiadomość: ".clean_string($message)."\n";
 
// create email headers
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);  
?>
 
<!-- include your own success html here -->
 
Dziękuję za kontakt. Skontaktuje się z Tobą w możliwie najkrótszym czasie
 
<?php
 
}
?> 

Po naciśnięciu przycisku pojawia się biała strona, która w pasku adresu ma:

/sendform.php?fname=Jakiesimie&lname=&email=jakis%40email.com&subject=jakistemat&message=trescwiadomosci

Sama stronka jest w domenie ".me" (czarnogóra)
Hosting to: thecamels.org
Na hostingu mam konta pocztowe - działające bo wysyłają i odbierają maile.
Być może samo konto pocztowe lub hosting wymagają konfiguracji, jednak w tej kwestii nawet nie wiem czego szukać...

Dodam tylko, że wiadomość nie trafia do spamu, ani do kosza. Nigdzie jej nie ma... próbowałem wysyłać na adresy @gmail, @outlook i nic.

Bardzo proszę o pomoc.
Pozdrawiam

2

Dane, które wysyłasz do swojego skryptu są przesyłane metodą GET (widać w adresie), a oczekujesz danych wysyłanych metodą POST (bo robisz isset($_POST['email']). Dlatego twój skrypt nic nie robi i pokazuje pustą stronę (bo masz tam tego ifa).

W swoim formularzu (znaczniku <form>) dodaj atrybut method="POST".

2

To co @Ktos napisał już przede mną. Druga rzecz to brak lname w formularzu, ale przy działającym prawidłowo skrypcie powinieneś mieć już o tym komunikaty.

0
Ktos napisał(a):

Dane, które wysyłasz do swojego skryptu są przesyłane metodą GET (widać w adresie), a oczekujesz danych wysyłanych metodą POST (bo robisz isset($_POST['email']). Dlatego twój skrypt nic nie robi i pokazuje pustą stronę (bo masz tam tego ifa).

W swoim formularzu (znaczniku <form>) dodaj atrybut method="POST".

Dzięki za pomoc Panowie! atrybut dodany i wiadomość dotarła.

jurek1980 napisał(a):

To co @Ktos napisał już przede mną. Druga rzecz to brak lname w formularzu, ale przy działającym prawidłowo skrypcie powinieneś mieć już o tym komunikaty.

jest lname w formularzu, tylko nie wkleiłem do posta żeby był krótszy :P

Mam jeszcze jedno pytanie - Co mogę zrobić, aby po wykonaniu skryptu, nie otwierać nowej pustej strony, bo wygląda to słabo, a zamiast tego np. Wyświetlić pop-up z komunikatem, lub przekazać ten komunikat do jakiegoś textboxa na stronie, albo nie wiem co jeszcze możnaby zrobić, aby wyglądało to bardziej profesjonalnie, niż biała pusta strona. Nie wiem jakie są standardy w tej kwestii.

1

Bez przebudowania pełnego to wklei po prostu ładny HTML w pole otagowane komentarzem include your own success html

0
jurek1980 napisał(a):

Bez przebudowania pełnego to wklei po prostu ładny HTML w pole otagowane komentarzem include your own success html

...bez przebudowania kodu .php czy .html? Jezeli wskażesz jakieś źródło gdzie jest opisane takiie rozwiązanie to chętnie się z nim zapoznam.

A można po kliknięciu przycisku "Wyślij" otworzyć konkretny adres url? a dokładniej moją stronkę na sekcji z formularzem: http://<<adres_strony>>/#contact-section ??

1

Jak klikasz przycisk to wysyłasz formularz. Tym symamy strona się przeładuje. Możesz np. dodać wtedy dodatkowe pole ukryte input hidden i w nim np. wartość wysłaną. Na stronie dodać kod JS który przy ładowaniu sprawdza czy jest takie ukryte pole z taką wartością.
Jednak lepiej iść w Ajax i nie przeładowywać strony.
Szukaj pod hasłem "Ajax PHP mail sendind" np.
https://webdesign.tutsplus.com/tutorials/building-a-bootstrap-contact-form-using-php-and-ajax--cms-23068
Najlepiej od razu rozważ uzywanie gotowych bibliotek do samego wysyłania maili jak PHPmailer lub SwiftMailer.

0

Zaczyna to brzmieć skomplikowanie.

Wkleiłem kod html strony do sekcji include your own success html
Jednak strona, która się otwiera ma adres <<adresstrony>>/sendform.php i dalsze korzystanie ze strony powoduje przechodzienie do sekcji <<adresstrony>>/sendform.php#section-contact. Rozumiem dlaczego tak się dzieje, jednak chciałbym, żeby było to możliwie przezroczyste dla użytkownika.
Może zrobić prostą stronkę, która wyświetli się po wywołaniu sendform.php i na niej jakiś button w stylu powrót do strony głównej?

1

To już od Ciebie zależy. Spróbuj. Pomysł nie jest zły.

0

Okej, tak zrobiłem i wygląda to nieźle.

Mam jeszcze jedną kwestię - czy na poziomie .htmla mogę zrobić jakąś walidację pól formularza? W tej chwili walidacja odbywa się w skrypcie .php wiec błędne uzupełnienie formularza skutkuje znowu wyświetleniem białej strony z komunikatem błędu, co wygląda słabo, a tutaj umieszczenie ładnej strony z komunikatem błędu już nie przejdzie... Chciałbym zablokować wywołanie sendform.php jeśli pole nie jest wypełnione poprawnie... ale już czuję, że tutaj znowu potrzebny będzie js lub ajax

2

Nigdy nie waliduje się formularza tylko na froncie. Możesz wstępnie sprawdzać np. poprzez maxlenght i min lenght:
https://www.w3schools.com/tags/att_input_maxlength.asp
Czy pattern!
https://www.w3schools.com/tags/att_input_pattern.asp
Ale jednak musisz to sprawdzać też po stronie skryptu bo tak ktoś zrobi Ci psikusa i wyśle trochę maili wykonując tylko sam request bez wypełniania formularza.

0

Ma to sens!
Dzięki za wsparcie. Jak pojawią się dalsze problemy, to wrócę :)

0

Dobra, jeszcze jedno - czy mogę na poziomie skryptu zadeklarować dane serwera SMTP za pomocą którego ma zostać zrealizowana wysyłka? Obecnie skrypt jako Nadawcę przyjmuje wartość pola email z formularza. Co ciekawe wysyłając formularz na adres email w domenie, działa to prawidłowo - Nadawcą wiadomości jest adres email wpisany w polu formularza. Natomiast wysyłając ten sam formularz na adres w domenie @outlook czy @gmail, wiadomość zostaje dostarczona a w adresie nadawcy widnieje domyślny adres hostingu @f15.thecamels.org. Support hostingu twierdzi, że skrypt jest źle napisany i umywa ręce, a moim zdaniem jeżeli wiadomości są wysyłane bez deklarowania konkretnego serwera SMTP, ktory ma to zrobić, to robi to za pomocą domyślnego serwera i problem, leży po stronie hostingu.

0

Zobacz właśnie jak działa PHPmailer i SwiftMailer i przerób ten skrypt. Masz tam obsługę SMTP oraz proces logowania.

Obecnie skrypt jako Nadawcę przyjmuje wartość pola email z formularza

Tego nie rozumiem. Dodałeś pole nadawcy do formularza i chcesz dynamicznie zmieniać nadawcę względem tego kto co wpisze?

0

Żeby w tle wysłać maila i żeby nie przeładowywać strony, możesz zrobić tak, że:

  1. user klika button to javascript formułuje maila i wywołuje osobny skrypt PHP w tle który tego maila wyśle
  2. tym samym javascriptem robisz okienko które poinformuje że mail został wysłany (chociaż jest to nieścisła informacja bo nie wiesz tak naprawdę, czy wysyłka maila się udało ani czy on dojdzie/powinien dojść)
0

ja robilem tak
dane z formularza zapisywane sa na serwerze w pliku ;-)

0
jurek1980 napisał(a):

Zobacz właśnie jak działa PHPmailer i SwiftMailer i przerób ten skrypt. Masz tam obsługę SMTP oraz proces logowania.

Obecnie skrypt jako Nadawcę przyjmuje wartość pola email z formularza

Tego nie rozumiem. Dodałeś pole nadawcy do formularza i chcesz dynamicznie zmieniać nadawcę względem tego kto co wpisze?

Tak był skonstruowany skrypt i generalnie ma to sens - wpisujesz w formularzu adres email, na który mam się z Tobą kontaktować, a w kliencie poczty wiadomość przychodzi jakby z Twojego adresu - jakby, bo pod spodem jest mój serwer smtp. podmieniona jest tylko nazwa wyświetlana. No ale powiedzmy, że to nie jest najważniejsze, więc zostawmy temat.

pikob napisał(a):

Żeby w tle wysłać maila i żeby nie przeładowywać strony, możesz zrobić tak, że:

  1. user klika button to javascript formułuje maila i wywołuje osobny skrypt PHP w tle który tego maila wyśle
  2. tym samym javascriptem robisz okienko które poinformuje że mail został wysłany (chociaż jest to nieścisła informacja bo nie wiesz tak naprawdę, czy wysyłka maila się udało ani czy on dojdzie/powinien dojść)

To już niestety za ciężki temat dla mnie i chyba zbyt trudny na moje potrzeby. Ale jak podeślesz jakiś przykład to spróbuję dostosować.

1

@gruby19: Przykład nie ale powiem ci jak to można zrobić:

  1. button ma mieć onclick do funkcji JS
  2. funkcja ta ma załadować poprzez HTTP request (polecam jQuery) jakiś plik PHP który dostaje parametry GETem albo POSTem a które są informacją jakiego maila wysłać + treść
  3. ta sama funkcja powoduje np. że wyświetla się alert() że maila wysłano albo możesz własne okienko oprogramować które wyświetli jakiś ładny komunikat

Oczywiście kolega tutaj ma inne rozwiązanie, że wpisujesz to co potrzebujesz do pliku na serwerze w jakimś folderze. Wszystko tak samo tylko zamiast wysłać maila to piszesz do pliku (tekstowego).

0
gruby19 napisał(a):
jurek1980 napisał(a):

Zobacz właśnie jak działa PHPmailer i SwiftMailer i przerób ten skrypt. Masz tam obsługę SMTP oraz proces logowania.

Obecnie skrypt jako Nadawcę przyjmuje wartość pola email z formularza

Tego nie rozumiem. Dodałeś pole nadawcy do formularza i chcesz dynamicznie zmieniać nadawcę względem tego kto co wpisze?

Tak był skonstruowany skrypt i generalnie ma to sens - wpisujesz w formularzu adres email, na który mam się z Tobą kontaktować, a w kliencie poczty wiadomość przychodzi jakby z Twojego adresu - jakby, bo pod spodem jest mój serwer smtp. podmieniona jest tylko nazwa wyświetlana. No ale powiedzmy, że to nie jest najważniejsze, więc zostawmy temat.

No ale nadawca nie jest z formularza tylko wpisany na stałe. Odbiorca jest z formularza. Oczywiście możesz próbować podmieniać adres nadawcy, ale wtedy wiadomość albo zostanie odrzucona, a w najlepszym wypadku trafi u adresata do spamu.
Ty potrzebujesz zasymulować jakby program pocztowy. Żeby to zrobić musisz się do swojej poczty zalogować, tak jak byś robił to przez https://blog.mailtrap.io/phpmailer/ook czy Thunderbird. Wskazane przeze mnie paczki oferują tego typu usługę.
Zobacz przykłady: https://blog.mailtrap.io/phpmailer/
Jak wpiszesz też nawet tu na forum w wyszukiwarkę "phpmailer" to pewnie znajdziesz z 200 wątków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1