Autor Zpráva
Prefin
Profil
Ahojda.
Ve scriptíku dole je někde chybka, kterou nějak nejsem schopen odhalit.
Script má z emailovky stahovat zprávy, kontrolovat od koho jsou poslány (zprávu od jiného hned odstraní) a v těle hledat řetězec.
Jedná se o ověření platby - email má obsahovat údaje o platbě (v.s. ...), které se bude spoštět Cronem (10,30,50 * * * * wget ...).
Script jako takovej v podstatě funguje, maže to co má, řetězec najde, udělá úlohy které v tomto případě má. Problém je v tom, že je schopen to udělat v pořádku pouze v prvním průchodu. Při druhém se mu nepodaří načíst tělo zprávy (ř.92).
Zkrátka udělá to bezchybně pouze jeden průchod.
Spojení je v pořádku a id zprávy v imap_uid($imap_spojeni,$x) taky.
Je tam hodně pomocnejch výpisů, které pak odstraním.
Díky moc, už se s tím s... třetí den.
<?php
/*
 * Script který páruje platby podle příchozí
 * pošty pomocí IMAP spojení
 *
 */
include "sql_pripojeni.php";
include "funkce.php";
// Nastavení hodnot
$imap_root = "{pop3.xxxxxxxxxxxx.cz:995/pop3/ssl/novalidate-cert}INBOX";
$imap_email = "xxxxxxxxxxxxxxx";
$imap_pass = "xxxxxxxxxxxxxx";
$predmet = "xxxxxxxxxxxxxxxx";
$text = "xxxxxxxxxxxxxxxxxxx";

// Načtení povolených emailovek do pole
$sql = "SELECT email_uctu FROM ucet";
$vysl = mysql_query($sql);
$i = 0;
while($vystup=mysql_fetch_assoc($vysl)) {
    $pov_email[$i] = $vystup["email_uctu"];
    $i++;
}
// Načtení nezaplacených plateb
$sql = "SELECT id_platba,vs_platba,jmeno_platba,vyse_platba,kod_poptavka_platba FROM platba WHERE zaplaceno_platba='0' and vyse_platba>'0'"; // Načtení nezaplacených plateb
$vysl = mysql_query($sql);
$i = 0;
while($vystup=mysql_fetch_assoc($vysl)) {
    $platba["id"][$i] = $vystup["id_platba"];$platba["vs"][$i] = $vystup["vs_platba"];$platba["jmeno"][$i] = $vystup["jmeno_platba"];$platba["vyse"][$i] = $vystup["vyse_platba"];$platba["kod_poptavka"][$i] = $vystup["kod_poptavka_platba"];
    $i++;
}

// Otevření spojení s IMAP
$imap_spojeni=IMAP_Open($imap_root,$imap_email,$imap_pass);
// Zjištění počtu zpráv
$pocet_zprav = IMAP_Num_Msg($imap_spojeni);
if($pocet_zprav==0) {
    echo "Na serveru nejsou zprávy";
    IMAP_Close($imap_spojeni);
    include "sql_pripojeni_konec.php";
    exit();
}
echo "Počet zpráv: ".$pocet_zprav."<br>";
// Průchod zprávami
for($x=1;$x<=$pocet_zprav;$x++) {
    echo "----------------------------<br>";
    if(IMAP_Ping($imap_spojeni)) echo "Spojení je v pořádku<br>";
    echo "Zpráva číslo: ".$x."<br>";
    $header = imap_header($imap_spojeni, $x);
    $from = $header->from;
    foreach ($from as $id => $object) {
        $frommailbox = $object->mailbox;
        $fromhost = $object->host;
    }
    $prichozi_email = $frommailbox."@".$fromhost;
    echo "Zpráva přišla z ".$prichozi_email."<br>";
    $to = $header->to;
    foreach ($to as $id => $object) {
        $mailbox = $object->mailbox;
        $host = $object->host;
    }
    echo "ID zprávy: ".imap_uid($imap_spojeni,$x)."<br>";
    $reply_toaddress = iconv_mime_decode($header->reply_toaddress,0,"UTF-8");
    // Zjištění zda zpráva přišla z povolených adres. Ostatní je smazáno.
    for($i=0;$i<count($pov_email);$i++) {
        echo $pov_email[$i]." - ".$prichozi_email."<br>";
        if($pov_email[$i]==$prichozi_email) $pokracuj = 1;
    }
    // Smazání zprávy pokud není z povolených emailů
    if($pokracuj!=1) {
        IMAP_Delete($imap_spojeni,$x);
        IMAP_Expunge($imap_spojeni);
        echo "<b>Smazání zprávy $x</b>";
        continue;
    }
    unset($pokracuj);
    // Načtení těla zprávy
    if(!$zprava = IMAP_Body($imap_spojeni,$x)) echo "Nepodařilo se načíst tělo zprávy $x<br>";
    // Průchod polem s platbami
    for($i=0;$i<count($platba);$i++) {
        if(StrPos($zprava,$platba["vs"][$i])) { // Jestliže je variabilní symbol platby obsažen v těle zprávy (ZAPLACENO)
            echo "Nalezeno, zpráva č.$x<br>";
            $sql = "UPDATE platba SET zaplaceno_platba='1' WHERE id_platba='".$platba["id"][$i]."'"; // Označení platby jako zaplacené
            if(mysql_query($sql)) {
                echo "Zpráva č. $x spárována s platbou ".$platba["jmeno"][$i]."<br>";
                $sql_odeslani = "SELECT email_poptavka,nabidky_poptavka FROM poptavka WHERE kod_poptavka='".$platba["kod_poptavka"][$i]."'"; // Získání informací k odeslání nabídek klientovi
                $vysl_odeslani = mysql_query($sql_odeslani);
                while($vystup_odeslani=mysql_fetch_assoc($vysl_odeslani)) {
                    OdesliEmail("xxxxxxxxxxxxxxxxxxxxxxx",$vystup_odeslani["email_poptavka"],$predmet,$text,$vystup_odeslani["nabidky_poptavka"],"neodeslat");
                    ZapisDoLogu("/\/\/\ Spárována platba (prevod) a odeslán email s nabídkami: ".$platba["jmeno"][$i].", ".$platba["kod_poptavka"][$i].", ".$vystup_odeslani["email_poptavka"].", ".$vystup_odeslani["nabidky_poptavka"].", ");
                }
                IMAP_Delete($imap_spojeni,$x);
                if(IMAP_Expunge($imap_spojeni)) echo "Zpráva $x smazána.";
            }
        }
    }
    unset($zprava);
    if(IMAP_Ping($imap_spojeni)) echo "Spojení je v pořádku<br>";
}
IMAP_Close($imap_spojeni);
include "sql_pripojeni_konec.php";
exit();
?>
frantisek.nesveda
Profil
Tak... ty vždycky po přečtení ten email smažeš, ne?
Možná, že se tím ty emaily přečíslují, tzn. z emailu 2 se stane email 1 atd, ale ty ve for cyklu postupně projíždíš emaily od čísla 1 do čísla n, takže při druhém opakování for cyklu se pokoušíš načíst email s číslem dva, ale pokud byly na začátku puštění skriptu ve schránce jen dva maily, tak to havaruje, protože mail číslo 2 už tam není.
Ale to jen spekuluji, s mailovými příkazy jsem v životě nic nedělal.
Prefin
Profil
No to bude možná ono. Nejdřív jsem měl obě IMAP_Expunge() na konci mimo cyklus a mazal všechny označené zprávy najednou, ale z nějakého důvodu to nebylo spolehlivé tak jsem to přesunul hned za označení zprávy což už spolehlivé je, ale IMAP_Body čte při každém průchodu a když se zpráva smaže tak se změní její číslo.
To je přesně ono, čumím na to moc dlouho, chtělo to čestvé oči.
Díky, hodím to sem až to bude fungovat.

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:

0