NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Chyba v odeslání emailu (jQuery & PHP)

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jan Václavík:21.1.2018 19:41

Ahoj, stáhnul jsem si script který jsem pochopil jak funguje ale nemohu přijít na to proč se neprovede PHP script když v něm mám funkci mail() a pokud ne tak se vše provede v pořádku.

Řeším to pěkně dlouho a stále nemohu přijít na to kde je chyba.

Vše funguje pokud pozužiju:
JS

$(document).ready(function() {
    $('form').submit(function(event) {

        event.preventDefault();   // zamezení odeslání formuláře standardním způsobem
        $("div").remove(".err");
        $("div").remove(".msg");

        var formData = {
            'firstname'   : $('input[name=firstname]').val(),
            'secondname' : $('input[name=secondname]').val(),
         };

        // odeslání dat formuláře na server
        $.ajax({
            type     : 'POST',   //data zašleme způsobem POST
            url      : 'send.php', // jaký php skript bude volán
            data     : formData, //data z formuláře
            dataType : 'json',   //jaká data očekáváme nazpět ze serveru
            encode   : true
        })

        // success
            .done(function(data) {

                $("form").after('<div class="msg">' + data.message + '</div>');

                if(data.success == true)
                {
                    $(".msg").css("color", "green");
                    console.log(data.message);
                } else {
                    $.each(data.errors, function(index, value) {
                        $('form :text[name="'+index+'"]').after('<div class="err">'+value+'</div>');
                    });
                }
            })

            //error ... spustí se pokud přijde ze serveru cokoliv kromě 200
            .fail(function( jqXHR, textStatus, errorThrown ){
                console.log('Status: '+textStatus+', Error: '+errorThrown);
            });

    });

});

a PHP script

$errors = array();
$data   = array();  //data, která budeme posílat nazpět

if (empty($_POST['firstname'])){
   $errors['firstname'] = 'Jméno je nutné vyplnit.';
}

if (empty($_POST['secondname'])){
   $errors['secondname'] = 'Přímení je nutné vyplnit.';
}

if (empty($errors))
{


        //zde zpracujeme  $_POST['kod_produktu'] a $_POST['nazev_produktu']
    $output = "Jméno: ".$_POST['firstname'].PHP_EOL."Přímení:".$_POST['secondname'].PHP_EOL;
    //tzn. například je uložíme do databáze.
    //Nyní však pro jednoduchost uložíme data do souboru:
    $dataFileHandler = fopen('data.txt', 'a');
    fprintf ($dataFileHandler, "%s", $output);

    //potom připravíme zprávu pro skript, který provedl volání této rutiny
    $data['success'] = true;
    $data['message'] = 'Update proběhl úspěšně';
} else {

    $data['success'] = false;
    $data['errors']  = $errors;
    $data['message'] = 'Při ukládání dat se vyskytly chyby!';
}

echo json_encode($data);

Ale když použiju verzi s mail():
JS

$(document).ready(function() {
            $('form').submit(function(event) {

                event.preventDefault();   // zamezení odeslání formuláře standardním způsobem
                $("div").remove(".err");
                $("div").remove(".msg");

                var formData = {
                    'firstname'   : $('input[name=firstname]').val(),
                    'secondname' : $('input[name=secondname]').val(),
                    'company' : $('input[name=company]').val(),
                    'email' : $('input[name=email]').val(),
                    'price' : $('input[name=price]').val(),
                    'message' : $('input[name=message]').val()
                };

                // odeslání dat formuláře na server
                $.ajax({
                    type     : 'POST',   //data zašleme způsobem POST
                    url      : 'send.php', // jaký php skript bude volán
                    data     : formData, //data z formuláře
                    dataType : 'json',   //jaká data očekáváme nazpět ze serveru
                    encode   : true
                })

                // success
                    .done(function(data) {

                        $("form").after('<div class="msg">' + data.message + '</div>');

                        if(data.success == true)
                        {
                            $(".msg").css("color", "green");
                            console.log(data.message);
                        } else {
                            $.each(data.errors, function(index, value) {
                                $('form :text[name="'+index+'"]').after('<div class="err">'+value+'</div>');
                            });
                        }
                    })

                    //error ... spustí se pokud přijde ze serveru cokoliv kromě 200
                    .fail(function( jqXHR, textStatus, errorThrown ){
                        console.log('Status: '+textStatus+', Error: '+errorThrown);
                    });

            });

        });

a PHP script

$errors = array();
$data   = array();  //data, která budeme posílat nazpět

if (empty($_POST['firstname'])){
   $errors['firstname'] = 'Jméno je nutné vyplnit.';
}

if (empty($_POST['secondname'])){
   $errors['secondname'] = 'Přímení je nutné vyplnit.';
}

if (empty($_POST['company'])){
   $errors['company'] = 'Firmu je nutné vyplnit.';
}

if (empty($_POST['email'])){
   $errors['email'] = 'Email je nutné vyplnit.';
}

if (empty($_POST['price'])){
   $errors['price'] = Cenu je nutné vyplnit.';
}

if (empty($_POST['message'])){
   $errors['message'] = 'Zprávu je nutné vyplnit.';
}

if (empty($errors))
{
        $to = "[email protected]";
        $subject = $_POST['firstname']." ".$_POST['secondname']." - ".$_POST['price']." - ".$_POST['company'];
        $messages = $_POST['message'];
        $headers = "From: ".$_POST['email'];

        mail($to, $subject, $messages, $headers);

    //potom připravíme zprávu pro skript, který provedl volání této rutiny
    $data['success'] = true;
    $data['message'] = 'Update proběhl úspěšně';
} else {

    $data['success'] = false;
    $data['errors']  = $errors;
    $data['message'] = 'Při ukládání dat se vyskytly chyby!';
}

echo json_encode($data);

Tady je ještě FORM

<form name="formular" method="POST">
                        <label>
                                Jméno
                                <input type="text" name="firstname" placeholder="Jméno">
                        </label>
                        <label>
                                Přímení
                                <input type="text" name="secondname" placeholder="Přímení">
                        </label>
                        <label>
                                Firma
                                <input type="text" name="company" placeholder="Firma">
                        </label>
                        <br/>
                        <label>
                                E-mail
                                <input type="text" name="email" placeholder="E-mail">
                        </label>
                        <label>
                                Nabízená cena
                                <input  type="text" name="price" placeholder="Nabízená cena">
                        </label>
                        <br/>
                        <label>
                                Zpráva
                                <textarea class="white" id="message" name="message" placeholder=""></textarea>
                        </label>
                        <br/>
                        <input type="submit"  name="submit" value="Odelsat" >
                </form>
 
Odpovědět
21.1.2018 19:41
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Jan Václavík
Petr Čech:21.1.2018 19:50

Nezkoušel jsem to, ale... víš, že ti chybí apostrof u $errors['price'] = Cenu je nutné vyplnit.';, že ano? :D
Funkci mail() bych vůbec nedoporučoval používat a použil bych PHPMailer, který se dá dost rozumně použít na prakticky cokoliv a je user-friendly.
Nepíše to nějaké chyby? Kde se to pokoušíš spustit? Na localu to nebude fungovat, pokud jsi si nezprovoznil mailserver (a i stejně tak to bude fungovat jen pro lokální mail, pokud nebudeš mít něco jako SMTP relay).

Nahoru Odpovědět
21.1.2018 19:50
the cake is a lie
Avatar
Jan Václavík:21.1.2018 20:01

Spouštím to na doméně.

Píše to jen chybu která se má napsat pokud nebude empty($errors). Apostrof u sebe v kódu mám.

Editováno 21.1.2018 20:03
 
Nahoru Odpovědět
21.1.2018 20:01
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Jan Václavík
Petr Čech:22.1.2018 0:57

Používej tlačítko odpovědět!
No a co error log na hostingu? Nebo použij PHPmailer a on ti tu chybu řekne... :P (myslím)
A nepřišlo ti to do spamu? To se často stává, třeba na můj Gmail se už ani nepokouším nic posílat automaticky, protože ze všech těch testů si můj server blacklistnul a já s tím nemuzu nic udělat :D . Takže si to zkus poslat na něco hloupějšího, třeba nějaký temp mail nebo seznam, co buď filtry nemají vůbec nebo jsou nejsou tak vychytralé.
BTW, je to normální hosting, nebo si to spravuješ sám na nějakém VPS?

Nahoru Odpovědět
22.1.2018 0:57
the cake is a lie
Avatar
Neaktivní uživatel:22.1.2018 1:08

Bez chyby ti tezko nekdo poradi.

Editováno 22.1.2018 1:08
Nahoru Odpovědět
22.1.2018 1:08
Neaktivní uživatelský účet
Avatar
Odpovídá na Petr Čech
Jan Václavík:22.1.2018 13:09

Tak jsem použil PHPMailer ale moc jsem nepochodil. Aspoň že to ukazuje ty chyby.

Fatal error: Uncaught Error: Class 'PHPMailer' not found in /data/web/vir­tuals/xxxxx/vir­tual/www/index­.php:7 Stack trace: #0 {main} thrown in /data/web/vir­tuals/xxxxx/vir­tual/www/index­.php on line 7

Kód mám:

if(isset($_POST['odeslat'])){
        require "PHPmailer/src/PHPMailer.php";
        require "PHPmailer/src/SMTP.php";
        $mail = new PHPMailer(true);                              // Passing `true` enables exceptions
        try {
            //Server settings
            $mail->SMTPDebug = 2;                                 // Enable verbose debug output
            $mail->isSMTP();                                      // Set mailer to use SMTP
            $mail->Host = 'smtp-xx.mxx.wedos.net';  // Specify main and backup SMTP servers
            $mail->SMTPAuth = true;                               // Enable SMTP authentication
            $mail->Username = '[email protected]';                 // SMTP username
            $mail->Password = 'xx';                           // SMTP password
            $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
            $mail->Port = 587;                                    // TCP port to connect to

            //Recipients
            $mail->setFrom('[email protected]', 'Mailer');
            $mail->addAddress('[email protected]', 'Někdo');     // Add a recipient

            //Content
            $mail->isHTML(true);                                  // Set email format to HTML
            $mail->Subject = 'Here is the subject';
            $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
            $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

            $mail->send();
            echo 'Message has been sent';
        } catch (Exception $e) {
            echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
        }
}

Použil jsem kód přímo z gitu tam bylo přidáno ještě toto ale nemůžu se dobádat co je "vendor/autlo­ad.php" a řádek s use mi vyhazuje chybu:

use PHPMailer\PHPMailer\PHPMailer;
require '../vendor/autoload.php';

chyba s use

Parse error: syntax error, unexpected 'use' (T_USE) in /data/web/vir­tuals/xxx/vir­tual/www/index­.php on line 3

 
Nahoru Odpovědět
22.1.2018 13:09
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Jan Václavík
Petr Čech:22.1.2018 13:44

Vendor je složka, kam se ukládají knihovny třetí stran typicky je tam dává composer.
Doporučil bych ti to nainstalovat přes composer; jestli ho neumíš používat, nauč se ho, je to extrémně užitečná věc. A je úplně ok mít composer jen pro jednu dependency.

Nahoru Odpovědět
22.1.2018 13:44
the cake is a lie
Avatar
Odpovídá na Petr Čech
Jan Václavík:22.1.2018 14:19

Dobře. Hosting mám u wedosu takže tam stačí když do root složky (/) dám composer.json a composer.lock ?

 
Nahoru Odpovědět
22.1.2018 14:19
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.