Formularz z adresem e-mail

0

Jako, że poradziłem sobie z poprzednim problemem mam inną kwestię - otóż chciałbym na stronie mieć taki mini formularz. Ktoś wpisuję swój adres e-mail i na niego zostaję wysłana wiadomość (która idzie z gmaila) z załącznikiem. Tylko nie jestem pewien jaki to konkretnie ma wyglądać, a znalezione poradniki na necie niezbyt mi to "rozjaśniają".

<form id="contact-form">                                 
               <div class="form-group">
                                <label for="inputEmail">Podaj swój adres e-mail by otrzymać więcej informacji.</label>
                                <input type="email" class="form-control" id="email" aria-describedby="emailHelp" placeholder="Wprowadź adres e-mail." name="name">
                                <small id="emailHelp" class="form-text text-muted"></small>
               </div>                     

               <button type="submit" class="btn btn-primary" onclick="sendMessage();">Wyślij</button>
               <div id="msgSubmit" class="h3 text-center hidden">Message Submitted!</div>                            
 </form> 
function sendMessage()
{
    // Initiate Variables With Form Content    
    var email = $("#email").val();    
 
    $.ajax({
        type: "POST",
        url: "php/form-process.php",
        data: "name=" + name + "&email=" + email + "&message=" + message,        
        success : function(text){
            if (text === "success"){
                formSuccess();
            }
        }
    });
}

function formSuccess(){
    $( "#msgSubmit" ).removeClass( "hidden" );
};
$EmailTo = $_POST["email"];
 
$email = "[email protected]";
$Subject = "New Message Received";
 
// prepare email body text
$Body .= "Name: dsdsadsa";
$Body .= "\n";
 
$Body .= "Email: ";
$Body .= $email;
$Body .= "\n";
 
$Body .= "Message: fdsfdsfsfsdfsd";
$Body .= "\n";
 
// send email
$success = mail($EmailTo, $Subject, $Body, "From:".$email);
 
// redirect to success page
if ($success){
   echo "success";
}else{
    echo "invalid";
}

Swoją drogą jakby ktoś mi mógł objaśnić troszkę ten kod. Bo rozumiem, że w js zapisuję do zmiennej maila i przsyłam go do php, gdzie tworzona jest wiadomość i przesyłana dalej. Tylko nie rozumiem chyba tego POST w js i dlaczego tego znalezionego kodu nie używa się jako metody onclick w przycisku w formularzu.

0

Podbijam po zmianie nazwy tematu i treści (w celu by nie spamić na forum).

0

Ja bym zaczął od sprawdzenia, czy w ogóle kod jest przesyłany do serwera, czyli inaczej mówiąc - czy $.ajax się poprawnie wykonuje.
Bo skoro maile się nie wysyłają, to (tak w dużym uproszczeniu) są dwie możliwości:

  • nie wysyłają się, bo przeglądarka nie przesyła poprawnie żądania, albo dane przesłane do serwera są niekompletne/błędne.
  • dane z przeglądarki są OK, ale problem leży po stronie serwera.

Na chwilę obecną proponuję, żeby w skrypcie PHP dać jakieś echo, albo np. zapisać otrzymane dane do pliku i sprawdzić, czy są one poprawnie przesyłane na serwer. Wtedy będziemy wiedzieli coś więcej odnośnie źródła problemu.

1

Widzę, że sporo osób ma problem z podstawowym contact form, wrzucałem juz linki: Skrypty do PHP

Na localhost nie działa klasyczny mail, na niektórych hostingach również jest blokowany (trzeba smtp).

Dla osób upośledzonych technicznie są autoformy:
https://formspree.io/
https://app.haboob.co/
https://zapier.com/app-directory/email/integrations/webhook/62/turn-webhooks-into-sent-emails
bez pisania kodu.

0

Zastosowałem się do poradnika z tego filmu I dalej nic, mail nie zostaje wysłany, nie wykonuje się też success w js, więc brak wiadomości. Nie do końca rozumiem gdzie niby występuje problem, czy bezpośrednio w $.ajax czy gdzieś w php.

Poniżej zamieszcza kod js i php.

function sendEmail()
{
    var email;
    email = $('#email');
   
    if (isNotEmpty(email)){
        $.ajax({           
           url: 'php/sendtest.php',
           method: 'POST',
           dataType: 'json',
           data:{
               email: email.val()
           }, success: function (response){
               if (response.status === "success")
                   console.log("email sent");               
               else
                   console.log("please try again");
           }
        });        
    } else window.alert('Brak adresu e-mail.');   
}

function isNotEmpty(caller){
    if (caller.val()==='') {
        caller.css('border', '1px solid red');
        return false;
    } else
        caller.css('border', '');
    
    return true;
}
<?php

/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
 if(isset($_POST['email'])){
     $email = $_POST('email');
     
     require_once "PHPMailer/PHPMailer.php";
     require_once "PHPMailer/SMTP.php";
     require_once "PHPMailer/Exception.php";     
     
     $mail = new PHPMailer();
     
     //SMTP Settings
     $mail -> isSMTP();
     $mail -> Host = "smtp.gmail.com";
     $mail -> SMTPAuth = true;
     $mail -> Port = 465;
     $mail -> Username = "mojmail";
     $mail -> Password = "mojehasło";
     $mail -> SMTPSecure = "ssl";
     
     //Email Settings
     $mail -> isHTML(true);
     $mail -> setFrom("mojmail", "od");
     $mail -> addAddress($email);
     $mail -> Subject = "asdsa";
     $mail -> Body = "dsadasdas";
     
     if($mail->send()){
         $status = "success";
         $response = "email is sent!";
     }else {          
        $response = "Wrong!";        
     }     
     exit(json_encode(array("response" => $response, "status" => $status)));     
 }
0

@cerrato: Dodałem w php przed email settings linijkę echo "<script>window.alert('dsadsadsa');</script>"; Nic się nie pokazało.

0

Korzystasz z AJAX'a, więc może lepiej wrzuć treści przesłane do skryptu do jakiegoś pliku tekstowego na serwerze - wtedy będziesz mieć 100% pewności.

Poza tym - zakładając, że PHP nie otrzymuje poprawnie tych danych (zamiast zapisywać "adadsadasddsa" lepiej zrzuć konkretne wartości typu $_POST["email"]) to masz już jakąś wskazówkę, gdzie szukać - nie po stronie serwera, ale coś na froncie.

Możesz też spróbować wywołać skrypt wysyłający maila ręcznie, a nie przez AJAX (stwórz jakiś prosty formularz z 2 polami i przyciskiem typu SUBMIT) i sprawdź, czy wtedy w ogóle skrypt zostanie wykonany. Może ta Twoja ścieżka do pliku PHP php/form-process.php jest błędna.

0

@cerrato Dopiero teraz zauważyłem jedno - całość odnośników w require znajdowała się w innym folderze (po prostu kretyn, że tego nie zauważyłem), przeniosłem więc cały folder PHPMailer do folderu php. I teraz ma do nich dostęp. Dla próby odpaliłem sam plik php z ustawionym na sztywno mailem docelowym. Wyskakuje mi teraz komunikat:
Fatal error: Uncaught Error: Class 'PHPMailer' not found in C:\xampp\htdocs\edu_site\php\sendtest.php:16 Stack trace: #0 {main} thrown in C:\xampp\htdocs\edu_site\php\sendtest.php on line 16
Z tego co rozumiem, to klasa phpmailer nie została odnaleziona, dotyczy to $mail = new PHPMailer(); Jak to naprawić?

0

Dobra, po wrzuceniu paczki do tego folderu i zmianie $mail = new PHPMailer(); na $mail = new PHPMailer\PHPMailer\PHPMailer(); zaczęło działać używając samego phpa.

Edit: Dobra, w końcu działa. Wystarczyło zamienić $ na jQuery. Został teraz tylko dwa problemu -
pierwszy - dalej nie wyświetalją się alerty z wiadomościami,
drugi - raczej prosty problem czyli brak kodowania w utf-8.

0

pierwszy - dalej nie wyświetalją się alerty z wiadomościami,

A czy możesz napisać konkretniej, o co chodzi i jakie alerty masz na myśli?

brak kodowania w utf-8.

Tutaj bym zaczął od sprawdzenia, czy sama strona z formularzem ma odpowiedni charset ustawiony

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