Autor | Zpráva | ||
---|---|---|---|
Prefin Profil |
#1 · Zasláno: 5. 9. 2012, 09:02:28
Ahojda všichni.
Chtěl bych se zeptat jestli někdo z Vás neměl podobný problém s PHPMailerem, resp. s podobnou situací. Mam vytvořený proces na párování platbe a odesílání určitých věcí klientům. Ve scriptu, který odesílá email s archivy klientům mi trochu občas zlobí PHPMailer chybou: Cannot redeclare class phpmailerException Ve scriptu volám funkci na odeslání emailu dvakrát za sebou. Je možné, že se první odeslání nestihne dokončit než se volá druhé? Jde o to, že v tom není žádná pravidelnost. Parametry jsou v pořádku a u případu, kdy to chybu vyhodí jedno to podruhé neudělá. Script, když neodešle první email pak nesmaže záznam z tabulky a při dalším spuštění scriptu se ten samý případ v pořádku odešle. Script na odeslání poptávky: /* * Odeslání spárovaných nabídek */ session_start(); include "sql_pripojeni.php"; include "funkce.php"; $sql = "SELECT kod_odeslat_poptavku FROM odeslat_poptavku LIMIT 1"; $vysl = mysql_query($sql); if(mysql_num_rows($vysl)!=0) { $vystup=mysql_fetch_assoc($vysl); $sql_poptavka = "SELECT email_poptavka,nabidky_poptavka,jmeno_poptavka,prijmeni_poptavka,kod_poptavka FROM poptavka WHERE kod_poptavka='".$vystup["kod_odeslat_poptavku"]."' LIMIT 1"; $vysl_poptavka = mysql_query($sql_poptavka); $vystup_poptavka=mysql_fetch_assoc($vysl_poptavka); $sql_odstran = "DELETE FROM odeslat_poptavku WHERE kod_odeslat_poptavku='".$vystup_poptavka["kod_poptavka"]."'"; $_SESSION["identifikacni_kod"] = $vystup["kod_odeslat_poptavku"]; $predmet = "Předmět emailu"; $text = "................... "; $c_voucher = mysql_result(mysql_query("SELECT c_voucher_platba FROM platba WHERE kod_poptavka_platba='".$vystup["kod_odeslat_poptavku"]."'"),0); $text .= $c_voucher."..............."; // Vytvoření pole s názvy souborů $pole_nabidky = Explode(",",SubStr($vystup_poptavka["nabidky_poptavka"],0,-1)); for($x=0;$x<count($pole_nabidky);$x++) { echo $prilohy[$x]; $prilohy[$x] = mysql_result(mysql_query("SELECT url_podklady_produkt FROM produkty WHERE id_produkt='".$pole_nabidky[$x]."'"),0); } OdesliEmailNabidky("xxxxxxxx@xxxx",$vystup_poptavka["email_poptavka"],$predmet,$text,$text,$prilohy); // První volání PHPMailer ZapisDoLogu("/\/\/\ Spárována platba (prevod) a odeslán email s nabídkami: ".$vystup_poptavka["jmeno_poptavka"]." ".$vystup_poptavka["prijmeni_poptavka"].", ".$vystup_poptavka["kod_poptavka"].", ".$vystup_poptavka["email_poptavka"].", ".$vystup_poptavka["nabidky_poptavka"].", "); if(OdesliEmailPoskytovatel($vystup_poptavka["nabidky_poptavka"])) mysql_query($sql_odstran); // Druhé volání PHPMailer } include "sql_pripojeni_konec.php"; exit(); function OdesliEmailNabidky($odesilatel,$prijemce,$predmet,$text,$alt_text,$nabidky) { require "absolutni_cesta/class.phpmailer.php"; $mail = new PHPMailer(); $mail->SetLanguage("cz"); // Nastavení českých chybových hlášek $mail->IsSMTP(); // k odeslání e-mailu použijeme SMTP server $mail->Host = "smtp.xxxx.cz"; // zadáme adresu SMTP serveru $mail->SMTPAuth = true; // nastavíme true v případě, že server vyžaduje SMTP autentizaci $mail->Username = "xxxxxxxxxxxxxx"; // uživatelské jméno pro SMTP autentizaci $mail->Password = "xxxxxxxxxxxx"; // heslo pro SMTP autentizaci $mail->From = $odesilatel; // adresa odesílatele skriptu $mail->FromName = "xxxxxxxxxxx"; // jméno odesílatele skriptu (zobrazí se vedle adresy odesílatele) // Přidání příjemce $mail->AddAddress($prijemce); //$mail->AddAddress("druhy.prijemce@example.net", "Jméno druhého příjemce"); $mail->IsHTML(true); // bude to HTML e-mail $mail->Subject = $predmet; // nastavíme předmět e-mailu // nastavíme HTML tělo e-mailu $mail->Body = $text; // nastavíme textové tělo e-mailu $mail->AltBody = $alt_text; $mail->WordWrap = 50; // je vhodné taky nastavit zalomení (po 50 znacích) $mail->CharSet = "utf-8"; // nastavíme kódování, ve kterém odesíláme e-mail // Přidání příloh do emailu for($m=0;$m<count($nabidky);$m++) { $mail->AddAttachment("absolutni_cesta".$nabidky[$m],$nabidky[$m]); } $mail->AddAttachment("absolutni_cesta/Pouceni.zip","Pouceni.zip"); // Přidání obrázku do podpisu emailu $mail->AddEmbeddedImage("./obr/logo.png", "xxxxxxxxxxxxxxxx", "logo.png", "base64", "image/png"); if(!$mail->Send()) { // odešleme e-mail ZapisFatalniChybu("ERROR @@@ chyba pri odeslani emailu: chyba:".$mail->ErrorInfo.", ".$_SESSION["identifikacni_kod"].", ".$prijemce.", ".$nabidky.", "); $kontrola = 'Omluváme se, díky interní chybě se nepodařilo odeslat email.<br>Po eliminaci problému Vám bude email zaslán.'; $kontrola .= 'Chybová hláška: ' . $mail->ErrorInfo; } else { ZapisDoLogu("@@@ Odeslan email s nabidkami: ".$_SESSION["identifikacni_kod"].", ".$prijemce.","); $kontrola = 'E-mail byl v pořádku odeslán.'; } return $kontrola; } Ono se v podstatě nic hrozného nestane, protože když druhé volání PHPMaileru skončí chybou tak se neodstraní záznam z databáze a při dalším spuštění scriptu se odešle znovu - takže klient dostane email dvakrát. Všechny chybovky jsou odkloněny do logu a script je volán cronem každou minutu. Jen bych chtěl potvrdit, že moje domněnka je správná. Díky za čas. |
||
Keeehi Profil |
#2 · Zasláno: 5. 9. 2012, 09:36:16
Je to kvůli:
require "absolutni_cesta/class.phpmailer.php"; |
||
Prefin Profil |
To ne, protože ve fci OdesliEmailPoskytovatel() nevkládám class.phpmailer.php.
Ta se vyskytuje vždy v každém scriptu jako druhé volání phpmaileru, tj. vždy je nejdříve volá OdesliEmail(), kde se vloží třída a později OdesliEmailPoskytovatel() kde už není třeba vkládat. No ale lepší bude volat vždy pomocí require_once, alespoň v tom nebude bordel. Uvidím jestli to pomůže. |
||
Časová prodleva: 12 let
|
0