Sytuacja wygląda następująco: posiadam formularz kontaktowy oparty o standardowy PHPmailer, który przestał funkcjonować (przestał wysyłać wiadomości na moją skrzynkę). Ponoć coś zmieniliście na serwerach i wymagacie teraz, aby poprawny adres e-mail nadawcy znajdował się w nagłówku wysyłanej wiadomości (from). Więcej piszecie tutaj: https://pomoc.home.pl/baza-wiedzy/formularz-kontaktowy-na-stronie-www-nie-wysyla-wiadomosci/ Proszę o pomoc w modyfikacji mojego formularza, aby wiadomości były poprawnie dostarczane, tak jak poprzednio. Zależy mi również na tym, aby po odebraniu wiadomości z formularza (czyli po określeniu froma wiadomości) i po kliknięciu przycisku "Odpowiedź", nowa wiadomość była wysyłana na adres e-mail klienta, który został wpisany w formularzu, a nie na adres froma. Poniżej przedstawiam kod HTML mojego skryptu: HTML: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Własny formularz kontaktowy</title> <link href="http://fonts.googleapis.com/css?family=Roboto:400,300&subset=latin-ext" rel="stylesheet" /> <style> article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block;} body{line-height:1;} ol,ul{list-style:none;} blockquote,q{quotes:none;} blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;} table{border-collapse:collapse;border-spacing:0;} a{text-decoration:none;} input:focus,input:active{outline:none;} textarea:focus,textarea:active{outline:none;} .cf:before,.cf:after{content:" ";display:table;} .cf:after{clear:both;} .ir{border:0;font:0/0 a;text-shadow:none;color:transparent;background-color:transparent;} .ht{position:absolute;top:-10000px;left:-10000px;} .form-success{background-color:#6cbf40;padding:10px;font-size:15px;color:#ffffff;line-height:1.4em;} #contactform{margin-bottom: 30px;} #contactform .form-error{background-color:#ff6600;padding:10px;font-size:15px;color:#ffffff;margin-bottom:15px;line-height:1.4em;} #contactform fieldset{width:100%;} #contactform fieldset label{display:block;font-size:15px;color:#46494f;margin-bottom:12px;} #contactform fieldset input[type=text], #contactform fieldset input[type=email]{font-family:Roboto,sans-serif;color:#acb4bd;font-size:14px;border:1px solid #d8dee5;box-shadow:0px 1px 3px rgba(0, 0, 0, 0.1);padding:9px 14px;width:460px;max-width:100%;box-sizing:border-box;-moz-box-sizing:border-box;height:40px;margin-bottom:10px;} #contactform fieldset input[type=text]:hover,#contactform fieldset input[type=email]:hover{color:#61656d;border-color:#acb4bd;} #contactform fieldset input[type=text]:focus,#contactform fieldset input[type=email]:focus{color:#61656d;border-color:#196abc;} #contactform fieldset textarea{font-family:Roboto,sans-serif;color:#acb4bd;font-size:14px;border:1px solid #d8dee5;box-shadow:0px 1px 3px rgba(0, 0, 0, 0.1);padding:9px 14px;width:460px;max-width:100%;box-sizing:border-box;-moz-box-sizing:border-box;height:160px;margin-bottom:10px;resize:none;} #contactform fieldset textarea:hover{color:#61656d;border-color:#acb4bd;} #contactform fieldset textarea:focus{color:#61656d;border-color:#196abc;} #contactform fieldset .form-field-error{color:#ff6600;font-style:italic;font-size:12px;margin-bottom:15px;margin-top:-5px;line-height:1.3em;} #contactform fieldset input[type=submit]{background:#1969ba;background:-webkit-linear-gradient(top, #1969ba 0%, #13508e 100%);background:linear-gradient(to bottom, #1969ba 0%, #13508e 100%);border:none;font-size:14px;font-family:Roboto,sans-serif;color:#ffffff;cursor:pointer;padding:9px 14px;box-sizing:border-box;-moz-box-sizing:border-box;} #contactform fieldset input[type=submit]:hover{background:#1969ba;background:-webkit-linear-gradient(top, #1969ba 0%, #053565 100%);background:linear-gradient(to bottom, #1969ba 0%, #053565 100%);} #contactform fieldset input[type=submit]:active{background:#053565;background:-webkit-linear-gradient(top, #053565 0%, #1969ba 100%);background:linear-gradient(to bottom, #053565 0%, #1969ba 100%);} #contactform fieldset input[type=hidden]{display:none;} #container { width: 460px; margin: 0px auto; font-family: Roboto, sans-serif; color: #46494f; } #container h1 { font-family: Roboto, sans-serif; font-size: 36px; padding-top: 5px; margin-bottom: 15px; color: #acb4bd; line-height: 1.2em; font-weight: 300; } #contactform fieldset input[name=contact_check] { width: 50px; text-align: center; vertical-align: 2px; } #contactform fieldset input[type=submit] { float: right; } </style> </head> <body> <div id="container"> <h1>Formularz kontaktowy</h1> <form action="form/send.php" method="post" id="contactform"> <fieldset> <input type="text" name="nazwa_firmy" placeholder="Nazwa firmy" required="required" tabindex="1" /> <input type="text" name="contact_name" placeholder="Imię i nazwisko" required="required" tabindex="2" /> <input type="email" name="contact_email" placeholder="Adres e-mail" required="required" tabindex="3" /> <input type="text" name="nr_telefonu" placeholder="Numer telefonu" required="required" tabindex="4" /> <textarea rows="5" columns="10" name="contact_body" placeholder="Treść wiadomości (np. zapytanie o dostępne relacje lub inne pytania na temat naszej oferty)" required="required" tabindex="5"></textarea> <input type="submit" value="Wyślij" tabindex="7" /><span style="color:#f4f4f4;">Podaj wynik:</span> <span style="color:#f4f4f4;" class="form_check_1"></span> <span style="color:#f4f4f4;"> × </span><span style="color:#f4f4f4;" class="form_check_2"></span> = <input type="text" name="contact_check" maxlength="2" tabindex="6" /> <input type="hidden" name="contact_check_data" value="" /> </fieldset> </form> </div> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> <script src="main.js"></script> </body> </html> Poniżej przedstawiam kod PHP mojego skryptu: PHP: <?phprequire_once 'class.phpmailer.php';$_POST = array_map('trim', $_POST);$error = false;if (!isset($_POST['contact_name']) || empty($_POST['contact_name'])) { $error = true;}if (!isset($_POST['contact_email']) || empty($_POST['contact_email']) || !PHPMailer::ValidateAddress($_POST['contact_email'])) { $error = true;}if (!isset($_POST['nazwa_firmy']) || empty($_POST['nazwa_firmy'])) { $error = true;}if (!isset($_POST['nr_telefonu']) || empty($_POST['nr_telefonu'])) { $error = true;}if (!isset($_POST['contact_body']) || empty($_POST['contact_body'])) { $error = true;}if (!isset($_POST['contact_check']) || empty($_POST['contact_check']) || (int) $_POST['contact_check'] !== ((int) $_POST['contact_check_data'][0] * (int) $_POST['contact_check_data'][1])) { $error = true;}if ($error) { exit('nok');}$mail = new PHPMailer();$mail->CharSet = 'UTF-8';$mail->SetFrom($_POST['contact_email'], $_POST['contact_name']);$mail->AddAddress('transport@domena.pl');$mail->Subject = 'Wiadomość ze strony WWW';$mail->Body = "Nazwa firmy: ".$_POST['nazwa_firmy']."\nImię i nazwisko: ".$_POST['contact_name']."\nAdres e-mail: ".$_POST['contact_email']."\nNumer telefonu: ".$_POST['nr_telefonu']."\n\nTreść wiadomości: ".$_POST['contact_body'];if (!$mail->Send()) { exit('nok');}exit('ok');
W Twoim przypadku zmiany należy wprowadzić tylko w pliku PHP. Przed wprowadzeniem poniżej zaproponowanych zmian, upewnij się, że na serwerze (na którym znajduje się skrypt formularza) masz utworzoną skrzynkę e-mail, np. "formularz@domena.pl". Po utworzeniu odpowiedniej skrzynki (np. formularz@domena.pl), przejdź do realizacji poniższych instrukcji: Znajdź: PHP: $mail->SetFrom($_POST['contact_email'], $_POST['contact_name']); Zamień na: PHP: $mail->AddReplyTo($contact_email, $contact_name);$mail->SetFrom('formularz@domena.pl'); Dodatkowo dodaj powyżej w dowolnym miejscu: PHP: $contact_name = strip_tags($_POST['contact_name']);$contact_email = strip_tags($_POST['contact_email']); Dzięki takiemu zabiegowi, wiadomości będą poprawne wysyłane przez formularz kontaktowy na ten sam adres e-mail co zawsze (czyli na adres "transport@domena.pl"). Jako "from" zostanie określony adres skrzynki "formularz@domena.pl" (taka skrzynka musi istnieć na serwerze, w przeciwnym wypadku wysyłka wiadomości z formularza nie zostanie wykonana). Po odebraniu wiadomości e-mail wysłanej z formularza i próbie wysłania na nią odpowiedzi, zostanie ona wysłana na adres e-mail, który został wpisany w formularzu przez użytkownika/klienta. Mało tego! Zostanie również pobrana nazwa użytkownika, która została podana w formularzu, a dokładniej w parametrze contact_name. Powodzenia!
@neo - akurat robiłem podobne modyfikacje "u siebie" niedawno, można powiedzieć, że korzystamy z podobnego rozwiązania przy formularzu kontaktowym . Polecam się na przyszłość!
Witam, czy jest szansa podania przykładu dla konfiguracji z smtp i autoryzacją, ponieważ standardowe ustawienie nie działa? Coś w stylu: PHP: $mail= new PHPMailer();$body= 'treść';$mail->IsSMTP(); // telling the class to use SMTP$mail->Host= "mail.yourdomain.com"; // SMTP server$mail->SMTPDebug = 2; // enables SMTP debug information (for testing)$mail->SMTPAuth = true; // enable SMTP authentication$mail->Host = "mail.yourdomain.com"; // sets the SMTP server$mail->Port = 26; // set the SMTP port for the GMAIL server$mail->Username = "yourname@yourdomain"; // SMTP account username$mail->Password = "yourpassword"; // SMTP account password$mail->SetFrom('name@yourdomain.com');$mail->AddReplyTo("name@yourdomain.com","First Last");$mail->Subject = "PHPMailer Test Subject via smtp, basic with authentication";$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test$mail->MsgHTML($body);$address = "whoto@otherdomain.com";$mail->AddAddress($address, "John Doe");$mail->AddAttachment("images/phpmailer.gif"); // attachment$mail->AddAttachment("images/phpmailer_mini.gif"); // attachmentif(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo;} else { echo "Message sent!";}
Wysyłka przez SMTP nie wymaga większych modyfikacji w skrypcie. Należy tylko pamiętać, aby w ustawieniach autoryzacji SMTP podać nazwę skrzynki e-mail, która utworzona jest na tym samym serwerze, na którym będzie uruchomiony ten skrypt. Przykładowo, jeśli wybierasz wysyłkę przez SMTP, pamiętaj aby w konfiguracji skryptu podać nazwę konta w postaci pełnego adresu e-mail (np. kowalski@twojadomena.pl). Podana w konfiguracji skrzynka e-mail musi być aktywna na serwerze, na którym skrypt zostanie uruchomiony. W przeciwnym wypadku, wysyłka nie zostanie przeprowadzona. Na tej podstawie można stwierdzić, że w obu poniższych polach musi zostać podany ten sam adres e-mail, który istnieje i jest aktywny na serwerze w home.pl: Code: $mail->SetFrom('kowalski@twojadomena.pl'); Code: $mail->Username = "kowalski@twojadomena.pl"; // SMTP account username Zwróć uwagę, że taka konfiguracja spowoduje, że każda otrzymana wiadomość e-mail, zostanie odebrana jako wysłana z adresu "kowalski@twojadomena.pl". Podczas każdej próby odpowiedzi na taką wiadomość e-mail, będziesz przygotowywaną odpowiedź wysyłać właśnie na adres "kowalski@twojadomena.pl". Pamiętaj o tym podczas wysyłania odpowiedzi, ponieważ możesz wysłać odpowiedź w nieodpowiednie miejsce. Aby rozwiązać kwestie z wysyłką odpowiedzi na poprawny adres e-mail, należy poszukać rozwiązania korzystając z poniższego fragmentu kodu (poniższy kod nie jest rozwiązaniem, jest tylko cytatem z twojego kodu). Pozwala on określić na jaki adres e-mail mają być wysyłane przygotowywane odpowiedzi. Przykładowo, możesz tak przygotować ten fragment kodu, aby odpowiedzi były wysyłane na adres e-mail wpisany przez użytkownika w formularzu. Code: $mail->AddReplyTo("name@yourdomain.com","First Last");
Nie do końca tak jest. Poniżej kod z próbą wysłania maila za pomocą PHPMailera v.5.2 PHP: require_once "include/PHPMailer/class.phpmailer.php"; $mail= new PHPMailer(); $mail->IsSMTP(); // telling the class to use SMTP $mail->Host= "moj_serwer.home.pl"; // SMTP server $mail->SMTPDebug = 2; // enables SMTP debug information (for testing) $mail->SMTPAuth = true; // enable SMTP authentication $mail->Port = 465; // set the SMTP port for the GMAIL server $mail->Username = "user@mojadomena-na-moim_serwerze.pl"; // SMTP account username $mail->Password = "secret"; // SMTP account password $mail->SetFrom('user@mojadomena-na-moim_serwerze.pl'); $mail->AddReplyTo("user@mojadomena-na-moim_serwerze.pl","Nadawca"); $mail->Subject = "PHPMailer Test Subject via smtp, basic with authentication"; $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test $mail->MsgHTML('tresc'); $address = "adresat@gmail.com"; $mail->AddAddress($address, "Adresat"); if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message sent!"; } Poniżej debug przy próbie połączenia Code: SMTP -> FROM SERVER: SMTP -> FROM SERVER: SMTP -> ERROR: EHLO not accepted from server: SMTP -> FROM SERVER: SMTP -> ERROR: HELO not accepted from server: Notice: fputs(): send of 12 bytes failed with errno=32 Broken pipe in /PHPMailer/class.smtp.php on line 215 SMTP -> ERROR: AUTH not accepted from server: SMTP -> NOTICE: EOF caught while checking if connectedSMTP Error: Could not authenticate. Mailer Error: SMTP Error: Could not authenticate. Dodanie PHP: $mail->SMTPSecure = 'ssl'; daje tylko dodatkowy błąd. Proszę o info co robię źle, jak należy skonfigurować/skonstruować obiekt PHPMailera żeby wszystko zadziałało.
Dzięki, za sugestię, ale zbyt dużo rzeczy mam na serwerze, żeby tylko dla tego zmieniać wersję PHP. Czy ktoś z "Staff Member" mógłby się do tego ustosunkować?
Zapraszam, www.php.home.pl lub bezpośrednio do artykułu pomocy: https://pomoc.home.pl/baza-wiedzy/ustawienie-interpretera-skryptow-za-pomoca-htaccess/ Jeśli i to rozwiązanie nie przyniesie efektu, wyślij proszę zgłoszenie przez www.home.pl/kontakt i podaj numer sprawy. Skieruję temat do odpowiednich osób.