Stránka 1 z 1

PHP meil s přílohou...

Napsal: sob 11. úno 2012, 02:03
od Václav Sedlář
Dobrý den, potřebuji v php udělat odesílání meilu s přílohou (pdf)...našel jsem si návod zde: http://www.builder.cz/art/web/emailsprilohou.html

ale bohužel to nefunguje-při pokusu o odeslání mi to vytíží procesor na 50% a zablokuje php (vertrigoserv), takže ho musím restartovat...

Normální odeslání meilu bez přílohy funguje...

Jediný co jsem v návodu změnil bylo pevné nadefinování mime a odstraněny některé podmínky...níže dávám kod:

Toto nefunguje:

Kód: Vybrat vše


function poslatMeil($from,$to,$subject,$zprava,$attach){

$header = "From: $from\n"; 
 $header .= "MIME-version: 1.0\n"; 
 $header .= "X-Mailer: PHP\n"; 
 $header .= "Return-Path: <$from>\n"; 
 $header .= "Reply-To: $from\n";  

 
 
 $real_name = "pozvanka.pdf"; 
 

 // zjištění mime typu vznikající přílohy 
 $type = 'application/pdf'; 

 // 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: base64\n\n"; 
 $header .= base64_encode($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"; 
 $predmet = "=?utf-8?B?".base64_encode($predmet)."?=";
 // hranicí ukončíme mail (na konci ještě musí být --) 
 $header .= "--" . $boundary . "--"; 
  mail ($to,$predmet,"",$header);

}
Moc prosím o pomoc...díky...

Re: PHP meil s přílohou...

Napsal: sob 11. úno 2012, 02:17
od Václav Sedlář
AHA, už to funguje...zachránilo mě toto:

http://www.z-moravec.net/php_learn/lib/ ... chment.php

Snad je ten postup bezpečný/ne moc zastaralý...

Re: PHP meil s přílohou...

Napsal: sob 11. úno 2012, 10:53
od TomTom
Mno nevim, nebude lepší na to použít třeba PHPmailer?
http://code.google.com/a/apache-extras.org/p/phpmailer/

Re: PHP meil s přílohou...

Napsal: sob 11. úno 2012, 16:06
od Václav Sedlář
to jsem zapomněl říct...je to možné použít, ale chtěl jsem zkusit implementovat vlastní fci...

Re: PHP meil s přílohou...

Napsal: úte 14. úno 2012, 20:01
od arxeiss
PHPMailer je super, zkoušel jsem si ho pročíst, a řeší tam opravdu tolik věcí, že to je šílené, po té co jsem si pročetl zdrojáky Maileru vím, že psát svoje opravdu nemá cenu, jenom si tím přihoršíš...

Problém s meilem a přílohou - php

Napsal: ned 11. bře 2012, 13:30
od Václav Sedlář
Dobrý den, mám v php vlastní funkci pro odesílání meilu s přílohou...

Funkce funguje dobře-příloha na meily chodí, ale když pošlu meil s přílohou na můj druhý PC, který je připojen přes jinýho poskytovatele netu, tak zpráva dorazí bez přílohy...

Když např. cílová adresa je xxx@seznam.cz, tak když se podívám do schránky na seznamu, tak tam ta příloha ještě je, ale jakmile přes pop stáhnu meil do thunderbirdu, tak už je to bez přílohy...

Nevím proč to dělá- když to posílám na jiné meily (i přes toho problematického poskytovatele), tak příloha příjde všem, ale jakmile se ten meil stahuje přes tohoto konkrétního poskytovatele, tak to odfiltruje přílohu...

Napadá mě, že se mu třeba nelíbí moje hlavičky, tak uvádím celou mojí funkci v php:

Kód: Vybrat vše


function poslatMeil($from,$to,$subject,$zprava,$attachment_name){
    if($_SESSION['prihlasen']==1){
      if($attachment_name!=""){
        if($attachment_name[strlen($attachment_name)-5]=='a'){
          $attachment_name2="pozvanka.pdf"; 
        }else{
          $attachment_name2="oznameni.pdf"; 
        }
      
        $fp = FOpen ($attachment_name, 'r'); 
        $contents = FRead ($fp, FileSize($attachment_name)); 
        $contents = Chunk_Split(Base64_Encode($contents)); 
        FClose ($fp); 
     
        //$subject = 'Email s prilohou'; 
  
        $headers = "From: ".$from."\n";  
        $headers .= "Reply-To: <".$from.">\n"; 
        $headers .= "MIME-Version: 1.0\n"; 
        $headers .= "Content-Type: multipart/related; type=\"multipart/alternative\"; boundary=\"" 
                   ."----=MIME_BOUNDRY_main_message\"\n"; 
        $headers .= "X-Sender: Odesilatel <".$from.">\n"; 
        $headers .= "X-Mailer: PHP4\n"; 
        $headers .= "X-Priority: 3\n"; //Priorita emailu 1 = Urgentni, 3 = Normalni 
        $headers .= "Return-Path: <".$from.">\n"; 
        $headers .= "This is a multi-part message in MIME format.\n"; 
        $headers .= "------=MIME_BOUNDRY_main_message \n"; 
        $headers .= "Content-Type: multipart/alternative; boundary=\"" 
                   ."----=MIME_BOUNDRY_message_parts\"\n"; 
      
        $message = "------=MIME_BOUNDRY_message_parts\n"; 
        $message .= "Content-Type: text/plain; charset=\"utf-8\"\n"; 
        $message .= "Content-Transfer-Encoding: quoted-printable\n"; 
        $message .= "\n"; 
        $message .= "\n"; 
        $message .= $zprava."\n"; 
        $message .= "------=MIME_BOUNDRY_message_parts--\n"; 
        $message .= "\n"; 
        $message .= "------=MIME_BOUNDRY_main_message\n"; 
        $message .= "Content-Type: application/pdf;\n\tname=\"" . $attachment_name . "\"\n"; 
        $message .= "Content-Transfer-Encoding: base64\n"; 
        $message .= "Content-Disposition: attachment;\n\tfilename=\"" . $attachment_name2 . "\"\n\n"; 
        $message .= $contents; //Zakodovana priloha 
        $message .= "\n"; 
        $message .= "------=MIME_BOUNDRY_main_message--\n";
            
        mail($to, $subject, $message, $headers);
    
      }else{
        $hlavicka = "MIME-Version: 1.0\n";
        $hlavicka .= "Content-type: text/html; charset=utf-8\n";
        $hlavicka .= "Content-Transfer-Encoding: base64\n";
        $hlavicka .= "From: ".$from."\n"; 
        $predmet=$subject;
        $predmet = "=?utf-8?B?".base64_encode($predmet)."?=";
        $zprava64 = base64_encode($zprava); 
        mail($to,$predmet,$zprava64,$hlavicka);  
      }
    }                                        
  }


děkuji za pomoc


// OndraSter - sloučeno

Re: PHP meil s přílohou...

Napsal: ned 11. bře 2012, 17:37
od Smith
Proč vymyšlet kolo, když je tu phpmailer a frameworky?

Re: PHP meil s přílohou...

Napsal: ned 11. bře 2012, 19:08
od Václav Sedlář
no do teď to fungovalo dobře...ale čekal jsem tuto odpověď...takže jsem stáhl php mailer a hází mi chybu-nějaký problém s třídou na řádku kde mu vkládám adresu příjemce...večer sem dám výpis chyby...