Autor Zpráva
marvays
Profil
Dobrý den.
Mám eshop na Joomle a VM3. Koupil jsem rozšíření na tvotbu faktur. Toto rozšíření obsahuje možnost zaslání emailu danému zákazníkovi, kliknutím na odkaz v administraci. V emailu se odešle předdefinovaný text a v příloze vygenerovaná faktura.

když jsem toto připravoval na pracovním hostingu, vše šlapalo skvěle. Tento web byl umístěn na wedosu. Když jsem web nahodil na své místo (hosting na Blueboard), vše taky funguje skvěle, jen nejde odesílat email z administrace zákazníkovi. Ale ostatní mailové fukce fungují normálně. Když dorazí nová obejdnávka, z webu mi dorazí info. Firewall mi pravidelně hlásí hlášení a podobně. podle toho, co mi vyskakuje dole v liště (F12) si ymslím, že to bude mít něco společného s ajaxem.
/administrator/index.php?option=com_invoices&controller=invoice&task=send_email&cid[]=25&ajax=1&type=1&_=1520066605777 Failed to load resource: the server responded with a status of 500 ()

Výrobce rozšíření zatím mlčí.
Z blueordu se na to dívali (aspoň to tvrdí) a poslali mi sdělení, že:
"Dobrý den, emailové funkce jsou na doméně vybaveniprovozu.cz v pořádku. Klidně si zeditujte skript testmail.php ve složce www."
Což jsem si zjistil taky, protože na to má joomla svuj nástroj.

Netuším, co může být u blueboardu jiného, že to nefunguje.
Včera jsem udělal opět zálohu ostrého webu, přesunul na wedos a jede jak hodinky.

Jediné,m včem se ty dva hostingy liší je to, že na blueboardu mám zapnutý SSL a je tam jiný .htaccess než mám na wedosu.
Keeehi
Profil
marvays:
Jediné,m včem se ty dva hostingy liší je to, že na blueboardu mám zapnutý SSL a je tam jiný .htaccess než mám na wedosu.
Možné z tvého pohledu, ale jsem si celkem jistý, že servery budou mít různé nastavení.

Nicméně, pokud to blueboard umožňuje podívej se do error logu. Pokud ne, zapni si vypisování všech hlášek a načti danou url. Některé servery při určitém nastavení vracejí 500 pokud se v PHP objeví chyba. Pokud zapneš vypisování chybových hlášek chyba "nenastane" a vypíše se. Podle toho zjistíš, kde je problém.
marvays
Profil
Keeehi:
Podle toho zjistíš, kde je problém.
V administraci Bluebordu jsem nic takového nenašel. Uvidíme, co mi odpoví podpora.
Keeehi
Profil
marvays:
Povolit vypisování chybových hlášek jde i přímo v kódu. Na začátek index.php vlož
error_reporting(E_ALL);
ini_set('display_errors', 1);
Po otestování to zase smaž.
marvays
Profil
GET =25&ajax=1&type=1&_=1520156766602]https://domena.cz/administrator/index.php?option=com_invoices&controller=invoice&task=send_email&cid[]=25&ajax=1&type=1&_=1520156766602 500

send @ jquery.min.js?edecdc…4906a5bc3ee519a64:4
ajax @ jquery.min.js?edecdc…4906a5bc3ee519a64:4
email_invoice @ common.js:219
email @ Invoice.js:104
click @ VM3726:7
invoker @ vue.js:1827
Keeehi
Profil
Tohle není výpis PHP chyby ale záznam toho, jak se vyvolal ten ajaxový požadavek. Navíc to vypadá, že server stále vrací 500 status. Dal jsi to do souboru index.php co je ve složce administrator?
marvays
Profil
Keeehi:
Ano. Kde by se to mělo zobrazit? ta chyba
Keeehi
Profil
Přímo v odpovědi toho ajaxového požadavku.
marvays
Profil
Do index.php v adminsitarci jsem to zapsal takto:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

ale ať se dívám, jak se dívám, nikde žádný výpis nevidím :(
Keeehi
Profil
To, co jsi napsal do [#5] jsi získal kde? Vypadá to jako výpis z nástrojů pro vývojáře co je v prohlížeči. Tam si můžeš zobrazit i obsah odpovědí všech odeslaných požadavků. Tedy i toho ajaxového.
marvays
Profil
jj to je s těch nástrojů vývojáře
marvays
Profil
Takže jsem zjistil další info. Když v komponentě zruším volbu, aby k emailu připojil fakturu v PDF, tak emaily začnou chodit. Jakmlie je nestaveno, že k emailu má být připojena pdf faktura, skript se nedokončí a email neodejde. Wedosu to nevadí, blueboardu ano. nechápu
Tomášeek
Profil
marvays:
Teď na tobě bude si buď najít někoho, kdo zná Joomlu (nebo umí programovat, aby ti to oddebugoval), nebo si to oddebugovat sám.

Není tu ani kousek kódu, se kterým by se dalo pracovat, celý mail modul sem dávat nebudeš.
marvays
Profil
Tomášeek:
Prozatím se to snažím řešit přes hosting. vycházím z toho, že na jednom to jde a na druhém ne. netuším, jak dalece je to chyba autora komponenty a hostingu.
Tomášeek
Profil
marvays:
Hosting ti dle mého sdělí, jaké má nastavení, ale určitě ti to nebude oddebugovávat, ani srovnávat s nastavením na jiném hostingu.

Víš, že problém je někde v tom mailovém scriptu, dokonce v místě, kde se pracuje s přílohou, což je docela dobře lokalizované. Než se dohadovat s podporou, což IMHO k výsledku nepovede, zkusil bych do toho kódu rozestavět pár breakpointů a opravit svépomocí. Měla by to být otázka relativní chvilky (řekněme hodinka, dvě max), to komunikací s podporou ztratíš násobně více času.
marvays
Profil
Tomášeek:
Chápu. Pro mě je to španělská vesnice. Musím někoho najít.
Tady ještě kousek kodu, který se týká odesílání. Možná je chyba ukraty někde tam:
function sendMail(){
        $data = $this->getData();
        
        $params = JComponentHelper::getParams( 'com_invoices' );
        
        $from = $params->get('email_email') ;
        $from_name = $params->get('email_name') ;
        $subject = $params->get('email_subject') ;

        if($data->type == 2){//quote
            $subject = $params->get('email_subject_quote') ;
        }
        
        $subject = str_replace("{invoice_num}", $data->invoice_num, $subject) ;

        $view        = $this->getInvoiceView();
        
        $view->invoice        = $data;
        $view->template        = $this->getTemplate();
        $view->items        = $this->getItems();
        $view->taxes        = $this->getTaxes();
        $view->payments        = $this->getPayments();
        $view->payments2        = $this->getPayments2();
        $view->params        = $params;

        if($view->template->content_email) $view->template->content = $view->template->content_email ;
        
        $view->_path['template'][1] = JPATH_SITE.DS.'components'.DS.'com_invoices'.DS.'views'.DS.'invoice'.DS.'tmpl' ;
        
        $plantilla = 'email' ;
        
        $message = $view->loadTemplate( $plantilla );
        
        $styles = "<style>".$view->template->styles."</style>" ;
        $message = $styles . $message ;
        
        $to = $data->to_email;

        $toBlock = str_replace(" ", "", $to); //Delete spaces between emails
        $toMails = explode(",", $toBlock);

        $mail = JFactory::getMailer();
        $mail->addRecipient($toMails);
        $mail->setsender(array($from, $from_name));
        $mail->setSubject($subject);
        $mail->setbody($message);
        $mail->isHTML(true);

        if($params->get('pdfemail') && InvoicesHelper::PDFavailable()){
            //create PDF
            $viewpdf        = $this->getInvoiceView('dompdf');
            
            $viewpdf->invoice        = $view->invoice    ;
            $viewpdf->template        = $this->getTemplate();
            $viewpdf->items            = $view->items    ;
            $viewpdf->taxes            = $view->taxes    ;
            $viewpdf->payments        = $view->payments;
            $viewpdf->payments2        = $view->payments2;
            $viewpdf->params        = $params;

            if($viewpdf->template->content_pdf) $viewpdf->template->content = $viewpdf->template->content_pdf ;

            $viewpdf->_path['template'][1] = JPATH_SITE.DS.'components'.DS.'com_invoices'.DS.'views'.DS.'invoice'.DS.'tmpl' ;

            if($viewpdf->invoice->invoice_num) $pdfname = $viewpdf->invoice->invoice_num;
            else $pdfname = rand();
            
            $location = JPATH_SITE.DS.$params->get('pdffolder','pdfinvoices').DS.$pdfname . ".pdf" ;

            $pdf = $viewpdf->storepdf($location);

            if($pdf) $mail->addAttachment($location, $viewpdf->invoice->invoice_num . ".pdf") ; 

        }

        $sent = $mail->Send();
        if($sent && $to){
            InvoicesHelper::updateSentDate($data->id);

            //trigger event
            $import = JPluginHelper::importPlugin( 'invoices' );
            $dispatcher = JDispatcher::getInstance();
            $dispatcher->trigger( 'onAfterSendInvoice', array( $data ) );
        }
        return $sent ;
        
    }



Navíc na wedosu, když vygeneruju fakturu, tak se mi uloží do předdefinované složky /pdfinvoices ve formátu 2018-cz00016.pdf
Na blueboardu umím fakturu editovat, umím ji zobrazit a stáhnout v pdf. Ale do dané složky se neuloží. Neuloží se ani nikde jinde. Jen v kořenovém adresáři na hostingu se volně povalují soubory bez koncovky s názem typu ca_dompdf_img_CV3eQO . . . . . .. dompdf je plugin, který generuje ty faktury.

Takže to vypadá, že nelze vygenerovat a zapsat fakturu, přičemž při odesílání se to zastaví na tom, že ji hledáv dané složce a nenachází . . . . proto po čase naskočí 500.
Keeehi
Profil
V tom případě bych se podíval na práva k čtení, zápisu a tvorbě souborů a složek.
Nicméně, debugovat script bez zahnutých chybových hlášení je téměř nemožné. Ne že by to bylo nemožné, ale zabere to násobně více času a vyžaduje to spoustu zkušeností. Může se stát, že opravu chyby náhodou naslepo trefíš, ale je to loterie. Proto by jsi měl nejdříve zprovoznit ten výpis chyb, než se posuneš dále.
marvays
Profil
Keeehi:
Proto by jsi měl nejdříve zprovoznit ten výpis chyb, než se posuneš dále.
O to se snažím. Nevím, co dělám špatně, že to nefunguje :( Nahrál jsem ten kod do třech různých index.php (hlavní v joomle, hlavní v administraci a do indexu v šabloně administrace) ale chyby mi to nikde nevypisuje.
Keeehi
Profil
marvays
Profil
Omlouvám se, asi jsem na to větší trotl, než jsem myslel. Žádnou chybovou hlášku mi to nezobrazuje.
Keeehi
Profil
marvays:
O tom to není, je to jen zkušenostmi. Pokud to děláš poprvé, tak se není čemu divit. Všichni jsme někdy začínali. Co vidíš?
Davex
Profil
marvays:
Žádnou chybovou hlášku mi to nezobrazuje.
Tipuji, že si to nastavení Joomla přenastaví a výpis chyb zase vypne. Obsah konfiguračního souboru Joomly tomu nasvědčuje.

Nejlepší by bylo, nechat si na webserveru zapnout logování chyb PHP do souboru (error_log, log_errors). Změna nastavení na začátku PHP skriptu, např. pomocí ini_set(), může být už pozdě.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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