IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: PHP formulář s přílohou

Aktivity
Avatar
Jan Štrobl
Člen
Avatar
Jan Štrobl:16.10.2017 14:33

Ahoj,
nedávno jsem řešil problém kde jsem vytvářel emailový formulář s přílohami. Nechtělo/nedařilo se mi s email senderem z githubu a našel jsem funkční kód, který mi bohatě postačil. Není to čistě moje práce, pouze jsem jej trochu poupravil. Pokud dokážu najít originál tak přihodím odkaz. Nicméně bych se o něj s vámi rád podělil.

HTML

<h1>Formulář</h1>
<form enctype="multipart/form-data" method="POST" action="">
<input type="text" name="jmeno" placeholder="Vaše jméno" required />
<input type="text" name="telefon" placeholder="Vaše tel. číslo" required />
<input type="email" name="email" placeholder="Váš e-mail" required />

<br />

     <?php
            if ($hlaska)
                echo('<span class="hlaska"><center>' . $hlaska . '</center></span>');
        ?>
<br />
        <br />

<textarea name="message"></textarea>
         <br />
           <label>Příloha 1<span class="red">*</span><br /><input type="file" name="file[]" /></label>
             <br />
             <label>Příloha 2<br /><input type="file" name="file[]" /></label>
             <br />
             <label>Příloha 3<br /><input type="file" name="file[]" /></label>
             <br />
             <br />
<input type="submit" value="Odeslat" />
</form>

PHP

<?php
if($_POST && isset($_FILES['file']))
{
    $recipient_email    = "[email protected]"; //Komu se email odešle, může být nahrazeno proměnou
    $from_email         = "[email protected]"; //Od koho (např.: [email protected], [email protected])
    $subject            = "Předmět"; //předmět emailu

    $sender_name = filter_var($_POST["jmeno"], FILTER_SANITIZE_STRING); //jméno odesílatele
    $sender_email = filter_var($_POST["email"], FILTER_SANITIZE_STRING); //email odesílatele (resp. osoby co vyplnuje formulář)

    $attachments = $_FILES['file'];
    $mess = $_POST["message"];
    $telefon = $_POST["telefon"];
    $meil = $_POST["email"];
    $jmeno = $_POST["jmeno"];
     $sender_message = '
<html>
<head>
<title>HTML email</title>
</head>
<body>
<p>
Nový email

</p>
</body>
</html>
';
    //php validace
    if(strlen($sender_name)<4){
        $hlaska = 'Jméno je příliš krátké!';
    }
    if (!filter_var($sender_email, FILTER_VALIDATE_EMAIL)) {
       $hlaska = 'Nevalidní email!';
    }
    if(strlen($sender_message)<4){
         $hlaska = 'Zpráva je příliš krátká. Napište nám o sobě něco.';
    }

    $file_count = count($attachments['name']); //count total files attached | spočítá přílohy
    $boundary = md5("sanwebe.com");

    if($file_count > 0){ //if attachment exists
        //hlavička
        $headers = "MIME-Version: 1.0\r\n";
        $headers .= "From:".$from_email."\r\n";
        $headers .= "Reply-To: ".$sender_email."" . "\r\n";
        $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n";

        //text zprávy
        $body = "--$boundary\r\n";
        $body .= "Content-Type: text/html; charset=\"utf-8\"\n";
        $body .= "Content-Transfer-Encoding: base64\r\n\r\n";
        $body .= chunk_split(base64_encode($sender_message));

        //přílohy
        for ($x = 0; $x < $file_count; $x++){
            if(!empty($attachments['name'][$x])){

                if($attachments['error'][$x]>0) //exit script and output error if we encounter any
                {
                    $mymsg = array(
                    1=>"The uploaded file exceeds the upload_max_filesize directive in php.ini",
                    2=>"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
                    3=>"The uploaded file was only partially uploaded",
                    4=>"No file was uploaded",
                    6=>"Missing a temporary folder" );
                    die($mymsg[$attachments['error'][$x]]);
                }

                //zíksání informací o přílohách
                $file_name = $attachments['name'][$x];
                $file_size = $attachments['size'][$x];
                $file_type = $attachments['type'][$x];

                //čtení souboru
                $handle = fopen($attachments['tmp_name'][$x], "r");
                $content = fread($handle, $file_size);
                fclose($handle);
                $encoded_content = chunk_split(base64_encode($content)); //split into smaller chunks (RFC 2045)

                $body .= "--$boundary\r\n";
                $body .="Content-Type: $file_type; name=" . $file_name ."\r\n";
                $body .="Content-Disposition: attachment; filename=" . $file_name ."\r\n";
                $body .="Content-Transfer-Encoding: base64\r\n";
                $body .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n";
                $body .= $encoded_content;
            }
        }

    }else{ //send plain email otherwise
       $headers = "From:".$from_email."\r\n".
        "Reply-To: ".$sender_email. "\n" .
        "X-Mailer: PHP/" . phpversion();
        $body = $sender_message;
    }

     $sentMail = @mail($recipient_email, $subject, $body, $headers);
    if($sentMail) //output success or failure messages
      {
                $hlaska = 'Email byl úspěšně odeslán, brzy Vám odpovíme.';
            }
            else
                $hlaska = 'Email se nepodařilo odeslat. Zkontrolujte adresu.';
        }

?>
 
Odpovědět
16.10.2017 14:33
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Jan Štrobl
Jakub Žák:16.10.2017 17:14

Není lepší použít SwiftMailer (příp. PHP Mailer)? Dlouhou dobu jsem se snažil napsat něco svého nad funkcí mail(), ale když to chceš opravdu používat, tak začneš narážet na další a další problémy a nepřinese ti to nic víc, než ty knihovny, které právě třeba přílohy mají celkem dobře vyřešené.

Nahoru Odpovědět
16.10.2017 17:14
Kuba je ajťák. Buď jako Kuba.
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na Jakub Žák
Jan Štrobl:17.10.2017 8:14

Právě že tohle navrhuji jako alternativu PHPMaileru, jelikož ten jsem zkoušel a nějak se mi nedařilo se s tím "poprat", ovšem chyba mohla být hlavně v tom, že mě tlačil čas. Pokud začnu narážet na problémy tak mi asi nic jiného nezbude ale zatím to skvěle splňuje vše co potřebuji.

 
Nahoru Odpovědět
17.10.2017 8:14
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Jan Štrobl
Jakub Žák:17.10.2017 8:34

PHP Mailer jsem taky nikdy úspěšně nepoužil (některé věci mi v něm chyběly), ale SwiftMailer používám všude již několik let a bez problémů :)

Nahoru Odpovědět
17.10.2017 8:34
Kuba je ajťák. Buď jako Kuba.
Avatar
Jiří Fencl
Člen
Avatar
Jiří Fencl:17.10.2017 14:16

Pouzivam PHPMailer taky radu let a bez problemu... staci dobre nastavit a uz cele to nastaveni vc. odeslani dat do bloku na odchyt vyjimek aby jste to odladili jestli vam to nejde. Pri jednodussi variante (bez smtp) je to 5-7radku kodu

 
Nahoru Odpovědět
17.10.2017 14:16
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 5 zpráv z 5.