Autor | Zpráva | ||
---|---|---|---|
Prefin Profil |
#1 · Zasláno: 27. 5. 2012, 15:58:55
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 |
#2 · Zasláno: 27. 5. 2012, 22:35:57
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 |
#3 · Zasláno: 28. 5. 2012, 09:06:29
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. |
||
Časová prodleva: 12 let
|
0