1. Forum używa plików Cookies. Dowiedz się więcej o celu ich używania i możliwości zmiany ustawień Cookies w przeglądarce. Czytaj więcej...

ROZWIĄZANE [PHPmailer] Formularz przestał działać (jak dodać odpowiedni from oraz reply-to)

Dyskusja w 'Hosting i domeny internetowe' rozpoczęta przez użytkownika neo, 7 Wrzesień 2015.

  1. neo

    neo Zaglądacz Beta-tester

    Wiadomości:
    10
    Docenione treści:
    0
    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&amp;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;"> &times; </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:
    <?php

    require_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');
     
  2. Mariusz

    Mariusz pomoc.home.pl home.pl Administrator forum

    Wiadomości:
    3 060
    Docenione treści:
    300
    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!
     
    JKokna i neo lubią to.
  3. neo

    neo Zaglądacz Beta-tester

    Wiadomości:
    10
    Docenione treści:
    0
    @Mariusz dokładnie o to chodziło :), pięknie dziękuję :) Jestem zaskoczony szybkością odpowiedzi :)!
     
  4. Mariusz

    Mariusz pomoc.home.pl home.pl Administrator forum

    Wiadomości:
    3 060
    Docenione treści:
    300
    @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ść!
     
  5. sulimo

    sulimo Nowy użytkownik

    Wiadomości:
    4
    Docenione treści:
    0
    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"); // attachment

    if(!$mail->Send()) {
      echo 
    "Mailer Error: " $mail->ErrorInfo;
    } else {
      echo 
    "Message sent!";
    }
     
  6. Mariusz

    Mariusz pomoc.home.pl home.pl Administrator forum

    Wiadomości:
    3 060
    Docenione treści:
    300
    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:
    Kod:
    $mail->SetFrom('kowalski@twojadomena.pl');
    Kod:
    $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.
    Kod:
    $mail->AddReplyTo("name@yourdomain.com","First Last");
     
  7. sulimo

    sulimo Nowy użytkownik

    Wiadomości:
    4
    Docenione treści:
    0
    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

    Kod:
    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.
     
  8. casar

    casar Profesjonalista

    Wiadomości:
    461
    Docenione treści:
    122
    A jakiej wersji PHP używasz?
     
  9. sulimo

    sulimo Nowy użytkownik

    Wiadomości:
    4
    Docenione treści:
    0
  10. casar

    casar Profesjonalista

    Wiadomości:
    461
    Docenione treści:
    122
    To sprawdź na 5.5 przykładowo. Z tego co wiem, 5.6 ma jakieś problemy z Mailerem.
     
  11. sulimo

    sulimo Nowy użytkownik

    Wiadomości:
    4
    Docenione treści:
    0
    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ć?
     
  12. Stau

    Stau Majster

    Wiadomości:
    340
    Docenione treści:
    98
    To zmień interpreter PHP tylko dla tego katalogu, gdzie jest "kłopot".
     
  13. Grzesiek

    Grzesiek Centrum Pomocy home.pl Administrator forum

    Wiadomości:
    3 555
    Docenione treści:
    325

Poleć forum znajomym