PHP郵件專題
PHP SMTP類
/***********************************
PHP MIMESMTP ver 1.0 Powered by Boss_ch, Unigenius soft ware co. Ltd
All rights reserved, Copyright 2000 ;
本類用PHP透過smtp sock 作業發送MIME 類型的郵件,可以傳送
HTML
本版本是針對個人的發送,與多人群發版本不同的是,每發送到一個人,就重新進行一次編碼,在接收端的用戶看來,只是發送給他一個人的。
針對多人群發的情況,只發送一次,透過多個RCPTTO指令傳送到不同的人信箱中,
說明:
請把$hostname 設為你有權限的預設smtp 伺服器或是在new 時指定
把$charset 改成你的預設字元集
Html 正文中如有圖片,請用絕對路徑的引用"httP://host/path/image.gif";
並連上網,以確保程式能讀取到圖片的資料資訊
如果是透過表單提交過來的Html 正文,請先用StripSlashes($html_body)把正文內容進行預處理
Html 中用到的樣式表文件,請不要用之類的引用,直接把樣式表定義放在
標籤中
轉載請保留此版權信息,Bugs Report : [email]boss_ch@china.com[/email]
*********************************** **/
if(!isset($__smtp_class__)){
$__smtp_class__=1;
class smtp
{
var $hostname="";
var $port=25;
var $connection=0;
var $debug=1;
var $timeout=30;
var $err_str;
var $err_no;
var $autocode=true;
var $charset="??????";
var $subject="";
var $body="";
var $attach="";
var $temp_text_body;
var $temp_html_body;
var $temp_body_images;
var $bound_begin="=====powered_by_boss_chen_";
Function smtp($server="smtp.china.com",$port=25,$time_out=20)
{$this- >hostname=$server;
$this->port=$port;
$this->timeout=$time_out;
return true;
}
Function outdebug($ message)
{
echo htmlspecialchars($message)."
n";
}
function command($command,$return_lenth=1,$return_codeth=1,$return_code '2')
{
if ($this->connection==0)
{
$this->err_str="沒有連接到任何伺服器,請檢查網路連線";
return false;
}
if ($this->debug)
$this->outdebug(">>> $command");
if (!fputs($this->connection ,"$command rn"))
{
$this->err_str="無法傳送指令".$command;
return false;
}
else
{
{
$resp=fgets($this->connection,256);
if($this->debug)
$this->outdebug("$resp");
if (substr($resp ,0,$return_lenth)!=$return_code)
{
$this->err_str=$command." 指令伺服器回傳無效:".$resp;
return false;
}
else
return true;
}
}
Function open()
{
if($this->hostname=="")
{$this->err_str="無效的主機名稱!!";
return false;
}
if ($this->debug) echo "$this->hostname,$ this->port,&$err_no, &$err_str, $this->timeout
";
if (!$this->connection=fsockopen($this->hostname,$this->port,& $err_no, &$err_str, $this->timeout))
{
$this->err_str="連接到SMTP 伺服器失敗,錯誤訊息:".$err_str."錯誤號碼:".$err_no ;
return false;
}
else
{
$resp=fgets($this->connection,256);
if($this->debug)
$this->outdebug("$resp");
if (substr($resp,0,1)!="2")
{$this->err_str="伺服器傳回無效的資訊:" .$resp."請檢查SMTP伺服器是否正確";
return false;
}
return true;
}
}
Function Close()
{
if($this->connection!=0)
{
fclose($this->connection);
$this->connection=0;
}
}
Function Buildhead($from_name,$to_name,$from_mail,$to_mail,$subject)
{
if (empty($from_name))
$from_name=$from_mail ;
if (empty($to_name)) $to_name=$to_mail;
$this->subject="From: =?$this->charset?B?".base64_encode($from_name)."? =rn";
$this->subject.="To: =?$this->charset?B?".base64_encode($to_name)."?=rn";
$subject=ereg_replace("n","",$subject);
$this->subject.="Subject: =?$this->charset?B?".base64_encode($subject)." ?=rn";
if ($this->debug) echo nl2br(htmlspecialchars($this->subject));
return true;
}
函數 parse_html_body($html_body=null)
{
$passed="";
$image_count=0;
$this->temp_body_>$image_count=0;
$this->temp_body_images=array() ;
while (eregi("] )src[[:space:]]*=[[:space:]]*([^ ] )",$html_body,$reg))
{
$pos=@strpos($html_body,$reg[0]);
$passed.=substr($html_body,0,$pos);
$html_body= substr($html_body,$pos strlen($reg[0]));
$image_tag=$reg[2];
$image_att=$reg[1];
$tag_len= strlen($ image_tag);
if ($image_tag[0]=="'" 或$image_tag[0]=='"')
$image_tag=substr($image_tag,1);
if (substr ($image_tag,strlen($imgage_tag)-1,1)=="'" 或substr($image_tag,strlen($imgage_tag)-1,1)=='"')
$image_tag= substr($ image_tag,0,strlen($imgage_tag)-1);
//回顯$image_tag."
";
$cid=md5(uniqid(rand()));
$cid =substr($cid,0,15)."@unigenius.com";
$passed.="$end_pos=@strpos($html_body,'>');
$passed.=substr($html_body,0,$end_pos);
$html_body=substr($html_body,$end_pos);
//把圖片資料讀取存出來一個資料;
$img_file_con=fopen($image_tag,"r");
unset($image_data);
while ($tem_buffer= AddSlashes (fread($img_file_con,16777216)))
$image_data.=$tem_buffer;
fclose($img_file_con);
$image_exe_name=substr($img_file_con);
$image_exe_name=substr($image_tag,strpos. ,3);
switch (strtolower($image_exe_name))
{
case "jpg":
case "jpeg":
$content_type="image/jpeg ";
break;
case "gif":
$content_type="image/gif";
break;
case "png":
$content_type="image/x -png";
break;
case "tif":
$content_type="image/tif";
break;
預設值:
$content_type="image/";
break;
}
$this->temp_body_images[$image_count][name]=basename($image_tag);
$this->temp_body_images[$image_count][type ]= $content_type;
$this->temp_body_images[$image_count][cid]=$cid;
$this->temp_body_images[$image_count][data]=$image_data;
$image_count ;
}
$this->temp_html_body=$passed.$html_body;
回傳true;
}
function build_content($bound_level=0,$text_body ,$html_body,$ hava_att=false)
{
if ($html_body)
{
if (eregi("{
$bound_level ;
if ($text_body)
{
$this->body .="內容類型:multipart/lated;
type="multipart/alternative";
tboundary="";
$this->body.=$this ->bound_begin.$bound_level.$ this ->bound_end.""rnrn";
}
else
{
$this->body.="Content-Type: multipart/相關;
tboundary="";
$this->body.=$this->bound_begin.$bound_level.$this->bound_end.""rnrn";
} // 判斷是否為text 正文、 html 正文有沒有,須有不同的MIME 頭
if (!$hava_att) $this->body.="這是一條MIME 格式的多部分訊息.rnrn";
// 正文標識,如果已經有附件的編碼,則在正文中需要這個
$this->body.="--".$this->bound_begin.$bound_level. $this->bound_end."rn";
$this->parse_html_body($html_body);
if ($text_body)
{
$this->body.="內容-類型:多部分/替代;
tboundary="";
$bound_level ;
$this->body.=$this->bound_begin.$bound_level.$this->bound_end。 🎜>$this->body.="--".$this->bound_begin.$bound_level.$this->bound_end."rn";
$this->body .="Content-Type: text/ plain;rn";
$this->body.="tcharset="$this->charset"rn";
$this->body.= "內容傳輸編碼:base64rn";
$ this->body.="rn".chunk_split(base64_encode(StripSlashes($text_body)))."rn";
$this->body .="--".$this->bound_begin.$bound_level。 $this->bound_end."rn";
$this->body.="Content-Type: text/html;rn" ;
$this->body.="tcharset="$this->字元集"rn";
$this->body.="Content-Transfer-Encoding: base64rn";
$this->body.="rn".chunk_split(base64_encode(StripSlashes($this-> temp_html_body) )))."rn";
$this->body.="--".$this ->bound_begin.$bound_level.$this->bound_end."--rnrn";
$ bound_level- -;
}
else
{
$this->body .="--".$this->bound_begin.$bound_level.$this->bound_end."rn";
$this->body.="Content-Type: text/html;rn" ;
$this->body.="tcharset="$this->charset"rn";
$this -> body.="內容傳輸編碼:base64rn";
$this->body.="rn".chunk_split(base64_encode(StripSlashes($this->temp_html_body)))."rn";} //正文編碼,有或沒有文字部分,編成不同的格式。
for ($i=0;$i
{
$this->body.="--".$this-> ;bound_begin .$bound_level.$this->bound_end."rn";
$this->body.="Content-Type:".$this->temp_body_images[$i][類型]." ;
名稱="";
$this->body.=$this->temp_body_images[$i][name].""rn";
$this->body.= "內容傳輸編碼:base64rn";
$this->body.="Content-ID: temp_body_images[$i][cid].">rn";
$this->body.="rn".chunk_split(base64_encode(StripSlashes($this->temp_body_images[$i][data])))."rn";
}
$ this- >body.="--".$this->bound_begin.$bound_level.$this->bound_end."--rnrn";
$bound_level--;
}
else // 有或沒有圖片,上面有圖片的處理,下面是沒有圖片的處理
{
$this->temp_html_body=$html_body;
if ($text_body)
{
$bound_level ;
$this->body.="Content-Type: multipart/alternative;
tboundary="";
$this->body.=$this->bound_begin.$bound_level.$this-> bound_end.""rnrn";
if (!$hava_att) $this->body.="rn這是一條MIME 格式的多部分訊息。 ="--".$this->bound_begin.$bound_level.$this->bound_end."rn";
$this->body.= "內容類型:text/plain;rn";
$ this->body.="tcharset="$this->charset"rn";
$this->body.="內容-傳輸編碼:base64rn";
$this->body.=" rn ".chunk_split(base64_encode(StripSlashes($text_body)))."rn";
$this->body.= "--".$this->bound_begin.$bound_level.$this->bound_end." rn ";
$this->body.="Content-Type: text/html;rn";
$this->body.="tcharset="$this->charset"rn";
$this->body.="內容傳輸編碼:base64rn";
$this ->body.="rn".chunk_split(base64_encode(StripSlashes($this->temp_html_body))))."rn" ;
$this->body.="--".$this-> ;bound_begin.$bound_level.$this->bound_end."--rnrn";
$bound_level--;
}
else
{
$this->body.= "Content-Type: text/html;rn";
$this->body.="tcharset="$this->charset" rn";
$this->body.="內容-傳輸編碼:base64rn";
$this->body.="rn".chunk_split(base64_encode(StripSlashes($this->temp_html_body))) ."rn ";
}//正文編碼,有或沒有文字部分,編成不同的格式。
}// end else
}
else // 如果沒有html 正文,只有text 正文
{
$this->body.="Content-Type: text/ plain;
tcharset="$this->charset"rn";
$this->body.="Content-Transfer-Encoding: base64rn";
$this->body.="rn" .chunk_split(base64_encode(StripSlashes($text_body)))."rn";
}
}// end function default
Function Buildbody($text_bodydbody($text_body,$. null,$att=null)
{
$this->body="MIME-Version: 1.0rn";
if (null==$att or (@count($att)==0 )) //如果沒有附件,查看正文的型別;
{
$encode_level=0;
$this->build_content($encode_level,$text_body,$html_body);
}//如果沒有附件,
// ***************************************** ***************
else //如果有附件,
{
$bound_level=0;
$this->body.="Content- Type: multipart/mixed;
tboundary="";
$bound_level ;
$this->body.=$this->bound_begin.$bound_level.$this->bound_end."""" rnrn";
$this->body.="This is a multi-part message in MIME format.rnrn";
$this->body.="--".$this->bound_begin.$ bound_level.$this->bound_end."rn";
$this->build_content($bound_level,$text_body,$html_body,true);// 編入正文部分
$num=count( $att);
for ($i=0;$i{
$file_name=$att[$i][name];
$file_source=$ att[$i][source];
$file_type=$att[$i][type];
$file_size=$att[$i][size];
if (file_exists ($file_source))
{
$file_data=addslashes(fread($fp=fopen($file_source,"r"), filesize($file_source)));
$file_data=chunk_split(base64_encode( StripSlashes($file_data)));
$this->body.="--".$this->bound_begin.$bound_level.$this->bound_end."rn";
$this->body .="Content-Type: $file_type;rntname="$file_name"rnContent-Transfer-Encoding: base64rn";
$this->body.="Content-Disposition: attachment;rntfilename="$file_name"rnrn" ;
$this->body.=$file_data."rn";
}
}//end for
$this->body.="--".$this ->bound_begin.$bound_level.$this->bound_end."--rnrn";
}// end else
if ($this->debug) echo nl2br(htmlspecialchars($this->身體));
return true;
}
function send($from_name,$to_name,$from_mail,$to_mail,$subject,$text_body=false,$text_body html_body=false,$att=false)
{
if (empty($from_mail) or empty($to_mail))
{
$this->err_str="沒有指定正確的郵件地址:發送人:".$from_mail."接收人:".$to_mail;
return false;
}
if (gettype($to_mail)!="array")
$to_mail=split(",",$to_mail);//如果不是數組,轉換成數組,即使只有一個發送物件;
if (gettype($to_name)!="array")
$to_name=split(",",$to_name);//如果不是數組,轉換成數組,即使只有一個發送物件;
$this->Buildbody($text_body,$html_body,$att );
// 所有信件的內容都是一樣的,可以只編一次,而對於不同的收信人,需要不同的Head
if (!$this->open() ) return false;
if (!$this->command("HELO $this->hostname",3,"250")) return false;
// 與伺服器建立連結
if (! $this->open()) return false;
if (!$this->command("HELO $this->hostname",3,"250")) return false;
for ( $i=0;$i
$this->Buildhead($from_name,$to_name[$i],$from_mail,$to_mail[$i], $subject);
if (!$this->command("RSET",3,"250")) return false;
if (!$this->command("MAIL FROM:".$from_mail ,3,"250")) return false;
if (!$this->command("RCPT TO:".$to_mail[$i],3,"250")) return false;
if (!$this->command("DATA",3,"354")) return false;
// 準備寄電子郵件
if ($this->debug) $this->outdebug("sending subject ;");
if (!fputs($this->connection,$this->subject)) {$this->err_str="發送郵件頭時發生錯誤! ";return false;}
if ($this->debug) $this->outdebug("sending body;");
if (!fputs($this->connection,$this->body) ) {$this->err_str="發送正文時出錯! ";return false;}
if (!fputs($this->connection,".rn")) {$this->err_str="發送正文時發生錯誤! ";return false;}//正文發送完畢,退出;
$resp=fgets($this->connection,256);
if($this->debug)
$this->outdebug ("$resp");
if (substr($resp,0,1)!="2")
{
$this->err_str="發送完後,伺服器沒有回應! !";
return false;
}
// 寄信
}
if (!$this->command("QUIT",3,"221")) return false;
$this->close();
return true;
}
}//end class define
}//end if(!isset($__smtp_class__))
}//end if(!isset($__smtp_class__))
?>
PHP SMTP類別使用方法
include("smtp.php");
$mail = new smtp("localhost") ;
$mail->debug = 0;
$sender_name = "root";
$sender_mail = "root@localhost";
$to_name = "mm";
$to_mail = "[email]mm@your.com[/email]";
$subject = "i miss u";
$content = "i miss u much.";
$att[0]["name"] = "miss.jpg";
$att[0]["source"] = "/path/to/your/miss.jpg";
$att[ 0]["type"] = "image/jpeg";
$att[0]["size"] = "10kb";
$extra_subject = "To:".$to_mail." 主題:" .$subject;
if (!$mail->send($sender_name,$to_name,$sender_mail,$to_mail,$extra_subject,$content,false,$att))
$err = 1 ;
?>
傳回檔案的MIME類型的函數guessMIMEType()
function guessMIMEType($filename) {
TY/GUESS MIMEME 🎜>$filename = basename($filename);
if(strrchr($filename,".") == false) {
return("application/octet-stream");
}
$ext = strrchr($filename,".");
switch($ext) {
case ".gif":
return "image/gif";
break;
case ".gz":
return "application/x-gzip";
case ".htm":
case ".html":
return "text/html";
break;
case ".jpg":
return "image/jpeg";
break;
case ".tar":
return "application/x-tar";
break;
case ".txt":
return "text/plain";
break;
case ".zip":
return "application/zip";
break;
default:
return "application/octet-stream";
break;
}
}
偵測Email位址的函數IsValidEmail()Is mail()Email
function IsValidEmail($Email) {
if(!ereg("^[[:alnum:]_.] @([[:alnum:]_] .) [[:alnum:]][[: alnum:]][[:alnum:]]?$",$Email, $regs)){
$IsValidEmail = false;
}
else
{
$IsValidEmail = true ;
}
return $IsValidEmail;
}
一個MIME MAIL類,請大家注意如何建構一個郵件體
class mime_mail
{
var $parts;
var $to;
var $from;
var $headers;
var $subject;
var $body;
/*
* void mime_mail()
* class constructor
*/
function mime_mail()
{
$this-parts = array() ;
$this->to = "";
$this->from = "";
$this->subject = "";
$this->body = "";
$this->headers = "";
}
/*
* void add_attachment(string message, [string name], [string ctype])
* Add an attachment to the mail object
*/
function add_attachment($message, $name = "", $ctype = "application/octet-stream")
{
$this->parts[] = array (
"ctype" => $ctype,
"message" => $message,
"encode" => $encode,
"name" => $name
);
}
/*
* void build_message(array part=
* Build message parts of an multipart mail
*/
$message = chunk_split(base64_encode($message));
$encoding = "base64";
return "Content-Type: " .$part["ctype"].
($part["name"]?";ntname="".$part["name"].""" : "").
"nContent- Transfer-Encoding: $encoding".
"nContent-Disposition: attachment".
($part["name"]?";ntfilename="".$part["name"].""" : "").
"nn$messagen";
}
/*
* void build_multipart()
* Build a multipart mail
*/
*/ build_multipart()
{
$boundary = "b".md5(uniqid(time()));
$multipart = "Content-Type: multipart/mixed;ntboundary="$boundary"nnThis is a MIME encoded message.nn--$boundary";
for($i = sizeof($this->parts)-1; $i >= 0; $i--)
{
$multipart .= "n".$this->build_message($this->parts[$i])."--$boundary";
}
return $multipart.= "--n ";
}
/*
* void send()
* Send the mail (last class-function to be called)
*/
function send()
{
$addtionheaders = "";
if (!empty($this->from))
$addtionheaders .= "From: ".$this->from."n";
if (!empty($this->headers))
$addtionheaders .= $this->headers."n";
if (!empty($this->body))
$this->add_attachment($this->body, "", "text/plain");
$addtionheaders .= "MIME-Version: 1.0n".$this->build_multipart( );
$fp = fopen("mail.txt","w");
fputs($fp,$addtionheaders);
fclose($fp);
mail( $this->to, $this->subject, "", $addtionheaders);
}
}; // 課程結束
/*
* 用法範例
*
$attachment = fread(fopen("test.jpg", "r"), filesize("測試.jpg"));
$mail = new mime_mail();
$mail->from = "[email]foo@bar.com[/email]";
$mail ->headers = "錯誤-收件者: [email]foo@bar.com[/email]";
$mail->to = "[email]bar@foo.com[/email]";
$mail->subject = "測試...";
$mail->body = "這只是一個測試。";
$mail->add_attachment("$attachment", "test.jpg ", "image/jpeg");
$mail->send();
*/
?>
myimap類,讀取郵件
//////////// /////////////////////////////// ///
//起源由Alpha.Z (5/21/ 2000)
//由Belltree 修改(11/01/2000)
////////////////////////////////////////// ////// /
class myimap
{
var $username="";
var $userpwd="";
var $hostname="";
var $port=0;
var $connection=0; // 是否連接
var $state="DISCONNECTED"; // 連線狀態
var $greeting="";
var $must_update=0;
var $inStream=0;
var $num_msg_parts = 0;
var $attach;
var $num_of_attach = 0;
function open()
{
if
function open()
{
if this->port==110)
$this->inStream=imap_open("{ ".$this->主機名稱."/pop3:110}收件匣",$this->使用者名稱,$this ->userpwd);
else
$this->inStream=imap_open(" {".$this->主機名稱.":143}INBOX",$this->使用者名稱,$this->userpwd );
if ($this->inStream)
{
//echo "使用者:$this->使用者名稱的信箱連線成功。
";
return $inStream;
}
else
{
echo "使用者:$this->使用者名稱的信箱連線失敗。
";
return 0;
}
}
函數close()
{
if(imap_close($this->inStream))
{
//echo "
已經與伺服器$this->hostname 中斷連線。 ";
return 1;
}
else
{
//echo "
與伺服器$this->主機名稱斷開連線失敗。 ";
return 0;
}
}
function DeleteMail($msg_no){
if (@imap_delete($this->inStream,$msg_no))
回傳true;
else
回傳false;
}
function ExpungeMail(){
if (@imap_expunge($this->inStream))
回傳true;
else
回傳false;
}
function CheckMailbox($page_size,$page)
{
$mboxinfo=imap__size,$page)
{
$mboxinfo ;
//$mboxinfo=imap_check( $this->inStream);
if ($mboxinfo)
if ($mboxinfo->Nmsgs>0)
{
//echo "您的信箱:".$mboxinfo-> ;信箱."
";
echo $this->使用者名稱."@wells.com的收件匣裡共有郵件數:".$mboxinfo-> Nmsgs."
n ";
echo "未讀取郵件數:".$mboxinfo->未讀取。
echo "總佔用空間:".$mboxinfo->Size."位元組
n";
$last_page = ceil($mboxinfo->Nmsgs/$page_size);
$cur_page = $page 1;
$num_page = $last_page;
echo "第".$cur_page."頁,共".$last_page."頁。n";
}
else
{
echo "您的信箱裡沒有郵件。
n";}else{echo '錯誤:無法取得包裹箱的資訊。';
return 0;
}
echo "n";
echo "
n";狀態
< ;td>寄件者 td>主題
時間
大小
$sortby="SORTDATE";
$sort_reverse=1 ;
$sorted = imap_sort($this->inStream, $sortby, $sort_reverse, SE_UID);
for ($ i=0;$iNmsgs;$i )
{
if (($i>=$page*$page_size) and ($i$msg_no = @imap_msgno($this->inStream, $ sorted[$i]);
$msgHeader = @imap_header($this->inStream, $msg_no);
/ /日期
if (isset($msgHeader->date))
{
$date = $msgHeader->date;
if (ord($date) > 64)
$date = substr($date, 5);
$date = substr($date, 5);
$datepart = split(" ",$date);
$date = $datepart[0]." " .$datepart[1]." ".$datepart[2]." ".$datepart[3 ];
/*
while (strstr(' ', $date))
{
$date = str_replace(' ', ' ', $date);
}
*/
}
if (isset($msgHeader->from[0]))
{
$from = $msgHeader->from[0];
if ( isset($from->個人))
{
$frm = trim($this- >decode_mime_string($from->個人));
if (isset($from->郵箱) && isset ($from->主機))
{
$frm_add = $from ->郵箱。 '@'。 $from->主機;
}
}
else
if (isset($from->郵箱) && isset($from->主機))
{
$frm = $from->郵箱。 '@'。 $from->host;
}
else
if (isset($msgHeader->fromaddress))
$frm = trim($h->fromaddress);
}
else
if (isset($msgHeader->fromaddress))
$frm = trim($msgHeader->fromaddress);
if (isset($msgHeader->fromaddress) toaddress))
$to = trim($msgHeader->toaddress);
else
$to = "未知";
if (isset($msgHeader->) ;subject))
$sub = trim($this->decode_mime_string($msgHeader->subject));
if ($sub == "")
$sub = "無主題" ;
if ( isset($msgHeader->Size))
$msg_size = ($msgHeader->Size > 1024) ? sprintf("%.0f kb", $msgHeader->Size / 1024) : $msgHeader->Size;
//if (strlen($frm) > 50)
// $frm = substr($frm, 0, 50) 。 '...';
if (strlen($sub) > 50)
$sub = substr($sub, 0, 50) 。 '...';
if ($msgHeader->Unseen == "U")
$newmail = "未讀";
else
$newmail = "已讀取";
echo "n"; n";
echo "
echo ''.$ frm.'
'.$sub.'
' .$date.'
'.$msg_size.' ';
echo "
}}
echo "n";
echo "n";
if ($page == 0)
echo " 第一頁 n";
else
echo " 第一頁
n";
if (($prev_page = $page-1) echo "前一頁 n";
else
echo " 前一頁
n";
if (($next_page = $page 1) >= $last_page)
echo "後一頁 n";
else
echo "後一頁 a> > ;n";
$last_page --;
if ( $last_page echo "最末頁 n";
else
echo "最末頁 n";
echo " n";
}
functiondecode_mime_string ( $string)
{
$pos = strpos($string, '=?');
if (!is_int($pos) )
{
return $string;
}
$preceding = substr($string, 0, $pos); // 儲存任何前面的文字
$ search = substr($string, $pos 2, 75); // mime 標頭規範規定這是最長的單一編碼字
$d1 = strpos($search, '?');
if ( !is_int($d1))
{
return $string;
}
$charset = substr($string, $pos 2, $d1);
$search = substr($search, $d1 1);
$d2 = strpos($search, '?');
if (!is_int($d2))
{return $ string;}
$encoding = substr($search, 0, $d2);
$search = substr($search, $d2 1);
$end = strpos($search, '?=');
if (!is_int($end))
{
return $string;
}
$encoded_text = substr($search, 0, $ end);
$rest = substr($string, (strlen($preceding . $charset . $encoding . $encoded_text) 6));
switch ($encoding)
{
switch ($encoding)
{
{
switch ($encoding)
{
{
switch ($encoding)
{
{
switch ($encoding)
{
{
switch ($encoding)
{
{
switch ($encoding)
{
{
switch ($encoding)
{
case 'Q':
case 'q':
$encoded_text = str_replace('_', ' ', $encoded_text);
$encoded_text = str_replace('=', '%', $ $編碼文字);
$decoded = urldecode($encoded_text);
break;
case 'B':
case 'b':
$decoded = urldecode(base64 $編碼文字));
break;
預設:
$decoded = '=?' 。 $this->decode_mime_string($rest);
}
函數display_toaddress ($user, $server, $from)
{
return is_int(strpos) ($from ) , $this->get_barefrom($user, $server)));
}
函數get_barefrom($user, $server)
{
$barefrom = " $user@ $real_server";
return $barefrom;
}
函數get_struct($msg_num)
{
$struct=imap_fetchstruct($this->StreamStream $ msg_innum );
//echo gettype($struct);
return $struct;
}
函數proc_struct($msg_part, $part_no, $msg_num)
{ 🎜> {
if ($msg_part->ifdisposition)
{
// 看看它是否有支出,我唯一,這個將用於附件
/ / 無論如何,讓我們檢查一下
if ($msg_part->disposition == "attachment")
{
$att_name = "unknown";
for ($lcv = 0; $lcv 參數); $lcv )
{
$param = $msg_part->參數[$lcv];
if ($param->屬性 == "姓名")
{
$ att_name = $param->value;
break;
}
}
$att_name = $this->decode_mime_string($ att_name);
$att_path = $ this->使用者名稱."\".$att_name;
$this->attach[$this->num_of_attach]=$att_name; //登記附件清單
$this->num_of_attach ; //登記附件數量
/*
$att_path = $this->username."\".$this->decode_mime_string($att_name);
if ($this->attach="" )
$this->attach = $att_name;
else
$this->attach .= ";".$att_name;
*/
if (! is_dir($this- >使用者名稱))
mkdir($this->使用者名稱,0700);
$fp=fopen($att_path,"w");
switch ($msg_part->encoding)
{
情況 3: // base64
fputs($fp,imap_base64 (imap_base64 ( imap_fetchbody($this->inStream,$msg_num,$part_no)));
break;
狀況4: // QP
fputs($fp,imap_qprint(imap_fetchbody($this->; inStream, $msg_num,$part_no)));
break;
預設:
fputs($fp,imap_fetchbody($this->inStream,$msg_num,$part_no));
break ;
}
fclose($fp);
//if ($msg_part->type=="5"){
// echo "
// echo "
//}
} // END IF ATTACHMENT
else //NOT ifdisposition
{
//我猜它除了附件之外還有其他用途? 🎜>switch ($msg_part->type)
{
情況0:
$mime_type = "text";
break;
情況1:
$mime_type = "multipart " ;
//嘿,為什麼不使用這個函數來處理所有部分
//這個多部分部分
$this->num_msg_parts = count($msg_part-> ;parts);
for ( $i = 0; $i num_msg_parts; $i )
{
if ($part_no != "")
{
$part_no = $part_no."." ;
}
for ($i = 0; $i parts); $i )
{
$ this->proc_struct($msg_part->parts[$ i ], $part_no.($i 1), $msg_num);
}
}
break;
情況2:
$mime_type = "message";
break;
情況3:
$mime_type = "application";
break;
情況4:
$mime_type = "audio" ;
break;
情況5:
$mime_type = "image";
break;
情況6:
$mime_type = "video";
break;
案例7:
$mime_type = "model";
break;
預設:
$mime_type = "unknown";
// 嗯....
}
$full_mime_type = $mime_type."/"。 msg_part->subtype;
$full_mime_type = strtolower($full_mime_type);
//決定你要做什麼有了這個部分
//如果你想顯示它,找出它,找出它,找出編碼並回顯
switch ($msg_part->encoding)
{
case 0:
情況1:
if ($this->num_msg_parts == 0 ){
echo ereg_replace("rn","
rn",imap_body($this->inStream,$ msg_num));
}
else{
if ( $ part_no!=""){
echo ereg_replace("rn","
rn",imap_fetchbody($ this->inStream,$msg_num,$part_no));} }break;情況3: //BASE64if ($full_mime_type= ="text/plain"){if ($this->num_msg_parts == 0 ){$content=imap_base64(imap_body($this->inStream,$msg_num));}
else{
$content = imap_base64(imap_fetchbody($this->inStream,$msg_num,$part_no));
$att_path = $this->使用者名稱 。 "\ 文字內容.txt";
$fp = fopen($att_path,"w");
fputs($fp,$content);
fclose($fp);
$this ->attach[$this->num_of_attach]="文字內容.txt";
$this->num_of_attach ;
}
echo $content;
}
if ($full_mime_type=="text/html"){
$att_path = $this-> ;使用者名稱。 "\超文本內容.htm";
$fp = fopen($att_path,"w");
fputs($fp,imap_base64(imap_fetchbody($this->inStream,$msg_num,$part_no) ) );
fclose($fp);
$this->attach[$this->num_of_attach]="超文本內容.htm";
$this->num_of_attach ;
}
break;
情況4: //QPRINT
//使用imap_qprint解碼
if ($this->num_msg_parts == 0){
echo ereg_replace("n" ,"
" ,imap_qprint(imap_body($this->inStream,$msg_num)));
}
else{
echo ereg_replace("n","",imap_fqprint(imap_fqbody($ this->inStream,$msg_num,$part_no)));
}
if ($full_mime_type=="text/html"){
$att_path = $this->使用者名稱。 "\qp超文本內容.htm";
$fp = fopen($att_path,"w");
fputs($fp,imap_base64(imap_fetchbody($this->inStream,$msg_num,$part_no) )));
fclose($fp);
$this->attach[$this->num_of_attach]="qp超內容文字.htm";
$this->num_of_attach ;
}
break;
情況5:
// 不確定這是否需要解碼
echo ereg_replace("n","
",imap_fetchbody($this- >inStream,$msg_num) );
break;
default:
//echo ereg_replace("n","
",imap_fetchbody($this->inStream,$msg_num, $part_no));
break ;
}
}
}
};
?>
myimap 的擴展類,及p讀一封郵件的範例(mail_read.php)
require("myimap.php");
class myimap_ext extends myimap {
function get_mail_ msg_no){
$msgHeader = @imap_header($this->inStream, $msg_no);
if (isset($msgHeader->subject))
$sub = trim($this->decode_mimi_string( $msgHeader->subject));
if ($sub == "")
$sub = "無主體";
return "轉寄:".$sub;
}
function print_attaches(){
for ($i=0;$i
echo "使用者名稱。 >函數list_attaches(){
for ($i=0;$i
if ($i==0)
$attaches = $ this->attach[$i];
else
$attaches .= ";".$this->attach[$i];
}
回傳$attaches;
}
}
$imap=new myimap_ext;
$imap->hostname="localhost";
$imap ->port=143;
$imap->username="name ";
$imap->userpwd="password";
$imap->open();
$mail_struct=$imap->get_struct($msg);
$imap->proc_struct($mail_struct,"",$msg);
if ($imap-> num_of_attach > 0){
$imap->print_attaches();
}
@$imap->print_attaches();
}
@ $imap->close();
?>
myimap 的範例(mail_list.php)
require("myimap.php");
require("myimap.php");
$imap=new myimap;
$imap->hostname="localhost ";
$imap->port=143;
$imap->username="name";
$ imap->userpwd="password";
$imap ->open();
if ($page=="") $page=0;
$imap->CheckMailBox(10 ,$page);
@$imap->close ();
?>
如何發送附件(轉)
我常聽到這樣一個問題:「我有一個從網站發來的合約。我如何為透過表單發送的增加一個附件呢? 」
首先我要說的是要做到這個沒有什麼簡單的電子郵件的方法。你要很好地理解PHP 或
其他伺服器端的腳本語言。當然你還要一個真正支援PHP的網站的帳號。手冊中搜尋過「附件」函數,那麼結果可能都沒有(至少在我寫論文的時間還沒有)。發送一封附件的電子郵件時,附件是和郵件一起達到實用的信箱裡的(例如,如果你給他/她發了一個PNG的圖片文件,他/她的信箱裡會包含一個txt文件(電子郵件)和一個.png文件(附件))。郵件)後面插入這個文字區塊。
以下是一個附附件(一個HTML檔案)電子郵件的範例。我已經標註了其中重要的幾行:
Return-Path:
Date: Mon, 22 May 2000 19:17:29 0000
From: Someone
To: Person
Message-id:
Content-type: multipart/mixed; boundary="396d983d6b89a"
Subject: Here's the subject Subject: Here's the subject Content-transfer-encoding: 8bit
This is the body of the email.
--396d983d6b89a
type: text/html; name=attachment.html
Content-disposition: inline; filename=attachment.html
Content-transfer-encoding: 8bit
This is the attached HTML file
--396d983d6b89a--
前面的7行是郵件的頭,其中值得注意的是Content-type頭部分。這個頭告訴郵件程式電子郵件是由一個以上的部分組成的。不含附件的郵件只有一個部分:訊息本身。附附件的電子通常至少由兩個部分組成:訊息和附件。這樣,帶兩個附件的郵件由三個部分組成:訊息,第一個附件和第二個附件。
附附件的電子郵件的不同部分之間用分界線來分隔。分界線在Content-type頭中定義。郵件的每個新部分以兩個連字號(--)和分界線開始。最後一個分界線後面也有兩個連字號,表示這個郵件中沒有其它的部分了。
在每個分界線後面有一些行,用來告訴郵件程式這個部分的內容的類型。例如,看看上面範例中第一個分界線後面的兩行--以Content-type: text/plain開頭的行。這些行說明後面的部分是ISO-8859-1字元集的純文字。跟在第二個分界線後的行告訴郵件程式現在的部分是一個HTML文件,它的名字是"attachment.html"。
Content-disposition這持告訴郵件程式如果可能就以內嵌的方式顯示附件。現在新的郵件程式會在訊息後面顯示HTML的內容。如果Content-disposition被設為attachment,那麼郵件程式就不會顯示HTML檔案的內容,而是顯示一個連接到檔案的圖示(或其它的類似的東西)。收件者要看附件的內容,必須點選這個圖示。一般情況下,如果附件是一些文字(包含HTML),Content-disposition會設為inline,這是因為現在大部分郵件程式能夠不借助其它瀏覽器而直接顯示附件(文字)的內容。如果附件不是文字(例如圖片或其它類似的內容),Content-disposition就設為attachment。
2. 用PHP產生附附件的電子郵件
這裡一個例子,告訴你如果把一個定義好的HTML檔加為郵件的附件:
php
# 我們先寫實際的訊息內容
$emailBody = "This is text that goes into the body of the email.";
# 然後我們要作為附件的HTML文件
$attachment = "
This is the attached HTML file
";
# 建立在郵件中分隔不同部分的分界線。
# 基本上,分界線可以是任意的字串。
# 但是重要的一點是確定一個寫郵件的人
# 這會隨意寫出的字串,所以我們用
# uniqid函數來產生一個隨機的字串。
$boundary = uniqid( "");
# 現在我們要建立郵件頭。不要忘了插入
# Content-type頭來說明這個郵件包含一個或更多的附件。
$headers = "From: [email]someone@example.com[/email]
Content-type: multipart/mixed; boundary="$boundary"";
# 好,現在我們已經有了郵件的所有內容。
# 下一件事是修改郵件的主體。
$emailBody = "--$boundary
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 8bit
$emailBody
--$boundary
Content-type: text/html; name=attachment.html
Content-disposition: inline; filename=attachment.html
Content-transfer-encoding: 8bit
$attachment
--$boundary--";
# 現在可以把郵件發出去了
mail( "[email]person@eksempel.dk[/email ]", "The subject", $emailBody, $headers);
?>
3. 把使用者上傳的檔案當作附件
你也許會覺得上面的例子難以理解,但下面...。在下面的例子中事情更難了,因為我們要用一個表單讓用戶上傳他們的文件,並把這個文件作為我們要發送的郵件的附件。麻煩的是我們不能預先知道檔案的MIME類型。在前面的範例中,我們已經知道該它是一個HTML文件,所以給這個附件設定Content-type頭是很簡單的。在下面的例子中,MIME類型可能是任意的,因為使用者可能會上傳一個HTML文件,一個PNG文件,一個vCard文件,或者其它的東西。讓我們來看看範例:
# 現在我們來產生表單。在產生可以上傳檔案的表單時,
# 不要忘了把 n";
# 如果使用者已經按了"Send"按鈕"
if ($send) {
# 定義分界線
$boundary = uniqid( "");
# 產生郵件頭
$headers = "From: $from
Content-type: multipart/mixed ; boundary="$boundary"";
# 決定上傳檔案的MIME類型
if ($attachment_type) $mimeType = $attachment_type;
# 如果瀏覽器沒有指定檔案的MIME類型,
# 我們可以把它設為"application/unknown".
else $mimeType = "application/unknown";
# 決定檔案的名字
$fileName = $attachment_name
# 開啟檔案
$fp = fopen($attachment, "r");
# 把整個檔案讀入一個變數
$read = fread($fp, filesize($attachment ));
# 好,現在變數$read中儲存的是包含整個檔案內容的文字區塊。
# 現在我們要把這個文字區塊轉換成郵件程式可以讀懂的格式
# 我們用base64方法把它編碼
$read = base64_encode($read);
#現在我們有一個用base64方法編碼的長字串。
# 下一件事是要把這個長字串切成由每行76個字元組成的小塊
$read = chunk_split($read);
# 現在我們可以建立郵件的主體
$body = "--$boundary
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 8bit
$body
--$boundary
Content-type: $mimeType; name=$fileName
Content-disposition: attachment; filename=$fileName
Content-transfer-encoding: base64
$read
--$boundary--";
# 寄信
mail($to, $subject, $body, $headers);
}
?>
這就是全部。如果你不能很好地理解上面的例子,我的建議是給你自己發送幾個附件的郵件,然後仔細研究郵件的原始碼。

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。

CSP重要因為它能防範XSS攻擊和限制資源加載,提升網站安全性。 1.CSP是HTTP響應頭的一部分,通過嚴格策略限制惡意行為。 2.基本用法是只允許從同源加載資源。 3.高級用法可設置更細粒度的策略,如允許特定域名加載腳本和样式。 4.使用Content-Security-Policy-Report-Only頭部可調試和優化CSP策略。

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

HTTPS是一種在HTTP基礎上增加安全層的協議,主要通過加密數據保護用戶隱私和數據安全。其工作原理包括TLS握手、證書驗證和加密通信。實現HTTPS時需注意證書管理、性能影響和混合內容問題。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

禪工作室 13.0.1
強大的PHP整合開發環境

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版
中文版,非常好用