Autor Zpráva
Matthew Cook
Profil
Zdravím,

Mám tento script na odeslání mailu s přílohou. bohužel se mi nedaří odeslat soubor. pořád píše typ souboru není povolen i když mám ve scriptu soubour s povolenou příponou.. zkoušel jsem jpg, png, pdf a nic... Prosím o radu kde je chyba.

Děkuji

<?php
if(isset($_POST) && !empty($_POST) ){
    if(!empty($_FILES ['attachment']['name'])) {
        
        $file_name = $FILES['attachment']['name'];
        $temp_name = $FILES['attachment']['tmp_name'];
        $file_type = $FILES['attachment']['type'];
        
        $base = basename($file_name);
        $extension =substr($base, strlen($base)-4, strlen($base));
        
        $allowed_extensions = array(".doc",".docx",".pdf",".zip",".png",".jpg");
        
        if(in_array($extension,$allowed_extensions)) {
            
            //mail essenstials
            $from = $_POST['email'];
            $to = "mail@seznam.cz";
            $subject = "předmět";
            $message = "Zpráva s přílohou";

            $file = $temp_name;
            $content = chunk_split(base64_encode(file_get_contents($file)));
            $uid = md5(uniqid(time()));
            
            $header  =  "From: ".$from. "\r\n";
            $header .=  "Reply-To: ".$replyto. "\r\n";
            $header .=  "MIME-Version: 1.0\r\n";
            
            $header .= "Content-Type: multipart/mixed; boundary=\"".$uid. "\"\n\r\n";
            $header .="This is a multi-part message in MIME format. \r\n";
            
            $header .= "--" .$suid. "\r\n";
            $header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
            $header .= "Content-Transfer-Enconding: 7bit\r\n\r\n";
            $header .= $message."\r\n\r\n";
            
            $header .= "--".$uid. "\r\n";
            $header .= "Content-Type: ".$file_type."; name=\"".$file_name."\"\r\n";
            $header .= "Content-Transfer-Encoding: base64\r\n";
            $header .= "Content-Disposition: attachment; filename=\"".$file_name."\"\r";
            $header .= $content."\r\n\r\n";
            
            if (mail($to, $subject, "", $header)) {
                 echo "úspěch";
            } else {
                 echo "neuspět";
            }
            exit();
            
        } else {
             echo "typ souboru není povolen";
        }
        
        }else { 
          echo "souubor neodeslán";  
        }
}
?>
<html>
<body>
<form method="post" action="index.php" enctype="multipart/form-data">
<input type="text" name="email" value="form"/>
<br>
<input type="file" name="attachment"/>
<br>
<input type="submit" value="odeslat mail"/>
</form>
</body>
</html>
Keeehi
Profil
Když za 5. řádek vložíš var_dump($file_name); tak ti to vypíše co?
petr 6
Profil
Matthew Cook:
Radek 10 je principielne spatne, ale to neni pricinou problemu. Zkus si vypsat promennou $base, pripadne $file_name, jestli obsahuji to, co maji.

Nema nahodou soubor, ktery se pokousis nahrat, priponu psanou velkymi pismeny?
Matthew Cook
Profil
Nejsem tak zkušený v PHP začínám, akorát že potřebuji udělat tento script že jsem ho slíbil. Dělal jsem to podle video tutoriálu. Pokud máte někdo podobný funkční script klidne pošelete děkuji
mimochodec
Profil
Matthew Cook:
Konec názvu toho souboru není v tom výčtu, který je uveden na 12. řádku.
petr 6
Profil
Matthew Cook:
Nejsem tak zkušený v PHP začínám
V češtině zřejmě taky.

Tak to zkusíme znovu:
- Když za 5. řádek vložíš var_dump($file_name); tak ti to vypíše co?
- Nema nahodou soubor, ktery se pokousis nahrat, priponu psanou velkymi pismeny?

Pokud máte někdo podobný funkční script
Podle kódu se tvůj skript zdá být funkční (byť by mohl být lépe napsaný)
Matthew Cook
Profil
Pokud zadám na 5. řádek var_dump($file_name); vypíše:
NULL typ souboru není povolen

Ano i když to zní blbě čeština není zrovna moje silná stránka a ani php.

Děkuji za radu


a soubory mají v příponě malé písmena.
petr 6
Profil
No vidíš, to pomohlo. Napřed používáš proměnnou $_FILES a následně proměnnou $FILES (bez podtržítka), která samozřejmě neexistuje.
Tomáš123
Profil
Matthew Cook:
Keďže koncovky majú rôznu dĺžku, myslím, že bude lepšie rozklad na príponu a názov súboru prevádzať pomocou funkcie explode(), ktorej dve časti sa uložia do premenných špecifikovaných v konštrukciu list(). Príklad:
  list($filename, $extension) = explode(".", $file_name);
  $allowed_extensions = array("doc","docx","pdf","zip","png","jpg");
  /* Pole nesmie obsahovať bodky pred príponami, pretože boli vyššie odstránené funkciou explode(). */
  //výsledné premenné by mali korešpondovať so zvyškom skriptu
  //pokračuje podmienkou na riadku 14

ÚPRAVA: Upravené na podnet juriada ↓, s funkciou basename() som sa mýlil. Ďakujem za opravu.
juriad
Profil
Tomáš123:
Mýlíš se. Ponechává příponu, pokud ji nepředáš jako druhý parametr.
Matthew Cook
Profil
petr 6
Byla chyba s proměnou
Děkuji email se odešle akorát mi pošle bohužel soubor o (0 B)
petr 6
Profil
Tomáš123:
Keďže koncovky majú rôznu dĺžku, myslím, že bude lepšie rozklad na príponu a názov súboru prevádzať“ ... takto:
$extension = pathinfo($file_name, PATHINFO_EXTENSION);
(vrací koncovky bez tečky)
Keeehi
Profil
Dost se tu zapomíná na to, že v souboru nemusí být jen jedna tečka! toto.je.moje.fotka.jpg je naprosto legitimní název souboru. Taky se v něm vůbec tečka nacházet nemusí.
$extension = substr($base, (int)strrpos($base, '.'));
Je to dřeváceké ale funguje to. Pokud se používá vícebajtové kódování tak samozřejmě použít mb_* ekvivalenty. Nebo lépe použít tu petr 6 zmiňovanou funkci pathinfo.

Odeslat ručně email s prílohou je celeem složité. Proto je lepší využít už připravených tříd které snižují riziko chyby. V Nejčastější potíže s PHP (FAQ) » Odeslání více položek jsou zmíněné rovnou dvě.
juriad
Profil
Keeehi:
Co takový soubor .htaccess? Soubory začínající tečkou jsou podle UNIXové konvence skryté.

On je dost naivní celý koncept přípon; není lepší prostě kontrolovat, že název souboru končí zadaným výrazem? Třeba regulárem:
/\.(docx?|pdf|zip|png|jpe?g)$/i
Keeehi
Profil
juriad:
Právě proto, že je celý koncept přípon naivní, můžu soubor .htaccess považovat za soubor se jménem dlouhým nula znaků a příponou .htaccess, vím že reálně to tak není ale při whitelistovém ověření mi to vůbec nemusí vadit.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0