Autor Zpráva
Prefin
Profil
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
Jestli se nepletu tak to znamená pokus o deklaraci už deklarované třídy?
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();
Funkce na odeslání emailu:
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;
}
Fce OdesliEmailPoskytovatel() je podobná a samostatně funguje taky spolehlivě.
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
Je to kvůli:
require "absolutni_cesta/class.phpmailer.php";
Tím, že se funkce zavolá podruhé, i tento řádek se zavolá podruhé a tím se objevuje ta druhá definice. Takže buď require třeba na začátek scriptu, aby se to neprovádělo vícekrát, nebo ve funkci použít require_once.
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.

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: