Autor Zpráva
notwist
Profil
Zdravím,

potřeboval bych trochu pomoci s mým problémem. V PHP si stahuji e-maily přes IMAP funkce PHP a zobrazuji si text zprávy. Vše je OK, ale pokud HTML zpráva obsahuje vložený obrázek, tak se mi v editoru (CKEditor) zobrazí náhled zprávy, ale jen s orámovaným obrázkem, který neumí najít. Je možné toto nějak ošetřit, aby na místě, kde je obrázek vložený, se opravdu zobrazil? Předpokládám, že to nějak lze, jelikož například RoundCube mi zprávu zobrazí korektně. Programuji si své řešení pro příjem zpráv.

Velice děkuji za případný postup, jak problém vyřešit.
Keeehi
Profil
A co je v tom kódu uvedeno za URL?
notwist
Profil
Je tam toto:

<img alt="Popis: Popis: Logo.gif" id="obrázek_x0020_1" src="cid:image001.png@01D0E4CF.E4174D80" style="height:68px; width:162px" />

A v tom Roudcube, kde to jde:

<img width="162" height="68" id="obrázek_x0020_1" src="./?_task=mail&amp;_uid=2&amp;_mbox=INBOX&amp;_action=get&amp;_part=2&amp;_embed=1&amp;_mimeclass=image" alt="Popis: Popis: Logo.gif">
Keeehi
Profil
Musíš si stáhnout přílohy, což by se mělo snad dělat pomocí php.net/manual/en/function.imap-fetchstructure.php. Uložit je třeba do složky attachments a pak v kódu nahradit podobně jako to dělá roundcube

<img alt="Popis: Popis: Logo.gif" id="obrázek_x0020_1" src="cid:image001.png@01D0E4CF.E4174D80" style="height:68px; width:162px" />

za

<img alt="Popis: Popis: Logo.gif" id="obrázek_x0020_1" src="attachments/image001.png" style="height:68px; width:162px" />
notwist
Profil
Děkuji, ale nejsem z toho moudrý. Není ta funkce použitelná spíše na přílohy z mailu? Pokud se mýlím, nemáte odkaz na kód, který by ukládal obrázky z těla zprávy? Díky.
Keeehi
Profil
notwist:
Jenže on v těle žádný obrázek není. V klasickém HTML kódu taky není žádný obrázek. Jen tag s atributem který popisuje, kde se má ten obrázek hledat. V tomto případě to je cid:image001.png@01D0E4CF.E4174D80. Nejsem odborník na posílání emailů ale přijde mi to, že to říká, že obrázek je v příloze.
notwist
Profil
Tak jsem provedl nahrazení:

$find = '#src="cid:([^"@]*)@([^"]*)"#';
    $replace = 'src="prilohyzprav/$1"';
    $html_part = preg_replace($find, $replace, $body);


Teď bych ještě potřeboval ty soubory i fyzicky uložit. To zatím nevím jak...
Keeehi
Profil
Google mi na dotaz "imap php download attachment" vrací celkem použitelné výsledky.
notwist
Profil
To ano. Umím uložit klasickou přílohu. To jde. Ale pokud má mail vložený obrázek, jak píši, tak skript nepozná přílohu a neuloží jí. Je to asi nějak omezené na přílohy. Pravděpodobně bude nutné někde něco změnit, aby to bralo (i) vložené obrázky.
notwist
Profil
Tak pro info, jak jsem uspěl :-)

$structure = imap_fetchstructure($messagemap, $msg);
    $parts = $structure->parts;
    $num_parts = sizeof($parts);
    if($num_parts>0) $attachment = 1; // příloha existuje
    else $attachment = 0; // příloha neexistuje
    $encoding = $structure->encoding;
    $parts = $structure->parts;
    $num_parts = sizeof($parts); // KOLIK má ZPRÁVA částí
    if($num_parts>0){
        echo "Přílohy:<br><br>";
        for($i=1;$i<$num_parts;$i++){
          $info = get_info($parts[$i]);
          $name = $info['name'];
          $mime = $info['mime'];
          $transfer = $info['transfer'];
          $size = $info['size'];
          echo "<a href='test_imap_download.php?id=$msg&part=".($i+1)."&mime=$mime&filename=$name&transfer=$transfer'>";
          echo $name."</a> ".$mime." ".$size." kB";
          echo "<br />";
          $file = imap_fetchbody($messagemap, $msg, ($i+1));
          if ($transfer == 'BASE64') $file = imap_base64($file);
          elseif($transfer == 'QUOTED-PRINTABLE') $file = imap_qprint($file);
          file_put_contents('prilohyzprav/'.$name, $file);
        }
        
    }

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