파이프 수신 메일을 처리하고 머리글, 본문을 분할하고 머리글을 부분으로 분할하여 쉽게 주제와 내용을 수집하는 PHP 클래스가 있는지 궁금합니다.들어오는 이메일을 처리하고 파싱하는 라이브러리가 있습니까?
권장 사항은 무엇입니까?
감사
파이프 수신 메일을 처리하고 머리글, 본문을 분할하고 머리글을 부분으로 분할하여 쉽게 주제와 내용을 수집하는 PHP 클래스가 있는지 궁금합니다.들어오는 이메일을 처리하고 파싱하는 라이브러리가 있습니까?
권장 사항은 무엇입니까?
감사
class HTMLParserIterator
{
var $contents;
var $pos=0;
var $endPos=0;
function HTMLParserIterator($contents)
{
$this->contents=$contents;
$this->pos=0;
$this->endPos=strlen($contents);
}
function setPos($pos)
{
$this->pos=$pos;
}
function getPos()
{
return $this->pos;
}
function hasMore()
{
return $this->pos <$this->endPos;
}
function getChar()
{
return $this->hasMore()?$this->contents[$this->pos++]:'';
}
function peek()
{
return $this->hasMore()?$this->contents[$this->pos]:'';
}
function skip($num=1)
{
$this->pos=min($this->pos+$num,$this->endPos);
}
function getChars($num)
{
$out='';
$len=min($num,$this->endPos-$this->pos);
$out=substr($this->contents,$this->pos,$len);
$this->pos+=$len;
return $out;
}
function readUntil($until,$ignoreCase=true)
{
$end=$ignoreCase?stripos ($this->contents, $until ,$this->pos):strpos ($this->contents, $until ,$this->pos);
if($end===false)
{
$end=$this->endPos;
}
$out=substr($this->contents,$this->pos,$end-$this->pos);
$this->pos=$end;
return $out;
}
function skipWhiteSpace()
{
$out=0;
while($this->hasMore() && isWhiteSpace($this->contents[$this->pos]))
{
$out++;
$this->pos++;
}
return $out;
}
function match($str,$ignoreCase=true)
{
if(sWith($this->contents,$str,$ignoreCase,$this->pos))
{
$out=substr($this->contents,$this->pos,strlen($str));
$this->pos+=strlen($str);
return true;
}
return false;
}
}
define("HTMLParserTag_CONTENT",0);
define("HTMLParserTag_OPEN",1);
define("HTMLParserTag_CLOSE",2);
define("HTMLParserTag_STANDALONE",3);
define("HTMLParserTag_COMMENT",4);
define("HTMLParserTag_EXTENDED_COMMENT",5);
define("HTMLParserTag_SCRIPT",6);
define("HTMLParserTag_STYLE",7);
define("HTMLParserTag_TEXTAREA",8);
class HTMLParserSectionTag
{
var $type;
var $value;
var $attrs=Array();
function HTMLParserSectionTag(&$iterator)
{
if(($value= $iterator->match('<!--'))!==false)
{
$this->type=HTMLParserTag_EXTENDED_COMMENT;
$this->value=$iterator->readUntil('-->');
$iterator->skip(3);
}
else if(($value= $iterator->match('<!'))!==false)
{
$this->type=HTMLParserTag_COMMENT;
$this->value=$iterator->readUntil('>');
$iterator->skip(1);
}
else if(($value= $iterator->match('</'))!==false)
{
$this->type=HTMLParserTag_CLOSE;
$ch=$iterator->getChar();
$buffer='';
while($ch!='' && !isWhiteSpace($ch) && $ch!='>' && $ch!='/')
{
$this->value.=$ch;
$ch=$iterator->getChar();
}
if($this->value=='')
{
$this->value='<'.$ch;
$this->type=HTMLParserTag_CONTENT;
}
else if($ch=='/' && ($value= $iterator->match('>'))!==false)
{
}
else if($ch!='>')
{
$endOfTag=$this->readAttrs($iterator);
}
}
else if(($value= $iterator->match('<'))!==false)
{
$this->type=HTMLParserTag_OPEN;
$ch=$iterator->getChar();
$buffer='';
while($ch!='' && !isWhiteSpace($ch) && $ch!='>' && $ch!='/')
{
$this->value.=$ch;
$ch=$iterator->getChar();
}
if($this->value=='')
{
$this->value='<'.$ch;
$this->type=HTMLParserTag_CONTENT;
}
else if($ch=='/' && ($value= $iterator->match('>'))!==false)
{
$this->type=HTMLParserTag_STANDALONE;
}
else if($ch!='>')
{
$endOfTag=$this->readAttrs($iterator);
if($endOfTag=='/>')
{
$this->type=HTMLParserTag_STANDALONE;
}
}
}
else
{
$this->value=$iterator->readUntil('<');
$this->type=HTMLParserTag_CONTENT;
}
if($this->type==HTMLParserTag_OPEN && strtolower($this->value)=="script")
{
$this->readScript($iterator);
}
else if($this->type==HTMLParserTag_STANDALONE && strtolower($this->value)=="script")
{
$this->type=HTMLParserTag_SCRIPT;
$this->value='';
}
else if($this->type==HTMLParserTag_OPEN && strtolower($this->value)=="textarea")
{
$this->type=HTMLParserTag_TEXTAREA;
$this->readUntilEndTag($iterator,"textarea");
}
else if($this->type==HTMLParserTag_STANDALONE && strtolower($this->value)=="textarea")
{
$this->type=HTMLParserTag_TEXTAREA;
$this->value='';
}
else if($this->type==HTMLParserTag_OPEN && strtolower($this->value)=="style")
{
$this->type=HTMLParserTag_STYLE;
$this->readUntilEndTag($iterator,"style");
}
else if($this->type==HTMLParserTag_STANDALONE && strtolower($this->value)=="style")
{
$this->type=HTMLParserTag_STYLE;
$this->value='';
}
}
function readScript(&$iterator)
{
$this->type=HTMLParserTag_SCRIPT;
$this->readUntilEndTag($iterator,"script");
}
function readUntilEndTag(&$iterator,$tag)
{
$this->value='';
while ($iterator->hasMore())
{
$this->value.=$iterator->readUntil('</'.$tag);
if($iterator->match("</$tag>"))
{
return;
}
else
{
$pos=$iterator->getPos();
$section=new HTMLParserSectionTag($iterator);
if($section->type==HTMLParserTag_STANDALONE && strtolower($section->value)==$tag)
{
return;
}
else
{
$iterator->setPos($pos);
$this->value.=$iterator->getChar();
}
}
}
}
function getAttribute($name)
{
return array_key_exists($name,$this->attrs)?$this->attrs[$name]:null;
}
function readAttrs(&$iterator)
{
while($iterator->hasMore())
{
if($iterator->match('>'))
{
return '>';
}
else if($iterator->match('/>'))
{
return '/>';
}
$iterator->skipWhiteSpace();
$name='';
$value='';
$ch=$iterator->getChar();
while($ch!='' && !isWhiteSpace($ch) && $ch!='>' && $ch!='=')
{
if($ch=='/' && $iterator->peek()=='>')
{
$ch='/>';
$iterator->getChar();
break;
}
$name.=$ch;
$ch=$iterator->getChar();
}
if($ch=='>' || $ch=='/>')
{
$this->attrs[$name]=false;
return $ch;
}
$whitespace=(isWhiteSpace($ch)?1:0)+$iterator->skipWhiteSpace();
if($iterator->peek()=='=')
{
$ch='=';
$iterator->skip();
$whitespace=0;
}
$whitespace=$whitespace+$iterator->skipWhiteSpace();
$value=false;
if($iterator->peek()=='\'')
{
$iterator->skip();
$ch=$iterator->getChar();
while($ch!='\'')
{
$value.=$ch;
$ch=$iterator->getChar();
}
}
else if($iterator->peek()=='"')
{
$iterator->skip();
$ch=$iterator->getChar();
while($ch!='"')
{
$value.=$ch;
$ch=$iterator->getChar();
}
}
else
{
if($whitespace==0)
{
$value='';
$ch=$iterator->getChar();
while($ch!='' && !isWhiteSpace($ch) && $ch!='>' && $ch!='=')
{
if($ch=='/' && $iterator->peek()=='>')
{
$ch='/>';
$iterator->getChar();
break;
}
$value.=$ch;
$ch=$iterator->getChar();
}
if($ch=='>' || $ch=='/>')
{
$this->attrs[$name]=$value;
return $ch;
}
}
}
if($name!='')
{
$this->attrs[$name]=$value;
}
}
}
function isEntirelyWhiteSpace()
{
if(count($this->attrs)==0)
{
for($i=0;$i<strlen($this->value);$i++)
{
if(!isWhiteSpace($this->value[$i]))
{
return false;
}
}
return true;
}
else
{
return false;
}
}
/*
define("HTMLParserTag_CONTENT",0);
define("HTMLParserTag_OPEN",1);
define("HTMLParserTag_CLOSE",2);
define("HTMLParserTag_STANDALONE",3);
define("HTMLParserTag_COMMENT",4);
define("HTMLParserTag_EXTENDED_COMMENT",5);
define("HTMLParserTag_SCRIPT",6);
define("HTMLParserTag_STYLE",7);
define("HTMLParserTag_TEXTAREA",8);
*/
function getAttributesText()
{
$out='';
foreach($this->attrs as $name=>$value)
{
$out.=' '.$name;
if($value!==false)
{
$out.='="'.str_replace('"','"',$value).'"';
}
}
return $out;
}
function getContent()
{
$out='';
switch($this->type)
{
case HTMLParserTag_CONTENT:
{
$out=$this->value;
}
break;
case HTMLParserTag_OPEN:
case HTMLParserTag_STANDALONE:
{
$out='<'.$this->value;
$attr=$this->getAttributesText();
if($attr!='')
{
$out.=$attr.' ';
}
$out.=$this->type==HTMLParserTag_STANDALONE?'/>':'>';
}
break;
case HTMLParserTag_CLOSE:
{
$out='</'.$this->value.">";
}
break;
case HTMLParserTag_SCRIPT:
{
$out='<script';
$attr=$this->getAttributesText();
if($attr!='')
{
$out.=$attr.' ';
}
$out.='>'.$this->value."</script>";
}
break;
case HTMLParserTag_TEXTAREA:
{
$out='<textarea';
$attr=$this->getAttributesText();
if($attr!='')
{
$out.=$attr.' ';
}
$out.='>'.$this->value."</textarea>";
}
break;
case HTMLParserTag_STYLE:
{
$out='<style';
$attr=$this->getAttributesText();
if($attr!='')
{
$out.=$attr.' ';
}
$out.='>'.$this->value."</style>";
}
break;
case HTMLParserTag_COMMENT:
{
$out.='<!'.$this->value.">";
}
break;
case HTMLParserTag_EXTENDED_COMMENT:
{
$out.='<!--'.$this->value."-->";
}
break;
}
return $out;
}
function hasTagName($name)
{
$out=false;
switch($this->type)
{
case HTMLParserTag_OPEN:
case HTMLParserTag_STANDALONE:
case HTMLParserTag_CLOSE:
{
$out=strtolower($this->value)==strtolower($name);
}
break;
case HTMLParserTag_SCRIPT:
{
$out=strtolower($name)=='script';
}
break;
case HTMLParserTag_TEXTAREA:
{
$out=strtolower($name)=='textarea';
}
break;
case HTMLParserTag_STYLE:
{
$out=strtolower($name)=='style';
}
break;
case HTMLParserTag_COMMENT:
case HTMLParserTag_EXTENDED_COMMENT:
{
if(strtolower($name)=='~comment')
{
$out=true;
}
else if(sWith(strtolower($name),'~comment:'))
{
$out=$this->value==substr($name,strlen('~comment:'));
}
}
break;
case HTMLParserTag_CONTENT:
{
$out=strtolower($name)=='~content';
}
break;
default:
{
$out=false;
}
break;
}
return $out;
}
function removeAttributes($name)
{
$newAttrs=Array();
$name=strtolower($name);
foreach($this->attrs as $attrName=>$attrValue)
{
if(strtolower($name)!=strtolower($attrName))
{
$newAttrs[$attrName]=$attrValue;
}
}
$this->attrs=$newAttrs;
}
function removeAttributesStartingWith($name)
{
$newAttrs=Array();
$name=strtolower($name);
foreach($this->attrs as $attrName=>$attrValue)
{
if(!sWith(strtolower($attrName),strtolower($name)))
{
$newAttrs[$attrName]=$attrValue;
}
}
$this->attrs=$newAttrs;
}
function removeStyle($name)
{
$name=strtolower($name);
$styleKey='';
foreach($this->attrs as $attrName=>$attrValue)
{
if(strtolower($attrName)=='style')
{
$styleKey=$attrName;
}
}
if($styleKey!='')
{
$styleDef=new HTMLParserIteratorStyleDefintion($this->attrs[$styleKey]);
$styleDef->removeStyle($name);
$this->attrs[$styleKey]=$styleDef->getContent();
}
}
function removeStyleStartingWith($name)
{
$name=strtolower($name);
$styleKey='';
foreach($this->attrs as $attrName=>$attrValue)
{
if(strtolower($attrName)=='style')
{
$styleKey=$attrName;
}
}
if($styleKey!='')
{
$styleDef=new HTMLParserIteratorStyleDefintion($this->attrs[$styleKey]);
$styleDef->removeStyleStartingWith($name);
$this->attrs[$styleKey]=$styleDef->getContent();
}
}
function replaceSources($srcs)
{
foreach($this->attrs as $name=>$val)
{
if(strtolower($name)=='src' && array_key_exists($val,$srcs))
{
$this->attrs[$name]=$srcs[$val];
}
}
}
function getSources(&$srcs)
{
foreach($this->attrs as $name=>$val)
{
if(strtolower($name)=='src')
{
$srcs[$this->attrs[$name]]=true;
}
}
}
}
class HTMLParser
{
var $sections=Array();
function HTMLParser($contents)
{
$iterator=new HTMLParserIterator($contents);
$this->sections=Array();
while($iterator->hasMore())
{
$startPos=$iterator->getPos();
$section=new HTMLParserSectionTag($iterator);
$this->sections[]=$section;
if($startPos==$iterator->getPos())
{
break;
}
}
}
function getContent()
{
$out='';
foreach($this->sections as $section)
{
$out.=$section->getContent();
}
return $out;
}
function removeTags($name)
{
$newSections=Array();
foreach($this->sections as $section)
{
if(!$section->hasTagName($name))
{
$newSections[]=$section;
}
}
$this->sections=$newSections;
}
function removeAttributes($name)
{
for($i=0;$i<count($this->sections);$i++)
{
$this->sections[$i]->removeAttributes($name);
}
}
function removeAttributesStartingWith($name)
{
for($i=0;$i<count($this->sections);$i++)
{
$this->sections[$i]->removeAttributesStartingWith($name);
}
}
function removeStyle($name)
{
for($i=0;$i<count($this->sections);$i++)
{
$this->sections[$i]->removeStyle($name);
}
}
function removeStyleStartingWith($name)
{
for($i=0;$i<count($this->sections);$i++)
{
$this->sections[$i]->removeStyleStartingWith($name);
}
}
function removeSections($name)
{
$newSections=Array();
$openTags=0;
foreach($this->sections as $section)
{
if(!$section->hasTagName($name))
{
if($openTags==0)
{
$newSections[]=$section;
}
}
else
{
if($section->type==HTMLParserTag_OPEN)
{
$openTags++;
}
else if($section->type==HTMLParserTag_CLOSE && $openTags>0)
{
$openTags--;
}
}
}
$this->sections=$newSections;
}
function replaceSources($srcs)
{
foreach($this->sections as $id=>$section)
{
$this->sections[$id]->replaceSources($srcs);
}
}
function moveSources($basePath,$oldFolder,$newFolder)
{
$srcs=$this->getSources();
$newSrcs=Array();
foreach($srcs as $src=>$junk)
{
if(substr($src,0,strlen($oldFolder))==$oldFolder)
{
if(!file_exists($basePath.$newFolder))
{
mkdir($basePath.$newFolder);
}
$newSrc=$newFolder.substr($src,strlen($oldFolder));
rename($basePath.$src,$basePath.$newSrc);
$newSrcs[$src]=$newSrc;
}
}
$this->replaceSources($newSrcs);
}
function getSources()
{
$srcs=Array();
foreach($this->sections as $id=>$section)
{
$this->sections[$id]->getSources($srcs) ;
}
return $srcs;
}
function compact()
{
$newSections=Array();
$openTags=0;
foreach($this->sections as $section)
{
if(!$section->isEntirelyWhiteSpace())
{
$newSections[]=$section;
}
}
$this->sections=$newSections;
}
function removeUpto($name, $inclusive=false)
{
$newSections=Array();
$found=false;
foreach($this->sections as $section)
{
if(!$inclusive && $section->hasTagName($name))
{
$found=true;
}
if($found)
{
$newSections[]=$section;
}
if($inclusive && $section->hasTagName($name))
{
$found=true;
}
}
$this->sections=$newSections;
}
function removeAfter($name, $inclusive=false)
{
$newSections=Array();
$found=false;
foreach($this->sections as $section)
{
if($inclusive && $section->hasTagName($name))
{
$found=true;
}
if(!$found)
{
$newSections[]=$section;
}
if(!$inclusive && $section->hasTagName($name))
{
$found=true;
}
}
$this->sections=$newSections;
}
}
?>
편집 :이 실제로 원하는 부분, 부분 위의 HTML 이메일을 구문 분석합니다.
<?php
define('ATTACHMENT_UPLOAD_SERVER_DIRECTORY',dirname(__FILE__).'/storedimages');
define('ATTACHMENT_UPLOAD_WEB_DIRECTORY','storedimages');
if(!function_exists('randomString'))
{
function randomString($len,$chrs='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
$out="";
for($i=0;$i<$len;$i++)
{
$out=$out.substr($chrs,rand()%strlen($chrs),1);
}
return $out;
}
}
class EmailDownloader
{
var $imageTypesAllowed=Array('JPEG'=>'.jpg','GIF'=>'.gif','PNG'=>'.png');
var $mbox = NULL; /* mailbox resource */
function EmailDownloader($username,$password,$mailserver='localhost',$servertype='pop',$port='default')
{
if($port=='default')
{
$imap_port='143';
$pop_port='110';
}
else
{
$imap_port=$port;
$pop_port=$port;
}
if($servertype=='pop')
{
$strconnect= '{'.$mailserver.':'.$pop_port. '/pop3}INBOX';
}
else if($servertype=='imap')
{
$strconnect= $strconnect='{'.$mailserver.':'.$imap_port. '}INBOX';
}
else
{
die("*** error, mailserver type should be either 'pop' or 'imap'\n");
}
$this->mbox=imap_open($strconnect,$username,$password);
}
function getEmails($deleteMessages=false,$attachmentLocationServer=ATTACHMENT_UPLOAD_SERVER_DIRECTORY,$attachmentLocationWeb=ATTACHMENT_UPLOAD_WEB_DIRECTORY)
{
$headers=imap_headers($this->mbox);
//print_r($headers);
$emails=Array();
for($idx=0,$mid=1;$idx<count($headers);$idx++,$mid++)
{
$tmpFolder='';
while ($tmpFolder=='')
{
$tmpFolder='/tmp_'.randomString(5,'abcdefghijklmnopqrstuvwxyz');
if(file_exists($attachmentLocationServer.$tmpFolder))
{
$tmpFolder='';
}
}
mkdir($attachmentLocationServer.$tmpFolder);
$images=Array();
$mail_header=imap_header($this->mbox,$mid);
$fromAddress=($mail_header->from[0]->mailbox).'@'.($mail_header->from[0]->host);
//print_r($mail_header);
// $message=imap_body($this->mbox,$mid); # yeah, not so simple, some voodoo needed
$mob=imap_fetchstructure($this->mbox,$mid);
if(($mob->type)==0)
{
// simple text message so, no problemo!
$message=imap_body($this->mbox,$mid);
}else
{
// oops, multipart message
// echo get_part($this->mbox, $mid, "MULTIPART");
$contentParts = count($mob->parts);
$message=get_part($this->mbox, $mid, "TEXT/HTML", $mob);
foreach($mob->parts as $nm=>$part)
{
if($part->type==5 ||$part->type==3)
{
$ext='';
if(array_key_exists($part->subtype,$this->imageTypesAllowed))
{
$ext=$this->imageTypesAllowed[$part->subtype];
}
if($ext=='' && $part->subtype=='OCTET-STREAM' && isset($part->dparameters))
{
$attFilename='';
foreach($part->dparameters as $dpara)
{
if($dpara->attribute=='FILENAME')
{
$attFilename=$dpara->value;
}
}
foreach($this->imageTypesAllowed as $allowedExt)
{
if(substr($attFilename,-strlen($allowedExt))== $allowedExt)
{
$ext=$allowedExt;
}
}
}
if($ext!='' )
{
$filename='';
while( $filename=='')
{
$filename=randomString(20,'abcdefghijklmnopqrstuvwxyz').$ext;
if(file_exists($attachmentLocationServer.$tmpFolder.'/'.$filename))
{
$filename='';
}
}
if($file=fopen($attachmentLocationServer.$tmpFolder.'/'.$filename,'w'))
{
fwrite($file,imap_base64(imap_fetchbody($this->mbox,$mid,$nm+1)));
fclose($file);
$images[str_replace(array('>','<'),array('','cid:'),$part->id)]=$attachmentLocationWeb.$tmpFolder.'/'.$filename;
}
}
}
}
}
$emails[]=Array('from'=>$fromAddress,'subject'=>$mail_header->Subject,'body'=>$message,'header'=>$mail_header,'images'=>$images,'tmp_folder'=>$tmpFolder);
if($deleteMessages)
{
imap_delete($this->mbox,$mid);
}
}
imap_expunge($this->mbox);
return $emails;
}
function close()
{
imap_close($this->mbox);
}
}
?>
<?
function get_mime_type(&$structure) {
$primary_mime_type = array("TEXT", "MULTIPART","MESSAGE", "APPLICATION", "AUDIO","IMAGE", "VIDEO", "OTHER");
if($structure->subtype) {
return $primary_mime_type[(int) $structure->type] . '/' .$structure->subtype;
}
return "TEXT/PLAIN";
}
function get_part($stream, $msg_number, $mime_type, $structure = false,$part_number = false) {
if(!$structure) {
$structure = imap_fetchstructure($stream, $msg_number);
}
if($structure) {
if($mime_type == get_mime_type($structure)) {
if(!$part_number) {
$part_number = "1";
}
$text = imap_fetchbody($stream, $msg_number, $part_number);
if($structure->encoding == 3) {
return imap_base64($text);
} else if($structure->encoding == 4) {
return imap_qprint($text);
} else {
return $text;
}
}
if($structure->type == 1) /* multipart */
{
$prefix ='';
while(list($index, $sub_structure) = each($structure->parts)) {
if($part_number) {
$prefix = $part_number . '.';
}
$data = get_part($stream, $msg_number, $mime_type, $sub_structure,$prefix . ($index + 1));
if($data) {
return $data;
}
} // END OF WHILE
} // END OF MULTIPART
} // END OF STRUTURE
return false;
} // END OF FUNCTION
?>
편집 # 2 : 하나 개 더 많은 부분은 좀 더 독립적 인 것을 선호하는 것, 전체 프로세스
<?php
define('RECEIVING_EMAIL_SERVER','mail.server.com');
define('RECEIVING_EMAIL_ACCOUNT','[email protected]');
define('RECEIVING_EMAIL_PASSWORD','myPasswordIsHere');
define('DELETE_MAIL_MESSAGES_FROM_SERVER',false);
define('USE_MYSQL_ESCAPE',false);
define('STORED_FOLDER_BASE',dirname(__FILE__).'/');
define('STORED_IMAGES_LOCATION','storedimages');
define('STORED_IMAGES_LOCATION_ABSOLUTE',STORED_FOLDER_BASE.STORED_IMAGES_LOCATION);
include_once('class.emaildownloader.php');
include_once('class.htmlparser.php');
$getEmail=new EmailDownloader(RECEIVING_EMAIL_ACCOUNT,RECEIVING_EMAIL_PASSWORD,RECEIVING_EMAIL_SERVER);
$emails=$getEmail->getEmails(DELETE_MAIL_MESSAGES_FROM_SERVER,STORED_IMAGES_LOCATION_ABSOLUTE,STORED_IMAGES_LOCATION);
$getEmail->close();
if($emails)
{
echo "EMAILS FOUND: ".count($emails)." <br />";
}
foreach($emails as $email)
{
echo "PARSING EMAIL<br />";
$parsedDoc=new HTMLParser($email['body']);
$parsedDoc->removeSections("script");
$parsedDoc->removeSections("style");
$parsedDoc->removeSections("head");
$parsedDoc->removeSections("applet");
$parsedDoc->removeSections("embed");
$parsedDoc->removeSections("object");
$parsedDoc->removeSections("iframe");
$parsedDoc->removeSections("select");
$parsedDoc->removeSections("option");
$parsedDoc->removeTags("noscript");
$parsedDoc->removeTags("html");
$parsedDoc->removeTags("body");
$parsedDoc->removeTags("~comment");
$parsedDoc->removeTags("input");
$parsedDoc->removeTags("link");
$parsedDoc->removeTags("form");
$parsedDoc->removeAttributes("background");
$parsedDoc->removeAttributes("bgcolor");
$parsedDoc->removeAttributesStartingWith("on");
$parsedDoc->removeStyleStartingWith('background');
$parsedDoc->compact();
if(count($email['images'])>0)
{
$parsedDoc->replaceSources($email['images']);
}
$subject=explode(' ',$email['subject']);
if(USE_MYSQL_ESCAPE)
{
$project_id=mysql_real_escape_string($subject[0]);
$page_id=mysql_real_escape_string($subject[1]);
}
else
{
$project_id=addSlashes($subject[0]);
$page_id=addSlashes($subject[1]);
}
echo "PARSING COMPLETE<br />";
}
?>
Zend_Mail :
http://framework.zend.com/manual/en/zend.mail.html
특히 : Zend_Mail_Storage
http://framework.zend.com/manual/en/zend.mail.read.html
참고 : 전체 프레임 워크를 사용할 필요가 없습니다. 필요한 수업 만 사용할 수 있습니다. 그렇게 설계되었습니다.
흠을 완료합니다. – Ryan
독립? 무슨 소리 야? 당신은 내 말을들을 필요가 없습니다. Zend Framework는 PHP 5를위한 오픈 소스 객체 지향 웹 애플리케이션 프레임 워크입니다. 젠드 프레임 워크는 느슨하게 결합 된 구성 요소가 많아서 독자적으로 사용할 수 있기 때문에 종종 '구성 요소 라이브러리'라고합니다. " http://framework.zend.com/manual/en/learning.quickstart.intro.html –
그 코드는 이메일 구문 분석과 아무 관련이 없습니다. – Ryan
@David ... 절대적으로 그렇습니다. HTML 전자 메일을 구문 분석합니다 (HTML이 아닌 경우 txt로 다시 변환됩니다). 보낸 사람, 머리글, 첨부 파일을 읽고 제목 줄을 검사하여 예상되는 수신 제목을 일치시킵니다. 이것은 약 4 년 전에 작성한 전자 메일 기반 CMS의 수업입니다. – techtheatre
@ David ... 내 나쁜, 나는 전자 메일 부분이 아니라 파서 부분을 게시했습니다. 방금 편집했습니다. 다시 확인하십시오 (그리고 아래로 투표 ...) – techtheatre