PHPメールトピック
PHP SMTP クラス /**************************************** PHP MIMESMTP ver 1.0 Powered by Boss_ch, Unigenius software co. Ltd All Rights Reserved, Copyright 2000; このクラスは、PHP を使用して smtp sock 操作を通じて MIME タイプの電子メールを送信し、base64 エンコードを使用して HTML 形式のテキストと添付ファイルを送信できます。 このバージョンは、個人送信バージョンと複数人送信バージョンの違いは、1 人に送信されるたびに再エンコードされ、受信側のユーザーの観点からのみ送信されることです。彼。 複数の人がメッセージを送信する状況では、メッセージは 1 回だけ送信され、複数の RCPTTO コマンドを通じて異なる人のメールボックスに送信されます。 手順: $hostname を、権限のあるデフォルトの SMTP サーバーとして設定するか、新規作成時に指定してください。 $charset をデフォルトの文字セットに設定します HTML テキストに画像がある場合は、絶対パス参照「httP://host/path/image.gif」を使用してください。 プログラムが読み取れることを確認するためにインターネットに接続してください。画像 データ情報 フォームから送信された HTML テキストの場合は、最初に StripSlashes($html_body) を使用してテキスト コンテンツを前処理してください Html で使用されるスタイル シート ファイルについては、 などの参照を直接使用しないでください。スタイルシート定義を タグに入れてください この著作権情報は転載のために保存してください、バグレポート: [email]boss_ch@china.com[/email] ***** *********************************/ if(!isset($__smtp_class__)){ $__smtp_class__=1 ; クラス 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_"; var $bound_end="_046484063883_====="; 関数 smtp($サーバー = "smtp.china.com",$port=25,$time_out=20) {$this->hostname=$server; $this->port=$port; $this->タイムアウト= $time_out; return true; } Function outdebug($message) { echo htmlspecialchars($message)." n"; } function command($command,$return_lenth= 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=$ コマンド。" コマンド サーバーが無効を返しました: ".$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->タイムアウト "; if (!$this->connection=fsockopen($this->ホスト名,$this->ポート) ,& $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; } } 関数 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)."? =<$from_mail> ;rn"; $this->subject.="To: =?$this->charset?B?".base64_encode($to_name)."?=<$to_mail>rn" ; $subject= ereg_replace("n","",$subject); $this->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_images=array(); while (eregi("<*img([ ^>]+)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); //echo $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) ); // 画像データを 1 つのデータに保存します; $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($image_tag,strrpos($image_tag,'.')+1,3); switch (strto lower($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 ; return true; } function build_content($bound_level=0,$text_body,$html_body,$hava_att=false) { if ($html_body) { if (eregi("<*img[ [:space:]]+src[[:space:]]*=[[:space:]]*([^ ]+)",$html_body,$reg)) { $bound_level++; if ($ text_body) { $this->body.="Content-Type: multipart/relative; type="multipart/alternative"; tboundary=""; $this->body.=$this-> ;bound_begin.$bound_level.$this->bound_end.""rnrn"; } else { $this->body.="Content-Type: multipart/popular; 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.="Content-Type: multipart/alternative; tboundary=""; $bound_level++; $this->body.=$this->bound_begin .$bound_level.$this->bound_end.""rnrn"; $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->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.="--".$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;$itemp_body_images);$i++) { $this->body.="--".$this->bound_begin.$bound_level. $this->bound_end."rn"; $this->body.="Content-Type:".$this->temp_body_images[$i][type]."; name=""; $this->body.=$this->temp_body_images[$i][name].""rn"; $this->body.="Content-Transfer-Encoding:base64rn"; $this- >body.="Content-ID: <".$this->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 形式のマルチパート メッセージです.rnrn"; $this->body.="--".$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.="Content-Transfer-Encoding:base64rn"; $this->body.="rn".chunk_split(base64_encode(StripSlashes($this->temp_html_body)) ))."rn"; }// 正文コード、テキスト部分の有無にかかわらず、異なる形式になります。 }// end else } else // HTML本文がない場合はテキスト本文のみ { $this->body.="Content-Type: text/plain; tcharset="$this- > 文字セット"rn"; $this->body.="コンテンツ転送エンコーディング:base64rn"; $this->body.="rn".chunk_split(base64_encode(StripSlashes($text_body))) ." rn"; } }// 関数のデフォルトを終了 Function Buildbody($text_body=null,$html_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.="これは MIME 形式のマルチパート メッセージです。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] [ソース]; $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->gt;bound_begin.$bound_level.$this->bound_end."rn"; $this->body.="Content-Type: $file_type;rntname="$file_name"rnContent-Transfer -エンコーディング: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->body)); return true; } function send($from_name,$to_name,$from_mail,$to_mail,$ subject,$text_body=false,$ html_body=false,$att=false) { if (empty($from_mail) または empty($to_mail)) { $this->err_str="正しいメール アドレス指定されていません: 送信者:". $from_mail."受信者:".$to_mail; return false; } if (gettype($to_mail)!="array") $to_mail=split(",", $to_mail);//if 送信オブジェクトが 1 つしかない場合でも、配列でない場合は配列に変換します if (gettype($to_name)!="array") $to_name=split(" ,",$to_name);// 配列でない場合は、送信オブジェクトが 1 つしかない場合でも、配列に変換します; $this->Buildbody($text_body,$html_body,$att); //すべてのレターの内容は同じで、一度だけ編集できますが、受信者が異なる場合は、異なるヘッドが必要です 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->ホスト名",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("本文を送信中;"); 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定義 }//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 = "会いたいです"; $content = "とても会いたいです。"; $att[ 0]["名前"] = "miss.jpg"; $att[0]["ソース"] = "/path/to/your/miss.jpg"; $att[0]["タイプ"] = "画像/jpeg"; $att[0]["サイズ"] = "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() functionguessMIMEType($filename) { //GUESS MIME TYPE $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() 関数 IsValidEmail($Email) { if(!ereg("^[[:alnum:]_.]+@([[:alnum:]_]+.)+ [[:alnum:]][[:alnum:]][[:alnum:]]?$",$Email, $regs)){ $IsValidEmail = false; } else { $IsValidEmail = true ; } return $IsValidEmail; } 一个MIMEメール类、请大家注意 どのように一个邮件体を造るのか class mime_mail { var $parts; var $to; var $from; var $headers; var $subject; var $body; /* * void mime_mail() * クラスコンストラクター */ 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]) * メールオブジェクトに添付ファイルを追加します */ function add_attachment($message, $name = "", $ ctype = "application/octet-stream") { $this->parts[] = array ( "ctype" => $ctype, "message" => $message, "encode" => ; $encode, "name" => } /* * void build_message(array part= * マルチパートメールのメッセージ部分を構築する */ function build_message($part) { $message = $part["message"]; $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() * マルチパートメールを構築する */ function build_multipart() { $boundary = "b".md5(uniqid(time())); $multipart = "Content-Type: multipart/mixed;ntboundary="$boundary"nnこれは MIME エンコードされたメッセージです.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 () * メールを送信します (最後に呼び出されるクラス関数) */ 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("test.jpg")); $mail = 新しい 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类、读取邮件 /////////////////////////// /////////////////// //Origin by Alpha.Z (5/21/2000) //Modified By Belltree <[email]belltree@163.com [/email]> (2000/11/01) ///////////////////////////////////////// ///// 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 ($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->username の信箱接続成功。 "; return $inStream; } else { echo "用人:$this->username の信箱接続失敗。 "; return 0; } } Function close() { if(imap_close($this- >inStream)) { //echo " すでにサーバー $this->hostname と接続しています。"; return 1; } else { //echo " "; return 0; } } function DeleteMail($msg_no){ if (@imap_delete($this->inStream,$msg_no)) true を返す; else false を返す; } function ExpungeMail(){ if (@imap_expunge($this->inStream)) return true; else return false; } function CheckMailbox($page_size,$page) { $mboxinfo=@imap_mailboxmsginfo($this->inStream); //$mboxinfo=imap_check($this->inStream); if ($mboxinfo) if ($mboxinfo->Nmsgs>0) { //echo "您邮箱:".$mboxinfo->Mailbox." "; echo $this->username."@wells.com の收件箱里共有邮ブロック:".$ mboxinfo->Nmsgs." n"; echo "未读邮ブロック:".$mboxinfo->未読。""; 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 "状態态 発行者< /td> 主题 時間 大小 < n"; $sortby="SORTDATE"; $sort_reverse=1; $sorted = imap_sort($this->inStream, $sortby, $sort_reverse, SE_UID); for ($i=0;$i<$mboxinfo->Nmsgs;$i++) { if (($i>=$page*$page_size) and ($i<$page*$page_size+$page_size)){ $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); $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->personal)) { $frm = トリム($this->decode_mime_string($from->personal)); if (isset($from->mailbox) && isset($from->host)) { $frm_add = $from->メールボックス . '@' 。 $from->host; } } else if (isset($from->mailbox) && isset($from->host)) { $frm = $from->mailbox . '@' 。 $from->host; } else if (isset($msgHeader->fromaddress)) $frm = trim($h->fromaddress); } else if (isset($msgHeader- >fromアドレス)) $frm = trim($msgHeader->fromaddress); if (isset($msgHeader->toaddress)) $to = trim($msgHeader->toaddress); else $to = "未知"; if (isset($msgHeader->subject)) $sub =rim($this->decode_mime_string($msgHeader->subject)); if ($sub = = "") $sub = "無し主题"; if (isset($msgHeader->サイズ)) $msg_size = ($msgHeader->サイズ > 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" ; echo "$newmail n"; echo ''.$frm.'< /td> '.$sub.' '.$msg_size.' '; echo " n"; }} echo "< ;/table>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 "後一页 < ;/td>n"; $last_page --; if ( $last_page < $next_page) echo "最終页 n"; else echo "最終页 n"; echo "
n"; } function decode_mime_string ($string) { $pos = strpos($string, '=?'); if (!is_int($pos)) { return $string; } $preceding = substr($string, 0, $pos); // 先行するテキストを保存します $search = substr($string, $pos+2, 75); // MIME ヘッダーの仕様によれば、これは 1 つのエンコードされた単語の最長です $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)); スイッチ ($encoding) { case 'Q': case 'q': $encoded_text = str_replace('_', '%20', $encoded_text) ; $encoded_text = str_replace('=', '%', $encoded_text); $decoded = urldecode($encoded_text); break; case 'B': case 'b': $decoded = urldecode (base64_decode($encoded_text)); break; default: $decoded = '=?' 。 $charset 。 「?」 。 $エンコーディング 。 「?」 。 $encoded_text 。 '?='; break; } return $preceding 。 $decode 。 $this->decode_mime_string($rest); } Function 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->inStream,$msg_num); //echo gettype($struct); return $ Structure; } Function proc_struct($msg_part, $part_no, $msg_num) { if ($msg_part->ifdisposition) { // 性質があるかどうかを確認してください。私が知っている唯一のことは、これが添付ファイルに使用されることです // とにかく確認しましょう if ($ msg_part->disposition == "attachment") { $att_name = "unknown"; for ($lcv = 0; $lcv < count($msg_part->parameters); $lcv++) { $ param = $msg_part->parameters[$lcv]; if ($param->attribute == "name") { $att_name = $param->value; break; } } $att_name = $this->decode_mime_string($att_name); $att_path = $this->username."\".$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->username)) mkdir($this- > ユーザー名,0700); $fp=fopen($att_path,"w"); switch ($msg_part->encoding) { case 3: //base64 fputs($fp,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; default : fputs($fp,imap_fetchbody($this->inStream,$msg_num,$part_no)); break; } fclose($fp); //if ($msg_part->type=="5"){ // echo "
n"; // echo " n"; //} } // END IF ATTACHMENT else //NOT ifdisposition { // 添付ファイル以外にも使われるのかな?? ?? } } else { // 添付ファイルではありません。この部分が何であるかを見てみましょう... switch ($msg_part->type) { case 0: $mime_type = "text"; break; case 1: $mime_type = "multipart"; // この関数を使用して、このマルチパート パートのすべてのパートを処理してみてはいかがでしょうか // $this->num_msg_parts = count($msg_part ->parts); for ($i = 0; $i < $this->num_msg_parts; $i++) { if ($part_no != "") { $part_no = $part_no." ."; } for ($i = 0; $i < count($msg_part->parts); $i++) { $this->proc_ Structure($msg_part->parts[$i] 、$part_no.($i + 1), $msg_num); } } break; case 2: $mime_type = "メッセージ"; break; case 3: $mime_type = "アプリケーション"; ブレーク; ケース 4: $mime_type = "オーディオ"; ブレーク; ケース 5: $mime_type = "画像"; ブレーク; ケース 6: $mime_type = "ビデオ"; ブレーク; ケース 7 : $mime_type = "モデル"; break; default: $mime_type = "unknown"; // うーん.... } $full_mime_type = $mime_type."/".$msg_part-> subtype; $full_mime_type = strto lower($full_mime_type); // この部分をどうするかを決めてください // 表示したい場合は、エンコーディングを理解してエコーしてください switch ($msg_part- >encoding) { case 0: case 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: //BASE64 if ($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->username 。 "\文本内容.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->username . "\超文本内容.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; case 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_qprint(imap_fetchbody($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の扩展类、および读取一封邮件の例(mail_read.php) require("myimap.php"); class myimap_ext extends myimap { function get_mail_subject($msg_no){ $msgHeader = @imap_header($this->inStream, $msg_no); if (isset($msgHeader->subject)) $sub = トリム($this->decode_mime_string($msgHeader->subject) )); if ($sub == "") $sub = "主题"; return "Fw:".$sub; } function print_attaches(){ for ($i=0;$iattach);$i++){ echo "ユーザー名."\".$this->attach[$i]."">gt;".$this->attach[$i]." "; } } function list_attaches(){ for ($i=0;$iattach);$i++){ if ($i==0) $attaches = $this->attach[ $i]; else $attaches .= ";".$this->attach[$i]; } return $attaches; } } $imap=new myimap_ext; $imap-> ;hostname="localhost"; $imap->port=143; $imap->username="名前"; $imap->userpwd="パスワード"; $imap->open( ); $mail_struct=$imap->get_ Structure($msg); $imap->proc_struct($mail_struct,"",$msg); if ($imap->num_of_attach > 0){ $imap->print_attaches(); } @$imap->close(); ?> myimapの例(mail_list.php) require("myimap.php" ); $imap=新しいmyimap; $imap->hostname="localhost"; $imap->port=143; $imap->username="name"; $imap-> userpwd="パスワード"; $imap->open(); if ($page=="") $page=0; $imap->CheckMailBox(10,$page); @$imap ->close(); ?> アクセサリ(转)をどのように送信するか「付属品ですか?」 まず最初に、このような厳密な方法はありません。PHP またはその他のサーバー端末の説明をよく理解しておく必要があります。当然、PHP を正しくサポートするウェブサイトの番号も必要です。この前提条件が満たされていれば、この章の完了後に、PHP を使用してバンド アクセサリの電子コンポーネントを送信できます。 アクセサリがどのように機能するかは、PHP のハンドヘルドで「アクセサリ」関数を検索した場合、結果として何も存在しない (少なくともここで書いている時間には存在しない) 可能性があります。この点については、特定の人が電子アクセサリを送信することを想定している場合、そのアクセサリは、そのアクセサリとともに受信者のボックスに置かれることも許可されています。 1 つの PNG の写真ファイルがあり、他のファイルのボックスには 1 つの txt ファイル (電子ファイル) と 1 つの .png ファイル (アクセサリ) が含まれます。プログラムは、添付ファイルを本書の正規のファイルに変換し、すべてのコンテンツが送信された後、そのファイルをこのファイルに挿入します。 -- アクセサリと実際の電子ソフトウェアのコンテンツを同時に含むファイル。 以下は、添付ファイル (HTML ファイル) を含むメールの例です。いくつかの重要な行をマークしました: Return-Path: <[email]someone@example.com[/email]> Date: Mon, 22 May 2000 19:17:29 +0000 From: Someone < [email]someone@example.com[/email]> 宛先: 人 <[email]person@eksempel.dk[/email]> メッセージ ID: <[email]83729KI93LI9214@example .com[ /email]> Content-type: multipart/mixed; border="396d983d6b89a" Subject: 件名は次のとおりです --396d983d6b89a Content-type: text/plain; -encoding: 8bit これはメールの本文です --396d983d6b89a Content-type: text/html; name=attachment.html Content-disposition: filename=attachment.htmlエンコード: 8bit ;