Mam jeden zvlastny problem, ktory riesim uz zopar dni ale zatial sa mi ho nepodarilo rozlusknut.
Ide o to, ze robim mailove rozhranie. Princip je taky, ze ak je sprava nova ulozime ju do databazy, prilohy ulozime na server a potom spravu z mail servera vymazem. A tak precitane spravy taham iba z MySQL.
Tu je kod (tenpracuje fajn)
Kód: Vybrať všetko
<?php
// ak je prava , nova cize nepreciana tak ...
if(isset($_GET['id'])){
$id = $_GET['id'];
$mbox = imap_open ("{localhost:995/pop3/ssl/novalidate-cert}", $nick."@priklad.com", $password);
$hlavicka = imap_header($mbox, $id);
$from = $hlavicka->from[0];
$adresa = $from->mailbox."@".$from->host;
$odosielatel = $from->personal;
$predmet = $hlavicka->Subject;
$datum = $hlavicka->Date;
$sprava = imap_body($mbox, $id);
// komu -> mne
$komu = $nick."priklad.com";
// Ak sprava obsahuje prilohu tak oddel text od prilohy
$st = imap_fetchstructure($mbox, $id);
if (!empty($st->parts)) {
for ($i = 0, $j = count($st->parts); $i < $j; $i++) {
$part = $st->parts[$i];
if ($part->subtype == 'PLAIN') {
$body = imap_fetchbody($mbox, $id, $i+1);
$priloha = 1;
}
}
} else {
$body = imap_body($mbox, $id);
$priloha = 0;
}
// Teraz INSERT-neme celu spravu, ktoru sme si vytiahli so mail servera do databazy MySQL -> tab. mails
$server = "localhost";
$username = "******";
$password = "******";
$databaza = "email";
@mysql_pconnect($server, $username, $password) or die("Nemozem nadviazat spojenie s databazou!");
@mysql_select_db($databaza) or die("Nemozem nadviazat spojenie s databazou!");
$vlozenie = mysql_query("INSERT INTO `email`.`mails` (`id` ,`nick` ,`od` ,`komu` ,`predmet` ,`cas` ,`sprava` ,`stav` )VALUES (NULL , '$nick', '$adresa', '$komu', '$predmet', '$datum', '$body', '1')");
// Vyvorime priecinok pre danu spravu. Identifikator podla ID z tab. mails
$results = mysql_query("SELECT id FROM `email`.`mails` WHERE cas='$datum'");
$id_priecinok = mysql_result($results, 0, "id");
mkdir("attachment/$nick/$id_priecinok", 0333);
chmod("attachment/$nick/$id_priecinok", 0333);
// Ak sprava obsahuje prilohu vyberieme ju(ich) a ulozime na server
if($priloha == 1){
$structure=imap_fetchstructure($mbox, $id); // druhy parameter je poradove cislo spravy
$encoding=$structure->encoding;
$parts=$structure->parts;
$num_parts=sizeof($parts);
for($i=1;$i<=$num_parts;$i++){ // cislo prilohy 1 lebo 2 alebo 3 ...
$info=get_info($parts[$i]);
$name=$info['name']; // nazov suboru s koncovkou
$mime=$info['mime']; // Typ suboru
$transfer=$info['transfer']; // Kodovanie
$size=$info['size']; // Velkost
// ulozenie prilohy na server
$file = imap_fetchbody($mbox, $id, ($i+1)); //druhy parameter je cislo spravy, tretie cislo je 1-text 2-1.prihloha 3-2.priloha ...
$tFile = "attachment/$nick/$id_priecinok/$name";
$tFileHandle = fopen($tFile, "w");
fwrite($tFileHandle, imap_base64($file));
fclose ($tFileHandle);
?>Funkcia get_info() vyzera pomerne jednoducho :
Kód: Vybrať všetko
function get_info($part)
{
$name = "[unknown]";
// popis časti
if($part->ifdescription == true) $description = $part->description;
// meno // chyba je v mene suboru
echo "PART->TYPE:".$part->type;
for($i=0;$i<count($part->parameters);$i++)
{
$parameter = $part->parameters[$i];
if((($parameter->attribute=="name") || ($parameter->attribute=="NAME")) && ($parameter->value!=""))
{
$name = $parameter->value;
break;
}
}
// typ
if(isset($part->type)):
switch($part->type)
{
case 0:
$type = "text";
break;
case 1:
$type = "multipart";
break;
case 2:
$type = "message";
break;
case 3:
$type = "application";
break;
case 4:
$type = "audio";
break;
case 5:
$type = "image";
break;
case 6:
$type = "video";
break;
case 7:
$type = "other";
break;
default:
$type = "unknown";
break;
}
endif;
// mime
$mime = $type."/".$part->subtype;
// kódovanie
if(isset($part->encoding)):
switch($part->encoding)
{
case 0:
$encoding = "7BIT";
break;
case 1:
$encoding = "8BIT";
break;
case 2:
$encoding = "BINARY";
break;
case 3:
$encoding = "BASE64";
break;
case 4:
$encoding = "QUOTED-PRINTABLE";
break;
case 5:
$encoding = "OTHER";
break;
default:
$encoding = "none";
break;
}
else:
$encoding = "7BIT";
endif;
// veľkosť
$size = $part->bytes;
if($size>1000) $size = ceil($size/1000);
else $size = 1;
// spolu
$info = array
(
"name" => $name,
"mime" => $mime,
"transfer" =>$encoding,
"size" =>$size,
);
return $info;
}Kód: Vybrať všetko
for($i=0;$i<count($part->parameters);$i++)
{
$parameter = $part->parameters[$i];
if((($parameter->attribute=="name") || ($parameter->attribute=="NAME")) && ($parameter->value!=""))
{
$name = $parameter->value;
break;
} Fatal error: Cannot use object of type stdClass as array in...
Zvlastne je, ze pri ostatnych typoch suborov je vsetko ok.
Ak by mi niekto vedel poradit bol by somvelmi vdacny.
Dakujem
// este doplnim ze skript je estedost nedoladeny preotoze sa prioritne zameriavam na tuto chybu.(napr. kodovanie je prednastavene na base64-ku no vskutocnosti by tam mala byt estepodmienka, inak ulozeny subor bude poruseny)