Решил написать почтовый клиент.
Встрял в некую проблему при разборе тела письма.
Если приходит "text/plain" или "text/html" то тут все вроде просто.
А вот письма в "multipart/alternative" и "multipart/mixed" тут беда.
Есть параметр "bondary" который я получаю из заголовков.
Но в теле письма не всегда все гладко бывает что этот самый "bondary" в одной строке с "Content-type" бывает что отдельным параметром
как быть в таких случаях?...
Также встретил не очень приятную вещь. Брал письма с Mail.ru
там есть письмо от "phpclasses.org"
Вот что я получил у себя причем это чистое body письма:
<div style="3D"" background-color:="" #ffffff="" ;="" color:="" black="" ;"="">
<div id="3D"userContent""></div>
<div id="3D"MainConteiner"">
<div id="3D"PageContent"">
<div id="3D"Top"">
<table style="3D"width:" 100%"="">
<tbody><tr>
<td><a href="3D"http://www.phpclasses.org/""><img src="3D"http://files.phpclasses.org="" graphics="" phpclasses="" logo-phpclasses.png"="" width="3D"180"" he="ight=3D"60"" alt="3D"PHP" classes"="" border="3D"0""></a></td>
<td style="3D"width:" 1%"=""><a href="3D"http://www.icontem.com/"" targe="t=3D"_blank""><img src="3D"http://files.phpclasses.org/graphics/icontem.png"" =="" width="3D"180"" height="3D"60"" alt="3D"Icontem"" border="3D"0""></a></td>
<td style="3D"width:" 1%"=""><img alt="3D"elePHPant"" src="3D"http://file=" s.phpclasses.org="" graphics="" phpclasses="" elephpant.png"="" width="3D"133px"" height="=3D"117px""></td>
</tr>
</tbody></table>
<h1 style="3D"text-align:" center"="">Added a new class: Encrypted Numbe=
r Generator</h1>
</div>
<div id="3D"PageInfo"">
[code]
Все письмо не буду скидывать так как очень много.
Но смысл в том что от куда не возьмись появились надписи типо [code]3D"
="
==""
и если всех их удалить то получается нормальный читабельный код html который нормально отображается.
Письмо приходит в ISO-8859-1
Но пробовал переключать в браузере кодировку не помогло
Подскажите что делать с этими двумя проблемами?
Спустя 9 минут, 5 секунд (10.06.2012 - 22:25) Remka написал(а):
С письмом разобрался. Дело было в quoted_printable_decode.
Остался вопрос как быть с письмами в "multipart/alternative" и "multipart/mixed"
Может подскажет кто нибудь есть ли готовые функции под это в php или же регулярное выражение какое нибудь универсальное?
Остался вопрос как быть с письмами в "multipart/alternative" и "multipart/mixed"
Может подскажет кто нибудь есть ли готовые функции под это в php или же регулярное выражение какое нибудь универсальное?
Спустя 15 дней, 13 часов, 49 минут, 31 секунда (26.06.2012 - 12:14) SergeyZuzic написал(а):
<?php
function get_data($cmd) {
global $pop3;
fputs($pop3, $cmd);
$data='';
while(!feof($pop3)) {
$buffer=chop(fgets($pop3, 1024));
$data.=$buffer."\r\n";
if(trim($buffer)=='.') break;
}
return $data;
}
function get_res($cmd) {
global $pop3;
fputs($pop3, $cmd);
return fgets($pop3, 1024);
}
function get_structure($data) {
$eMail=Array();
$separador="\r\n\r\n";
$header=trim(substr($data, 0, strpos($data, $separador)));
$bodypos=strlen($header)+strlen($separador);
$body=substr($data, $bodypos, strlen($data)-$bodypos);
$eMail['header']=$header;
$eMail['body']=$body;
return $eMail;
}
//-----------------------------------------
$pop3=fsockopen('pop.mail.ru', 110, $errno, $errstr, 10);
fgets($pop3, 1024);
//-----------------------------------------
print get_res("USER login\r\n").'<br>';
print get_res("PASS password\r\n").'<br>';
print get_res("LIST\r\n").'<br>';
print get_res("QUIT\r\n").'<br>';
$letters=explode("\r\n", get_data("LIST\r\n"));
for($i=1; $i<sizeof($letters); $i++) {
$res=explode(' ', $letters[$i]);
if($res[0]!='.') {
$LTR[$res[0]]=$res[1];
} else {
$i=sizeof($letters);
}
}
//-----------------------------------------
foreach($LTR as $key=>$val) {
if($val<1*1024*1024) {
$end_text=''; $header=''; $text=''; $darr='';
$arr=''; $temp=''; $result=''; $arr='';
$text=get_data("RETR $key\r\n");
$arr=get_structure($text);
$temp=explode("\r\n", $arr['header']);
foreach($temp as $val) {
$res=explode(':', $val);
if(sizeof($res)==1) $res=explode('="', $val);
$res[0]=mb_strtolower(trim($res[0]));
$header[$res[0]]=mb_strtolower(trim($res[1]));
}
preg_match("/text\/html\; charset=(.*)/", $header['content-type'], $darr);
if(isset($darr[1])) {
$charset=$darr[1];
} else {
preg_match("/charset=(.*)\r\n/isU", $text, $darr);
$charset=$darr[1];
}
$charset=str_ireplace('"', '', $charset);
if(isset($header['boundary'])) {
$header['boundary']=str_ireplace('"', '', $header['boundary']);
} else {
preg_match("/boundary=(.*)/", $header['content-type'], $boundary);
$header['boundary']=$boundary[1];
}
//-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
if(preg_match("/multipart\/alternative/", $header['content-type'])) {
$MT='multipart/alternative';
$result=preg_split('/'.$header['boundary'].'/i', $arr['body']);
$result=$result[2];
$resourse=explode("\r\n", $result);
$dtext='';
for($i=4; $i<sizeof($resourse); $i++) {
$dtext.="\r\n".$resourse[$i];
}
if(strstr($result, 'quoted-printable')) {
$end_text=quoted_printable_decode($dtext);
} else if(strstr($result, 'base64')) {
$end_text=base64_decode($dtext);
}
} else if(preg_match("/text\/plain/", $header['content-type'])) {
$MT='text/plain';
$result=explode("\r\n\r\n", $text);
$dtext='';
for($i=1; $i<sizeof($result)-1; $i++) {
$dtext.='<br>'.$result[$i];
}
$end_text=$dtext;
} else if(preg_match("/text\/html/", $header['content-type'])) {
$MT='text/html';
$result=explode("\r\n\r\n", $text);
$dtext='';
for($i=1; $i<sizeof($result)-1; $i++) {
$dtext.='<br>'.$result[$i];
}
$end_text=quoted_printable_decode($dtext);
} else if(preg_match("/multipart\/mixed/", $header['content-type'])) {
$MT='multipart/mixed';
$result=preg_split('/'.$header['boundary'].'/i', $arr['body']);
$result=$result[1];
$resourse=explode("\r\n", $result);
$dtext='';
for($i=2; $i<sizeof($resourse)-1; $i++) {
$dtext.='<br>'.$resourse[$i];
}
$charset='utf-8';
$end_text=$dtext;
}
if($charset!='utf-8') {
$end_text=iconv($charset, 'utf-8', $end_text);
}
//print_r($header);
print 'Письмо '.$key.' ('.$MT.'):<br>'.$end_text.'<br>'.str_repeat('-', 100).'<br>';
} else {
print 'Письмо '.$key.' ('.$MT.'):<br>Error!<br>'.str_repeat('-', 100).'<br>';
}
}
?>