Autor Zpráva
shaman171
Profil
Ahoj, asi dva roky jsem měl na stránkách formulář na kontakt a posílalo mi to mejly, teď jsem s hrůzou zjistil, že to posílat mejly přestalo a já netuším proč (žádné změny jsem v kódu nedělal) dokážete mi někdo poradit co je špatně?
Jednotlivé soubory vypadají takto:
funkce.php
<?php
function dej_mime ($jmeno_souboru) {

$pozice = strrpos($jmeno_souboru,'.');
$typ = substr( $jmeno_souboru, $pozice + 1 , strlen($jmeno_souboru) - $pozice);

$mimetypes = array(
'doc' => 'application/msword',
'bin' => 'application/octet-stream',
'lha' => 'application/octet-stream',
'exe' => 'application/octet-stream',
'dll' => 'application/octet-stream',
'pdf' => 'application/pdf',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'swf' => 'application/x-shockwave-flash',
'tar' => 'application/x-tar',
'zip' => 'application/zip',
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'mp2' => 'audio/mpeg',
'mp3' => 'audio/mpeg',
'm3u' => 'audio/x-mpegurl',
'bmp' => 'image/bmp',
'gif' => 'image/gif',
'ief' => 'image/ief',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'png' => 'image/png',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'xbm' => 'image/x-xbitmap',
'wrl' => 'model/vrml',
'vrml' => 'model/vrml',
'css' => 'text/css',
'html' => 'text/html',
'htm' => 'text/html',
'asc' => 'text/plain',
'txt' => 'text/plain',
'rtx' => 'text/richtext',
'rtf' => 'text/rtf',
'sgml' => 'text/sgml',
'sgm' => 'text/sgml',
'xml' => 'text/xml',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'avi' => 'video/x-msvideo',
'rar' => 'application/rar',
);

return ( $mimetypes[$typ]);
}



function extra_mail($to,$from,$subj,$body,$attach = "", $real_name = "") {

// možná vám není jasný zápis v hlavičce funkce $real_name = ""
// dělá následující: pokud parametr real_name nezadáme, doplní
// to co je za rovnítkem. Vyhneme se tak problému se zadáváním nesprávného
// počtu parametrů

$header = "From: $from\n";
$header .= "MIME-version: 1.0\n";
$header .= "X-Mailer: PHP\n";
$header .= "Content-Type: text/html; charset=utf-8\n";
$header .= "Content-Transfer-Encoding: 8bit\n";
$header .= "Return-Path: <$from>\n";
$header .= "Reply-To: $from\n";

if ( !empty($attach) ) { // když máme nějakou přílohu

// mime.php obsahuje funkci na zjištění MIME podle přípony souboru
// include "mime.php";

// když nezadáme $real_name, bude se příloha jmenovat stejně jako je
// název, který vchází do funkce. To nemusí být vhodné například,
// pokud fci voláme přímo po uploadu souboru (php uploadovaný soubor
// ukládá do definovaného adresáře pod nahodně generovaným názvem
// nebo v případě, že v proměnné $attach je jméno souboru i s cestou

if ( empty($real_name) ) {
$real_name = $attach;
}

// zjištění mime typu vznikající přílohy
$type = dej_mime ($real_name);

// načteme přílohu
$f = fopen ($attach,"r");
if (!$f) {
exit ("Nelze otevrit prilohu - koncime");
}

$attach_obsah = fread ($f,filesize ($attach));

// překódujeme obsah přílohy do base64, je vhodné použít i fci chunk
$attach_obsah = chunk_split (base64_encode ($attach_obsah));

fclose ($f);

// připravíme hlavičky (příloha bude přímo v nich)!!!

// vygenerování boundary (hranice), musí to být řetězec, který se nebude
// vyskytovat nikde v textu. Dále vytvoříme úvod mailu, v kterém
// určujeme, že mail má více částí vzájemně oddělených pomocí boundary

$boundary = strtoupper(md5(uniqid("bound_")));
$header .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n\n";
$header .= "This is a multi-part message in MIME format.\n\n";

// hranicí oddělíme úvod
$header .= "--" . $boundary . "\n";

// první část mailu obsahuje běžné tělo mailu, zakódované
$header .= "Content-Type: text/plain; charset=\"utf-8\"\n";
$header .= "Content-Transfer-Encoding: quoted-printable\n\n";
$header .= imap_8bit($body) . "\n\n";

// hranicí určíme, že následuje další část emailu
$header .= "--" . $boundary . "\n";

// dalsi cast mailu - přidáme hlavičky na kódování, mime a přílohu
$header .= "Content-Type: " . $type . "\n";
$header .= "Content-Transfer-Encoding: base64\n";
$header .= "Content-Disposition: attachment; filename=\"$real_name\"\n\n";
$header .= $attach_obsah . "\n\n";

// hranicí ukončíme mail (na konci ještě musí být --)
$header .= "--" . $boundary . "--";
}
else { // email bez přílohy. Pouze zakódujeme a přidáme příslušnou hlavičku
$header .= "Content-Type: text/plain; charset=\"utf-8\"\n";
$header .= "Content-Transfer-Encoding: quoted-printable\n\n";
$header .= imap_8bit($body) . "\n\n";
}

// a vygenerované pošleme
return (mail ($to,$subj,"",$header));

}
?>

formular-app.php

<?php
session_start();
include "fce/funkce.php";

if(IsSet($_POST[odeslymail])) {
  if(IsSet($_POST[robot]))  {
    header("location: http://www.xzy.cz");
    exit;
  }
  
  if(trim($_POST[nazev])=="") {
    $_SESSION[err_nazev] = "ano";
  }
  
  if(trim($_POST[email])=="") {
    $_SESSION[err_email] = "ano";
  }
  
  if(trim($_POST[popis])=="") {
    $_SESSION[err_popis] = "ano";
  } 

  if(trim($_POST[misto])=="") {
    $_SESSION[err_misto] = "ano";
  }
    
  if( $_SESSION[err_popis] == "ano" OR $_SESSION[err_email] == "ano" OR $_SESSION[err_nazev]=="ano" OR $_SESSION[err_misto]=="ano" ) {
    header("location: http://XYZ.cz/kontakt-poptavka.php");
    exit;
  }
  
  $novynazev = $_FILES[soubor1][name];
  $nazev = $_FILES[soubor1][tmp_name];
  
  $novynazev2 = $_FILES[soubor2][name];
  $nazev2 = $_FILES[soubor2][tmp_name];
  
  $obsah = "Jméno / Název firmy: $_POST[nazev]
Telefon: $_POST[telefon]
E-mail: $_POST[email]
Předmět poptávky: $_POST[predmetpoptavky]
Místo stavby: $_POST[misto]
Krytina: $_POST[krytina]
Podhled: $_POST[podhled]
Zpráva - popis poptávky:
$_POST[popis]";
            

  $prijemce =  "xyz@xzy.cz";
  $odesilatel = "robot@xzy.cz";

  if(trim($novynazev2)!="" AND trim($nazev2)!="") {
    extra_mail($prijemce, $odesilatel, "Poptavka 1/2", "$obsah", $nazev, $novynazev );
    extra_mail($prijemce, $odesilatel, "Poptavka 2/2", "$obsah", $nazev2, $novynazev2 );
  }else{
    extra_mail($prijemce, $odesilatel, "Poptavka", "$obsah", $nazev, $novynazev );
  }
  
  $_SESSION[msg] = "Formulář byl odeslán.";
}
?>



kontakt-poptavka.php
<?php include "app/formular-app.php"; ?>
<?php include "header.php";?>

  <h1>ZADAT POPTÁVKU</h1>

  <p>
    V případě Vašeho zájmu o cenovou nabídku prosím vyplňte jednoduchý formulář s popisem poptávky a vašimi kontaktními informacemi. Vaši poptávku zpracujeme a budeme Vás co nejdříve kontaktovat.
  </p>
  <p>
    K dotazníku je možné přiložit až dva soubory.
  </p>

  <?
    if(IsSet($_SESSION[msg])) {
      echo "<p style=\"text-align: center; font-weight: bold; font-size: 18px; color: #d6b916;\">$_SESSION[msg]</p>";
      unset($_SESSION[msg]);
    }

  ?>

  <form method="post" enctype="multipart/form-data" action="kontakt-poptavka.php">
    <table class="l-poptavka">
      <tr><td class="nadpis">Jméno / Název firmy:</td></tr>
      <tr><td><input type="text" name="nazev" class="poptavka-input" <? ;if($_SESSION[err_nazev]=="ano") {echo "style=\"border: 1px solid #ff0000;\""; unset($_SESSION[err_nazev]);} ?> /></td></tr>
      <tr><td class="nadpis">Telefon:</td></tr>
      <tr><td><input type="text" name="telefon" class="poptavka-input" /></td></tr>
      <tr><td class="nadpis">E-mail:</td></tr>
      <tr><td><input type="text" name="email" class="poptavka-input" <? if($_SESSION[err_email]=="ano") {echo "style=\"border: 1px solid #ff0000;\""; unset($_SESSION[err_email]);} ?> /></td></tr>
      <tr><td class="nadpis">Předmět poptávky (např. RD, hala, <br> garáž, atd.):</td></tr>
      <tr><td><input type="text" name="predmetpoptavky" class="poptavka-input" /></td></tr>
      <tr><td class="nadpis">Místo stavby (např. obec, město):</td></tr>
      <tr><td><input type="text" name="misto" class="poptavka-input" <? if($_SESSION[err_misto]=="ano") {echo "style=\"border: 1px solid #ff0000;\""; unset($_SESSION[err_misto]);} ?> /></td></tr>
    
    </table> 
    <table class="p-poptavka">
      <tr><td class="nadpis">Zpráva - popis poptávky:</td></tr>
      <tr><td><textarea name="popis" class="popis" cols="20" rows="30" <? if($_SESSION[err_popis]=="ano") {echo "style=\"border: 1px solid #ff0000;\""; unset($_SESSION[err_popis]);} ?>></textarea></td></tr>
      <tr><td class="nadpis">Uvažovaná střešní krytina<br> (tašky, plech atd.):</td></tr>
      <tr><td><input type="text" name="krytina" class="poptavka-input" /></td></tr>
      <tr><td class="nadpis">Uvažovaný podhled (SDK atd.):</td></tr>
      <tr><td><input type="text" name="podhled" class="poptavka-input" /></td></tr>
    </table>

    <div class="cleaner"></div>
    
    <table class="l-poptavka">
      <tr><td class="nadpis">Nahrát soubory:</td></tr>
      <tr><td><input type="file" class="input-soubor" name="soubor1" size="40" /></td></tr>
      <tr><td><input type="file" class="input-soubor" name="soubor2" size="40" /></td></tr>
    </table>
    
    <div class="cleaner"></div>
    
    <div>
      <input type="hidden" name="odeslymail" />
      <input type="submit" style="display: none;" name="robot" />
      <input type="submit" class="poptavka-submit" name="odeslatformular" value="&nbsp;" />
    </div>
  </form>

  
<?php include "footer.php"; ?>
Davex
Profil
I když to vypadá docela ošklivě, tak to funguje skoro dle očekávání.

Jak se to nefungování projevuje a zobrazuje se nějaká chyba? Je zapnuté zobrazování chyb PHP? Neskončí e-mail ve spamu?
shaman171
Profil
Chybu to žádnou nenapíše (zřejmě není zapnuté zobrazování, pokusím se to nějak zapnout). Ukáže to, že formulář byl odeslán, ale e-mail už nedorazí. A neskončí ani ve spamu.


Tak po tom co jsem si zapnul vypisování chyb to píše tyhle:
Notice: Use of undefined constant odeslymail - assumed 'odeslymail' in /home/xxx/www/app/formular-app.php on line 7
Notice: Use of undefined constant msg - assumed 'msg' in /home/xxx/www/zadat-poptavku.php on line 16
Notice: Use of undefined constant err_nazev - assumed 'err_nazev' in /home/xxx/www/zadat-poptavku.php on line 26
Notice: Undefined index: err_nazev in /home/xxx/www/zadat-poptavku.php on line 26
/>
Notice: Use of undefined constant err_email - assumed 'err_email' in /home/xxx/www/zadat-poptavku.php on line 30
Notice: Use of undefined constant err_misto - assumed 'err_misto' in /home/xxx/www/zadat-poptavku.php on line 34
Notice: Undefined index: err_misto in /home/xxx/www/zadat-poptavku.php on line 34
<b>Notice</b>:  Use of undefined constant err_popis - assumed 'err_popis' in <b>/home/xxx/www/zadat-poptavku.php</b> on line <b>39</b><br />
<br />
<b>Notice</b>:  Undefined index:  err_popis in <b>/home/xxx/www/zadat-poptavku.php</b> on line <b>39</b><br />
>
Osobně absolutně netuším co je špatně.
peta
Profil
shaman171:
$_POST[odeslymail]
Bez apostrofu je to konstanta odeslymail, ta se definuje pres define (http://cz2.php.net/define). Takze, vsude dopln apostrofy, jak to ma byt a uz tam nedavej nedefinovane konstanty. Viz manual, example 1 $_POST["name"] http://cz2.php.net/manual/en/reserved.variables.post.php
Davex
Profil
shaman171:
Tak po tom co jsem si zapnul vypisování chyb to píše tyhle:
To nejsou chyby, ale jen upozornění, které většinou nemají zásadní vliv na funkčnost. Jména skriptů a čísla řádků s chybami neodpovídají uvedenému zdrojovému kódu, takže by chyba mohla být i v tom.

Stálo by za pokus testovat úspěšnost odeslání.

(skript formular-app.php od řádku 52 až 59)
  ini_set("display_errors", 1); // zobrazit chyby PHP jen při ladění
  error_reporting(E_ALL);
  
  if(trim($novynazev2) != "" AND trim($nazev2) != "") {
    $odeslano1 = extra_mail($prijemce, $odesilatel, "Poptavka 1/2", $obsah, $nazev, $novynazev);
    $odeslano2 = extra_mail($prijemce, $odesilatel, "Poptavka 2/2", $obsah, $nazev2, $novynazev2);
    $odeslano = ($odeslano1 && $odeslano2);
  }else{
    $odeslano = extra_mail($prijemce, $odesilatel, "Poptavka", $obsah, $nazev, $novynazev);
  }
  
  if ($odeslano) {
    $_SESSION["msg"] = "Formulář byl odeslán.";
  } else {
    $_SESSION["msg"] = "Chyba! Údaje z formuláře se nepodařilo odeslat e-mailem.";
  }
shaman171
Profil
peta: díky, pokusím se to opravit si to

Davex: super! moc děkuju, dodal jsem to tam, blbý je, teda né blbý, ale nastavil jsem jinej doručovací mejl a začalo to záhadně zase chodit, skoro si myslím, že byl problém, že původní mejl na který to bylo posílané to z nějakého důvodu přestal přijímat, zvláštní je, že to opravdu nechodí do spamu ani nikam jinam.
Zatím se mi ale nepodařilo přivodit situaci, kdy by to napsalo, že to nedokázalo odeslat. Mockrát děkuju! Už to zase funguje!

Ještě bych měl jeden dotaz. Můžete mi prosím poradit, jak můžu v tom formuláři udělat takové ty zatrhávací pole, případně, takové ty kolečka na výběř třeba muž, žena a rozbalovací seznamy na výběr více věcí?
A ještě, zda jde nějak jednoduše vyrobit formulář, který by byl jakoby dynamický? Zkusím připodobnit modelovou situaci:
První otázka by byla: Snidáte? a jako odpověď by bylo takové to na výběr ano nebo ne (ty kolečka)
No a pokud by dal člověk ano, tak by se zobrazila nějaká část jiná dotazníku, kde by třeba mohl zatrhnout, že snídá rohlík, chleba, housku nebo něco jiného a třeba by to tam napsal.
a když by klikl na ne, tak by tam bylo třeba na výběr z rozbalovacího seznamu například "nemám na to čas", další položka "ráno nemám hlad", "atd..."
Plus samozřejmě odeslání toho dotazníku na mejla.

Nejsem si jistý, zda je to z toho patrné.
Díky moc za každou radu! Případně nasměrování.

EDIT://
Teď jsem narazil na další problém, když tím formulářem pošlu přílohu, např. pdfko tak mi přijde, ale nejde otevřít, že je poškozené. To mi také dřív nedělalo.
rafej
Profil
A určitě ti to předtím fungovalo? Vyzkoušel jsi předtím posílat všechny typy příloh?
Odhaduju, že mohlo dojít i ke změně v konfiguraci hostingu - zákaz některých funkcí, vypnutí short open tags apod.

Jinak k té původní e-mailové adrese - nebyla náhodou na Seznamu? Teď jsem musela změnit e-mail, protože Seznam mi požíral e-maily. Od loňského podzimu mají natvrdo zapnutý antispam, který nejde vypnout ani nastavit a detekce nic moc.
shaman171
Profil
rafej: jj fungovalo, tím jsem si jistej, posílalo se to na firemní e-mail, takže tam se spamem problém nebyl, teď to posílám na hotmail a tam se to posíla bez problémů
Ve své podstatě se přes to posílají jen PDF, JPG a DWG všechny jsou zkoušel teď i dřív a dorazí poškozené.
BTW: S e-mailem od seznamu mám teď taky problémy ohledně požírání mailů, kéž bych si tam e-mail nikdy nezaložil...,ale to je na jiné povídání
sjiamnocna
Profil
Že se tak vměšuji do debaty: ty přílohy - máš správně nastaveno kódování hlavičky?
___
pardon, vidím máš.

Kolečka (přepínače) se jmenují radio button (type="radio") - je jen jedna možná varianta
a křižky jsou checkboxy - je možno vybrat více možností:
Snídáte?<br/>
<input type="radio" name="snidate" value="y">Ano
<input type="radio" name="snidate" value="n">Ne
Kdy snídáte?
<input type="checkbox" value="rano" name="kdysnidate[]" checked="checked">před 7. hodinou
<input type="checkbox" value="rano" name="kdysnidate[]">před 9. hodinou
<input type="checkbox" value="rano" name="kdysnidate[]">dopoledne, jak se mi zachce
na maily je nejlepší gmail, na seznam se dávají jen fake maily a důchodci, mimo to nemá tak rozvinutý systém jako google :p :D :)
shaman171
Profil
sjiamnocna: moc díky! pokusím se si s tím nějak pohrát abych docílil toho čeho chci v tom formuláři
Můžu se zeptat ještě na výběr ze seznamu?

EDIT:// to už jsem zjistil, já jsem věrný mrkvosoftu :-D ale mám i gmail a je pravda, že ten je asi nejspolehlivější
rafej
Profil
shaman171:
V tom prvním skriptu v poli $mimetypes vůbec nemáš koncovku DWG, takže to nikdy fungovat nemůže. Navíc to pole vůbec nedefinuje, co se má zapsat do mime typu, pokud se jedná o jiný typ souboru, který v poli uveden není.

Ostatní typy JPG a PDF tam sice jsou, ale v kódu, který jsi vložil není ošetřeno, aby se koncovka souboru porovnávala s polem mime typů se stejnou velikostí písmen. Pokud má soubor odesílaný uživatel koncovku psanou jinak než malými písmeny (velkými, první velké nebo jiná kombinace), tak se v poli shoda nenajde,
$mimetypes[$typ] = undefined, => fce dej_mime vrací undefined => $type = undefined =>
když pak vkládáš $type do hlavičky e-mailu, místo vypsání mime typu, dostaneš undefined => překonvertováno PHP na prázdný řetězec.

Řešení:
$typ = strtolower(substr($jmeno_souboru, $pozice + 1 , strlen($jmeno_souboru) - $pozice));

A ještě bych se zkontrolovala pomocí var_dump, co přesně vypisují proměnné $odeslano1 a $odeslano2.


sjiamnocna:
na maily je nejlepší gmail, na seznam se dávají jen fake maily a důchodci

Jsi mě pobavil. V současné době máš docela pravdu, ale já zakládala e-mail před deseti lety. To ještě žádný gmail nebyl.
shaman171
Profil
rafej:
Tak jsem tam ten jeden řádek přehodil, tak to otestuju. Moc díky!
Můžeš mi prosím poradit ještě jak si to vypsat pomocí toho var_dump?
Děkuju :)

Jen abych přispěl do diskuze k e-mailu, taky mám seznamáckej jen proto, že v té době jiný v podstatě nebyl.

EDIT:// Tak jsem to testnul, a odeslal jsem si dvě různá pdfka (obě mají koncovku malýma písmenkama) jedno jsem bez problémů zobrazil, druhé dorazilo poškozené.
Tak teď jsem testoval ještě další PDF (úspěšně) a DWG a to neúspěšně.

EDIT2://
Tak jsem si s tím teď celé dopoledne ještě hrál a zjistil jsem následující.
Udělal jsem si testovací soubory pdf1 a pdf2 a dwg.
Když odešlu formulář jen s textem bez příloh, tak mi na mejl dorazí nejspíš bez připojené hlavičky, takže je kompletně nečitelný díky tomu, že písmenka co obsahují diakritiku jsou zaměněná za nějaké jiné nerozluštitelné znaky.
Když odešlu s jakoukoliv přílohou, tak se to zobrazí bez problémů a čitelný a dorazí včetně přílohy, ale příloha je v 99% poškozená.
Pak jsem zkoušel různé kombinace souborů.
1. soubor - PDF
2. soubor - DWG
Dorazí oboje nepoužitelný
1. soubor - DWG
2. soubor - PDF
PDF použitelný, DWG nepoužitelný
1. soubor - PDF
2. soubor - PDF
Oboje nepoužitelný
Následně jsem zkoušel různě odesílat JPG soubory, rovněž neúspěšně.

Absolutně to nechápu :-D funguje si to jak chce. Jediné pozitivum je, že to vždy dorazilo, tedy odesílání funguje.
Ještě bych se rád zeptal, zda by bylo složité to rozšířit na tři možné odeslané soubory?
rafej
Profil
var_dump($nejakaPromena);
Používá se pro kontrolu obsahu proměnné v daném místě skriptu. Je lepší než echo protože vypisuje i typ obsahu, počet znaků a obsah, navíc narozdíl od echa ti vypíše i obsah pole, boolean (true/false), a prázdné řetězce.
Po kontrole a zprovoznění skriptů to opět odstraníš!

Vlož na řádek č. 5 souboru funkce.php toto: var_dump($typ) a zkontroluj co ti vypíše na obrazovku. Měla by tam být koncovka z názvu souboru přílohy a malým písmem!
A totéž kolem proměnné $type, než ji vypíšeš do header e-mailu, pro kontrolu zda vypisuješ mime typ a ne prázdný řetězec.

Doplň do pole $mime_types toto

'dwg' => 'application/acad',

chybělo ti to v seznamu příloh, takže ti soubory DWG nemohly fungovat.

A ještě mě napadá, jestli voláš funkci dej_mime pro obě přílohy. Nevolá se náhodou jen pro první přílohu a druhá zůstane bez mime typu?
shaman171
Profil
rafej:
Tak pokusil jsem se udělat co jsi psala, a vypsalo mi to po napsání var_dump($typ); na 5. řádek tohle:
string(3) "pdf" string(3) "pdf"

Pokud napíšu na řádek 94 var_dump($type); tak to vypíše tohle:
string(15) "application/pdf" string(15) "application/pdf"

Snad jsem to udělal dobře.

Do toho pole jsem to doplnil.
To netuším jestli to volám pro obě přílohy, jak to zjistím?

Moc díky za to, že mi pomáháte!

EDIT:// Teď jak jsem to testoval, jsem ten formulář odeslal několikrát a pokaždé dorazila v pořádku jen první příloha. To by mohlo znamenat, že se ta funkce volá jen pro první přílohu né? Ale netuším jak to opravit, aby to volalo i pro druhou.
Teď jsem to ale ještě zkoušel s tím DWG a odeslal jsem si jedno DWGčko jako první soubor i druhý soubor a neotevřel jsem ani jeden, oba dorazily poškozené. Přestože v tom poli už to mám zanesené.
rafej
Profil
shaman171:
To netuším jestli to volám pro obě přílohy, jak to zjistím?
Pokud se obsah proměnné $typ a výsledek fce dej_mime vypsaly po použití var_dump 2x, jak jste sám psal, tak by se to teoreticky mělo provádět pro obě přílohy. S jistotou vám to samozřejmě neřeknu, to bych musela vidět kompletní kód a otestovat to.

To, co popisujete je divné. Je možné, že je chyba někde jinde, anebo to vůbec nemusí souviset se skriptem a problém může způsobovat server, který vám doručuje poštu nebo váš e-mailový klient (pokud ho používáte).
Jediné, co by ještě mohlo pomoct, je dát k dispozici ty testovací e-maily, které jste zkoušel posílat. Jeden, který bude v pořádku a druhý poškozený pro srovnání. Uložte je jako txt soubor a pak bude možné v textu zjistit, zda e-maily dojdou již poškozené a co jim chybí, nebo zda blbne jen zobrazování / otvírání.
shaman171
Profil
rafej:
Vložím sem znovu celý kód tak, jak vypadá teď. Plus testovací mejly.

zadat-poptavku.php
<?php include "app/formular-app.php"; ?>
<?php include "header.php";?>

  <h1>ONLINE POPTÁVKA</h1>

  <p>
    V případě Vašeho zájmu o cenovou nabídku prosím vyplňte tento online formulář s popisem poptávky a vašimi kontaktními informacemi. Vaši poptávku zpracujeme a budeme Vás co nejdříve kontaktovat.
  </p>
  <p>
    K dotazníku je možné přiložit dva soubory. Nejlépe přiložte stavební půdorys a řez stavby, případně půdorys střechy.
  </p>

  <?

    if(IsSet($_SESSION[msg])) {
      echo "<p style=\"text-align: center; font-weight: bold; font-size: 18px; color: #d6b916;\">$_SESSION[msg]</p>";
      unset($_SESSION[msg]);
    }

  ?>

  <h2>Zadávací list cenové poptávky</h2>
  <p>
  Pole označená hvězdičkou jsou povinná.
  </p>
<form method="post" enctype="multipart/form-data" action="zadat-poptavku.php">  
<table class="l-poptavka">
  <h3>
    1. Informace o poptávajícím:
  </h3>                                       
  <tbody>
    <tr>
      <td class="nadpis">Jméno nebo firma*: </td>
      <td style="padding-left: 20px"><input type="text" name="jmeno" class="poptavka-input" <? ;if($_SESSION[err_jmeno]=="ano") {echo "style=\"border: 1px solid #ff0000;\""; unset($_SESSION[err_jmeno]);} ?> /></td>
    </tr>
    <tr>
      <td class="nadpis">Kontaktní osoba: </td>
      <td style="padding-left: 20px"><input type="text" name="kontaktniosoba" class="poptavka-input" /></td>
    </tr>
    <tr>
      <td class="nadpis">Telefon*: </td>
      <td style="padding-left: 20px"><input type="text" name="telefon" class="poptavka-input" <? ;if($_SESSION[err_telefon]=="ano") {echo "style=\"border: 1px solid #ff0000;\""; unset($_SESSION[err_telefon]);} ?> /></td>
    </tr>
    <tr>
      <td class="nadpis">E-mail*: </td>
      <td style="padding-left: 20px"><input type="text" name="email" class="poptavka-input" <? if($_SESSION[err_email]=="ano") {echo "style=\"border: 1px solid #ff0000;\""; unset($_SESSION[err_email]);} ?> /></td></td>
    </tr>
  </tbody>
</table>
<div class="cleaner"></div>
<br>
<table class="l-poptavka">
  <h3>
    2. Informace o stavbě:
  </h3>
  <tbody>
    <tr>
      <td class="nadpis">Předmět poptávky( např. RD, hala, garáž, atd.): </td>
      <td style="padding-left: 20px"><input type="text" name="predmetpoptavky" class="poptavka-input" /></td>
    </tr>
    <tr>
      <td class="nadpis">Místo stavby* (např. jméno obce, města): </td>
      <td style="padding-left: 20px"><input type="text" name="misto" class="poptavka-input" <? if($_SESSION[err_misto]=="ano") {echo "style=\"border: 1px solid #ff0000;\""; unset($_SESSION[err_misto]);} ?> /></td>
    </tr>
    <tr>
      <td class="nadpis">Předpokládaný termín dodávky (montáže) střechy: </td>
      <td style="padding-left: 20px"><input type="text" name="termin" class="poptavka-input" /></td>
    </tr>
  </tbody>
</table>
<div class="cleaner"></div>
<br>

  <h3>
    3. Informace o tvaru střechy:
  </h3>
  <table class="l-poptavka">
    <tr>
      <td class="nadpis">Tvar střechy (valbová, sedlová, pultová atd.):
        <br>
        <input type="text" name="tvarstrechy" class="poptavka-input" />
      </td>  
      <td class="nadpis" style="padding-left: 50px">Šířka zdiva (Šz):
        <br>
        <input type="text" name="sirkazdiva" class="poptavka-input"/>
      </td>
    </tr>
    <tr>
      <td class="nadpis">Typ okapního detailu (z obrázku níže):
      <br>
      <select size="1"  name="typokapnihodetailu">
                         
        <option value="nezadano">vyberte číslo detailu</option>
                         
        <option value="1">1 </option>
                         
        <option value="2">2 </option>
                         
        <option value="3">3 </option>
                         
        <option value="4">4 </option>
                         
        <option value="5">5 </option>
                         
        <option value="6">6 </option>
                         
      </select>
     </td>
      <td class="nadpis" style="padding-left: 50px">Sklon střechy (ve stupních):
      <br>
      <input type="text" name="sklon" class="poptavka-input" />
     </td>
     </tr> 
     <tr>
      <td class="nadpis">Přesah střechy (Ps):
      <br>
      <input type="text" class="poptavka-input"  name="presahstrechy" /></td>
      <td class="nadpis" style="padding-left: 50px">Výška okapu od terénu:
      <br>
      <input type="text" class="poptavka-input"  name="vyskaokaputeren" /></td>
     </tr>
     <tr>
      <td class="nadpis">Výška okapu (h):
      <br>
      <input type="text" class="poptavka-input" name="vyskaokapuvazniky" /></td>
      <td class="nadpis" style="padding-left: 50px">Vyzděné štíty (na sedlové střeše):
      <br>Ano 
        <input type="radio" checked="checked" value="ano" name="stity" />
        Ne 
        <input type="radio" value="ne" name="stity" /></td>
     </tr>
  </table>
<div class="cleaner"></div>
<br>
<img width="634" height="306" border="0" src="../img/okap_detaily.png" title="okapní detaily" alt="okap_detaily.png" /><br>
<br>
<div class="cleaner"></div>
<table class="l-poptavka">
  <h3>
    4. Zatěžovací údaje:
  </h3>
  <tbody>
    <tr>
      <td class="nadpis">Uvažovaná střešní krytina (tašky, plech atd.): </td>
      <td style="padding-left: 20px"><input type="text" name="krytina" class="poptavka-input" /></td>
    </tr>
    <tr>
      <td class="nadpis">Uvažovaný podhled (SDK atd.): </td>
      <td style="padding-left: 20px"><input type="text" name="podhled" class="poptavka-input" /></td>
    </tr>
    <tr>
      <td class="nadpis">Požadavek na půdní prostor: </td>
      <td style="padding-left: 20px"><input type="text" name="puda" class="poptavka-input" /></td>
    </tr>
    <tr>
      <td class="nadpis">Ostatní zatížení (solární kolektory atd.): </td>
      <td style="padding-left: 20px"><input type="text" name="ostzatizeni" class="poptavka-input" /></td>
    </tr>
  </tbody>
</table>
<div class="cleaner"></div>
<br>
<table class="l-poptavka">
  <h3>
    5. Požadované položky nabídky, text poptávky:
  </h3>
  <tbody>
    <tr>
       <td class="nadpis">Montáž vazníků
       <br>Ano
        <input type="radio" value="ano" name="montaz" />
        Ne 
        <input type="radio" value="ne" name="montaz" /></td>
       <td class="nadpis"  style="padding-left: 20px" rowspan="6">Popis, poznámky:* <br />
       <textarea name="popis" class="popis" cols="45" rows="6" <? if($_SESSION[err_popis]=="ano") {echo "style=\"border: 1px solid #ff0000;\""; unset($_SESSION[err_popis]);} ?>></textarea></td>
    </tr>
    <tr>
      <td class="nadpis">Doprava konstrukce na stavbu
      <br>Ano
      <input type="radio" value="ano" name="doprava" />
        Ne 
        <input type="radio" value="ne" name="doprava" /></td>
    </tr>
  </tbody>
</table>
<div class="cleaner"></div>

    <table class="l-poptavka">
      <tr><td class="nadpis">Nahrát soubory: </td></tr>
      <tr><td><input type="file" class="input-soubor" name="soubor1" size="40" /></td></tr>
      <tr><td><input type="file" class="input-soubor" name="soubor2" size="40" /></td></tr>
    </table>
    
    <div class="cleaner"></div>
    <p>
    V případě, že chcete zaslat více příloh nebo jsou přílohy větší než 5 MB, využíjte náš e-mail: <a href="mailto:lusta@lusta.cz?subject=Poptávka">lusta@lusta.cz</a> 
    </p>
    
    <div>
      <input type="hidden" name="odeslymail" />
      <input type="submit" style="display: none;" name="robot" />
      <input type="submit" class="poptavka-submit" name="odeslatformular" value="&nbsp;" />
    </div>
  </form>

  
<?php include "footer.php"; ?>



funkce.php
<?php

function dej_mime ($jmeno_souboru) {

$pozice = strrpos($jmeno_souboru,'.');
$typ = strtolower(substr($jmeno_souboru, $pozice + 1 , strlen($jmeno_souboru) - $pozice));
//var_dump($typ);

$mimetypes = array(
'doc' => 'application/msword',
'bin' => 'application/octet-stream',
'lha' => 'application/octet-stream',
'exe' => 'application/octet-stream',
'dll' => 'application/octet-stream',
'pdf' => 'application/pdf',
'dwg' => 'application/acad',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'swf' => 'application/x-shockwave-flash',
'tar' => 'application/x-tar',
'zip' => 'application/zip',
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'mp2' => 'audio/mpeg',
'mp3' => 'audio/mpeg',
'm3u' => 'audio/x-mpegurl',
'bmp' => 'image/bmp',
'gif' => 'image/gif',
'ief' => 'image/ief',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'png' => 'image/png',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'xbm' => 'image/x-xbitmap',
'wrl' => 'model/vrml',
'vrml' => 'model/vrml',
'css' => 'text/css',
'html' => 'text/html',
'htm' => 'text/html',
'asc' => 'text/plain',
'txt' => 'text/plain',
'rtx' => 'text/richtext',
'rtf' => 'text/rtf',
'sgml' => 'text/sgml',
'sgm' => 'text/sgml',
'xml' => 'text/xml',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'avi' => 'video/x-msvideo',
'rar' => 'application/rar',
);

return ( $mimetypes[$typ]);
}



function extra_mail($to,$from,$subj,$body,$attach = "", $real_name = "") {

// možná vám není jasný zápis v hlavičce funkce $real_name = ""
// dělá následující: pokud parametr real_name nezadáme, doplní
// to co je za rovnítkem. Vyhneme se tak problému se zadáváním nesprávného
// počtu parametrů

$header = "From: $from\n";
$header .= "MIME-version: 1.0\n";
$header .= "X-Mailer: PHP\n";
$header .= "Content-Type: text/html; charset=utf-8\n";
$header .= "Content-Transfer-Encoding: 8bit\n";
$header .= "Return-Path: <$from>\n";
$header .= "Reply-To: $from\n";

if ( !empty($attach) ) { // když máme nějakou přílohu

// mime.php obsahuje funkci na zjištění MIME podle přípony souboru
// include "mime.php";

// když nezadáme $real_name, bude se příloha jmenovat stejně jako je
// název, který vchází do funkce. To nemusí být vhodné například,
// pokud fci voláme přímo po uploadu souboru (php uploadovaný soubor
// ukládá do definovaného adresáře pod nahodně generovaným názvem
// nebo v případě, že v proměnné $attach je jméno souboru i s cestou

if ( empty($real_name) ) {
$real_name = $attach;
}

// zjištění mime typu vznikající přílohy
$type = dej_mime ($real_name);
//var_dump($type);

// načteme přílohu
$f = fopen ($attach,"r");
if (!$f) {
exit ("Nelze otevrit prilohu - koncime");
}

$attach_obsah = fread ($f,filesize ($attach));

// překódujeme obsah přílohy do base64, je vhodné použít i fci chunk
$attach_obsah = chunk_split (base64_encode ($attach_obsah));

fclose ($f);

// připravíme hlavičky (příloha bude přímo v nich)!!!

// vygenerování boundary (hranice), musí to být řetězec, který se nebude
// vyskytovat nikde v textu. Dále vytvoříme úvod mailu, v kterém
// určujeme, že mail má více částí vzájemně oddělených pomocí boundary

$boundary = strtoupper(md5(uniqid("bound_")));
$header .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n\n";
$header .= "This is a multi-part message in MIME format.\n\n";

// hranicí oddělíme úvod
$header .= "--" . $boundary . "\n";

// první část mailu obsahuje běžné tělo mailu, zakódované
$header .= "Content-Type: text/plain; charset=\"utf-8\"\n";
$header .= "Content-Transfer-Encoding: quoted-printable\n\n";
$header .= imap_8bit($body) . "\n\n";

// hranicí určíme, že následuje další část emailu
$header .= "--" . $boundary . "\n";

// dalsi cast mailu - přidáme hlavičky na kódování, mime a přílohu
$header .= "Content-Type: " . $type . "\n";
$header .= "Content-Transfer-Encoding: base64\n";
$header .= "Content-Disposition: attachment; filename=\"$real_name\"\n\n";
$header .= $attach_obsah . "\n\n";

// hranicí ukončíme mail (na konci ještě musí být --)
$header .= "--" . $boundary . "--";
}
else { // email bez přílohy. Pouze zakódujeme a přidáme příslušnou hlavičku
$header .= "Content-Type: text/plain; charset=\"utf-8\"\n";
$header .= "Content-Transfer-Encoding: quoted-printable\n\n";
$header .= imap_8bit($body) . "\n\n";
}

// a vygenerované pošleme
return (mail ($to,$subj,"",$header));

}
?>

formular-app.php
<?php

session_start();
include "fce/funkce.php";

if(IsSet($_POST[odeslymail])) {
  if(IsSet($_POST[robot]))  {
    header("location: http://www.lusta.cz");
    exit;
  }
  
  if(trim($_POST[jmeno])=="") {
    $_SESSION[err_jmeno] = "ano";
  }
 
   if(trim($_POST[telefon])=="") {
    $_SESSION[err_telefon] = "ano";
  }
  
  if(trim($_POST[email])=="") {
    $_SESSION[err_email] = "ano";
  }
  
  if(trim($_POST[popis])=="") {
    $_SESSION[err_popis] = "ano";
  } 

  if(trim($_POST[misto])=="") {
    $_SESSION[err_misto] = "ano";
  }
    
  if( $_SESSION[err_popis] == "ano" OR $_SESSION[err_email] == "ano" OR $_SESSION[err_nazev]=="ano" OR $_SESSION[err_misto]=="ano"  OR $_SESSION[err_telefon]=="ano" ) {
    header("location: http://lusta.cz/zadat-poptavku.php");
    exit;
  }
  
  $novynazev = $_FILES[soubor1][name];
  $nazev = $_FILES[soubor1][tmp_name];
  
  $novynazev2 = $_FILES[soubor2][name];
  $nazev2 = $_FILES[soubor2][tmp_name];
  
 $obsah = "
 Přišla poptávka na internet:
 1. Informace o poptávajícím:
      Jméno / Název firmy: $_POST[jmeno]
      Kontaktní osoba: $_POST[kontaktniosoba]
      Telefon: $_POST[telefon]
      E-mail: $_POST[email]
 
 2. Informace o stavbě        
      Předmět poptávky: $_POST[predmetpoptavky]
      Místo stavby: $_POST[misto]
      Předpokládaný termín realizace: $_POST[termin]
      
3. Informace o tvaru střechy
      Tvar střechy: $_POST[tvarstrechy] 
      Šířka zdiva: $_POST[sirkazdiva] 
      Typ okapního detailu: $_POST[typokapnihodetailu]    
      Sklon střechy: $_POST[sklon]
      Přesah střechy: $_POST[presahstrechy]
      Výška okapu od terénu: $_POST[vyskaokaputeren]
      Výška okapu (poč. výška vazníku): $_POST[vyskaokapuvazniky]
      Vyzděné štíty: $_POST[stity]
      
4. Zatěžovací údaje            
      Krytina: $_POST[krytina]
      Podhled: $_POST[podhled]
      Požadavek na půdní prostor: $_POST[puda] 
      Ostatní zatížení: $_POST[ostzatizeni] 

5. Požadované položky nabídky, text poptávky:
      Montáž vazníků: $_POST[montaz] 
      Doprava na stavbu: $_POST[doprava] 
      Zpráva - popis poptávky:
      $_POST[popis]";
                                                        



  $prijemce =  "muj-mejl@hotmail.cz";
  $odesilatel = "robot@lusta.cz";
 
if(trim($novynazev2) != "" AND trim($nazev2) != "") {
    $odeslano1 = extra_mail($prijemce, $odesilatel, "Poptavka 1/2", $obsah, $nazev, $novynazev);
    $odeslano2 = extra_mail($prijemce, $odesilatel, "Poptavka 2/2", $obsah, $nazev2, $novynazev2);
    $odeslano = ($odeslano1 && $odeslano2);
  }else{
    $odeslano = extra_mail($prijemce, $odesilatel, "Poptavka", $obsah, $nazev, $novynazev);
  }
  
  if ($odeslano) {
    $_SESSION["msg"] = "Formulář byl odeslán.";
  } else {
    $_SESSION["msg"] = "Chyba! Údaje z formuláře se nepodařilo odeslat e-mailem.";
  }
} 
?>
  
  

Tady jsem nahrál ty všechny různý mejly, jsou pojmenované podle toho jak jsem to odesílal. Ještě mě napadá, jestli nemůže mít vliv to, když příloha toho formuláře je pojmenovaná včetně diakritiky? Protože takové soubory podle mě dojdou blbě pokaždý a navíc jejich jméno je nečitelný.
Tady jsem dal e-maily

Moc díky!
Davex
Profil
Nezkoušel jsem to, ale ve skriptu funkce.php by asi neměly být řádky 75 a 76, které duplikují hlavičku, která se nastavuje později podle toho, jestli je e-mail z přílohou nebo bez přílohy.
shaman171
Profil
Davex:
Díky moc, to vyřešilo problém, když se poslal formulář bez přílohy, tak dorazil nečitelný. Teď už dorazí vždy čitelný. Problém je stále příloha. Furt nechodí čitelná.
Díky moc!

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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