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 タイプの電子メールを送信し、 HTML を送信できます形式 テキストと添付ファイルは、base64 でエンコードされます このバージョンは、複数人に送信する場合と異なり、ユーザーの観点からは毎回再エンコードされます。受信側は、その人に送信されるだけです。 複数人によるクラウド送信の場合、送信は 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; class smtp { var $ホスト名=""; 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($server="smtp.china.com",$port=25,$time_out) =20) {$this->hostname=$server; $this->gt;port=$port; $this->timeout=$time_out; return true; } 関数 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=$command." コマンド サーバーが無効なコマンドを返しました: ".$resp; return false; } else return true; } } 関数 open() { if($this->gt;hostname=="") {$this->err_str="無効なホスト名です!!"; return false; } if ($this->debug) echo "$this->ホスト名,$this->ポート,&$err_no, &$err_str, $this->;タイムアウト "; if (!$this->connection=fsockopen($this->ホスト名,$this->ポート,&$err_no, &$err_str, $this->タイムアウト) ) { $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; } } 関数ビルドヘッド ($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->gt;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_images=array( ); while (eregi("{ $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/popular; 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.="コンテンツ-タイプ: 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.="Content-Transfer-Encoding:base64rn"; $this->gt;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.="Content-Transfer-Encoding:base64rn"; $this->body.="rn".chunk_split(base64_encode(StripSlashes($this->temp_html_body)))."rn"; }//正文编码、有または無しテキスト部分、编成不同格式。 for ($i=0;$igt;temp_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->gt;body.="rn".chunk_split(base64_encode(StripSlashes($this->gt;temp_body_images[$i][data])))."rn"; } $ this->body.="--".$this->bound_begin.$bound_level.$this->bound_end."--rnrn"; $bound_level--; } else // 写真の有無、なし、上は写真の処理、下は写真のない処理 { $this->gt;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.= "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.="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.= "Content-Type: text/html;rn"; $this->body.="tcharset="$this->charset"rn"; $this->body.="コンテンツ-Transfer-Encoding:base64rn"; $this->body.="rn".chunk_split(base64_encode(StripSlashes($this->temp_html_body)))."rn"; }//正文コードは、テキスト部分の有無に応じて、異なる形式になります。 }// end else } else // HTML 本文がない場合はテキスト本文のみです { $this->body.="Content -タイプ: text /plain; tcharset="$this->charset"rn"; $this->body.="Content-Transfer-Encoding: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 バージョン: 1.0rn"; if (null==$att または ( @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<$num;$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 "; } }// $this->body.="--".$this->bound_begin.$bound_level.$this->bound_end の終了。 "--rnrn"; }// end else if ($this->debug) echo nl2br(htmlspecialchars($this->body)); return true; } 関数 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);//配列でない場合は、送信オブジェクトが 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->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("送信サブジェクト;"); 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; } }//クラス定義終了 }//終了 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]["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() 関数guessMIMEType($filename) { //MIME タイプを推測します $filename =basename($filename); if(strrchr($filename,".") == false) { return("application/octet-ストリーム") ; } $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 "アプリケーション /x-tar"; break; case ".txt": return "text/plain"; break; case ".zip": return "application /zip"; break; default: return "application/octet-stream"; break; } } 電子メール アドレスの検出 function IsValidEmail() 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 $to; var $headers; >var $subject ; var $body; /* * void mime_mail() * クラス コンストラクター */ function mime_mail() { $ this->parts = array(); $this->to = ""; $this->from = ""; ""; $this->body = ""; $this->headers = "" } /* * void add_attachment(文字列メッセージ) , [string name ], [string ctype]) * メール オブジェクトに添付ファイルを追加します */ function add_attachment($message, $name = "", $ctype = "application/octet- stream") { $this->parts[] = array ( "ctype" => $ctype, "message" => $message, "encode " => $encode, "name" => $name ); } /* * void build_message(配列部分= * ビルドマルチパートメールのメッセージ部分 */ 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) ->パーツ )-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("テスト.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类、读取邮件 /////////// ////////////////////////////////// //Origin by Alpha.Z (5/21/) 2000) //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->hostname."/pop3:110}inbox",$this->username,$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 " とサービス $this->hostname が切断されました。"; return 0; } } function DeleteMail($msg_no){ if (@imap_delete($this->inStream,$msg_no)) return true; else return 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->Unread.""; echo "新邮ブロック:".$mboxinfo->Recent."; 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"; エコー "状態态 < ;td>発行者主题 gt;時間 大 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) および ($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 = trim($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->メールボックス 。 '@' 。 $from->host; } else if (isset($msgHeader->fromaddress)) $frm = trim($h->fromaddress); } else if (isset($msgHeader->fromaddress)) $frm = trim($msgHeader->fromaddress); if (isset($msgHeader-> 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"; echo "$newmail n"; echo ''.$frm.' '.$sub.'< /a> '.$date.' '.$msg_size.' '; echo " n"; }} echo "
n"; echo "< ;tr>n"; if ($page == 0) echo "gt;第一页 n"; else echo " 第一页 n"; if (($prev_page = $page-1) echo "gt;前一页 n"; else echo "前一页 n"; if (($next_page = $page 1) >= $last_page) echo "後一页 n"; else echo "後一页 $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)); switch ($encoding) { case 'Q': case 'q': $encoded_text = str_replace('_', ' ', $encoded_text); $encoded_text = str_replace('=', '%', $ encoded_text); $decoded = urldecode($encoded_text); break; case 'B': case 'b': $decoded = urldecode(base64_decode($ encoded_text)); ブレーク; デフォルト: $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))); } Function get_barefrom($user, $server) { $barefrom = "$user@ $real_server"; return $barefrom; } Function get_ Structure($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->パラメータ); $lcv ) { $param = $msg_part->パラメータ[$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->ユーザー名)) mkdir($this->ユーザー名,0700); $fp=fopen($att_path,"w"); switch ($msg_part->encoding) { ケース 3: //base64 fputs($fp,imap_base64 (imap_fetchbody($this->inStream,$msg_num,$part_no))); break; ケース 4: // QP fputs($fp,imap_qprint(imap_fetchbody($this->gt; 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
{
// 添付ファイルではありません。この部分が何であるかを見てみましょうis...
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_struct($msg_part->parts[$i], $part_no.($i 1), $msg_num);
}
}
break;
ケース 2:
$mime_type = "メッセージ";
ブレーク;
ケース 3:
$mime_type = "アプリケーション";
ブレーク;
ケース 4:
$mime_type = "オーディオ" ;
break;
ケース 5:
$mime_type = "image";
break;
ケース 6:
$mime_type = "video";
break;
ケース 7:
$mime_type = "model";
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:
ケース 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->gt;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-> ;ユーザー名 。 "\超文本内容.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","< br>",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 = trim($this->decode_mime_string($msgHeader->subject));
if ($sub == "")
$sub = "主题";
return "Fw:".$sub;
}
function print_attaches(){
for ($i=0;$i
attach);$i ){ echo "ユーザー名."\".$this->attach[$i]."">".$this->attach[$i]." } } 関数 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_struction($msg); $imap->proc_struct($mail_structor,"",$msg); if ($imap-> num_of_attach > 0){ $imap->print_attaches(); } @$imap->close(); ?> myimap の例(mail_list.php) require("myimap.php"); $imap=new myimap; $imap->hostname="localhost "; $imap->port=143; $imap->username="名前"; $imap->userpwd="パスワード"; $imap ->open(); if ($page=="") $page=0; $imap->CheckMailBox(10,$page); @$imap->close (); ?> 添付ファイル(转)の送信方法 私たちは頻繁にこのような問題に遭遇しています:「私はネットステーションから発信している共同体を持っています。私はどのように通過しますか" まず最初に私が言いたいのは、このような単純なものではない方法です。PHP または のその他のサービス端末のスクリプトについてよく理解してください。また、PHP を真にサポートするウェブサイトの番号も必要です。この前提条件が満たされている場合は、この章の完了後に、PHP を使用してバンド アクセサリの送信を行うことができます。 アクセサリはどのように機能するかです。 以前に PHP のハンドラーで "アクセサリ" 関数を検索した場合、結果として何も存在しない可能性があります (少なくとも私がここで書いている時間には存在しません)。 はまた、特定の人から送信される予定のバンドル付属品の電子プラグを、付属品と一緒に受信者のボックスに置くことを許可します (例:ただし、PNG の画像ファイルが送信された場合、そのボックスには 1 つの txt ファイル (電子ファイル) と 1 つの .png ファイル (添付ファイル) が含まれます。添付ファイルを追加すると、送信者のプログラムは、その添付ファイルをテキスト ブック コンポーネントに変換し、送信されたコンテンツ (最新の電子プラグイン) の後にそのテキスト ブロックを挿入します。のボックスには、添付ファイルと最新の電子ソフトウェアの内容を含むファイルが 1 つだけ含まれています。 以下は、添付ファイル (HTML ファイル) を含むメールの例です。いくつかの重要な行をマークしました: Return-Path: <[email]someone@example.com[/email]> Date: Mon, 22 May 2000 19:17: 29 0000 差出人: 誰か 宛先: メッセージ ID: <[email]83729KI93LI9214@example.com[/email]> Content-type: multipart/mixed; border="396d983d6b89a" 件名: これが件名です - -396d983d6b89a Content-type: text/plain; charset=iso-8859-1 Content-transfer-encoding: 8bit これはメールの本文です。 --396d983d6b89a Content-type: text/html; name=attachment.html Content-disposition: inline; filename=attachment.html Content-transfer-encoding: 8bit < ;html> 添付ファイル これは添付された HTML ファイルです h2> --396d983d6b89a-- 最初の 7 行はメールのヘッダーです最も注目すべきは Content-type ヘッダー部分です。このヘッダーは、電子メールが複数の部分で構成されていることをメール プログラムに伝えます。添付ファイルのない電子メールには、メッセージ自体という 1 つの部分しかありません。添付ファイル付きの電子メールは、通常、メッセージと添付ファイルという少なくとも 2 つの部分で構成されます。このように、2 つの添付ファイルを持つメッセージは、メッセージ、最初の添付ファイル、2 番目の添付ファイルの 3 つの部分で構成されます。 添付ファイルのあるメールは、各部分を行で区切って区切ります。分割線は Content-type ヘッダーで定義されます。メッセージの新しいセクションはそれぞれ、2 つのハイフン (--) と区切り線で始まります。最後の分割線の後にも 2 つのハイフンがあり、電子メールに他の部分がないことを示しています。 各区切り文字の後に、このセクションのコンテンツの種類をメール プログラムに伝える行があります。たとえば、上の例の最初の分割線の後の 2 行、つまり Content-type: text/plain で始まる行に注目してください。これらの行は、その後に続くのが ISO-8859-1 文字セットのプレーン テキストであることを示しています。 2 番目の区切り文字に続く行は、現在のセクションが HTML ファイルであり、その名前が「attachment.html」であることをメール プログラムに伝えます。 Content-disposition は、可能であれば添付ファイルをインラインで表示するように電子メール プログラムに指示します。新しい電子メール プログラムでは、メッセージの後に HTML コンテンツが表示されるようになりました。 Content-disposition が添付ファイルに設定されている場合、メール プログラムは HTML ファイルの内容を表示しませんが、ファイルに関連付けられたアイコン (または類似のもの) を表示します。添付ファイルの内容を表示するには、受信者はこのアイコンをクリックする必要があります。通常の状況では、添付ファイルがテキスト (HTML を含む) の場合、Content-disposition はインラインに設定されます。これは、ほとんどの電子メール プログラムが他のブラウザを使用せずに添付ファイル (テキスト) のコンテンツを直接表示できるためです。添付ファイルがテキスト (画像やその他の同様のコンテンツなど) ではない場合、Content-disposition は添付ファイルに設定されます。 2. PHP を使用して添付ファイル付きの電子メールを生成します。 定義された HTML ファイルを電子メールに添付ファイルとして追加する方法の例を示します。 # 最初に実際のメッセージの内容を記述します $emailBody = "これはメールの本文に入るテキストです。"; # 次に HTML ファイルを添付します $attachment = " 添付ファイル
"; # メールのさまざまな部分を区切る分割線を作成します。 # 基本的に、分割線は任意の文字列にすることができます。 # ただし、重要な点はメールを書いた人を特定することです。 # これではランダムな文字列が書き込まれるため、 # uniqid 関数を使用してランダムな文字列を生成します。 $boundary = uniqid( ""); # 次に、電子メール ヘッダーを作成する必要があります。このメールに 1 つ以上の添付ファイルが含まれていることを示すために、 # Content-type ヘッダーを忘れずに挿入してください。 $headers = "From: [email]someone@example.com[/email] Content-type: multipart/mixed; border="$boundary""; # それでは、メールの内容はすべてすでにわかっています。 # 次に行うことは、メールの本文を変更することです。 $emailBody = "--$boundary コンテンツ タイプ: text/plain; charset=iso-8859-1 コンテンツ転送エンコーディング: 8 ビット $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 ] ", "件名", $emailBody, $headers); ?> 3. ユーザーがアップロードしたファイルを添付ファイルとして添付する 上の例は理解しにくいかもしれませんが、以下は...以下の例では、フォームを使用してユーザーがファイルをアップロードし、送信する電子メールにそのファイルを添付できるようにしているため、状況はさらに困難になります。問題は、ファイルの MIME タイプが事前にわからないことです。前の例では、それが HTML ファイルであることがすでにわかっていたため、この添付ファイルの Content-type ヘッダーの設定は簡単でした。以下の例では、ユーザーが HTML ファイル、PNG ファイル、vCard ファイルなどをアップロードする可能性があるため、MIME タイプは任意である可能性があります。例を見てみましょう: # 次に、フォームを生成しましょう。ファイルをアップロードできるフォームを生成するときは、 # n"; # ユーザーが「送信」ボタンを押した場合" if ($send) { # 境界を定義します $boundary = uniqid( ""); # 電子メールヘッダーを生成します $headers = "From: $from Content-type: multipart/mixed; border="$boundary""; # アップロードされたファイルの MIME タイプを決定します if ($attachment_type) $mimeType = $attachment_type; # ブラウザがファイルの MIME タイプを指定しない場合は、 # 「application/unknown」に設定できます。 $mimeType = "application/unknown" ; # ファイルの名前を決定します $fileName = $attachment_name; # ファイルを開きます $fp = fopen($ attachment, "r"); # ファイル全体を変数に読み込みます $read = fread($fp, filesize($attachment)); # さて、変数 $readファイルの内容全体を含むテキスト ブロックを保存します。 # 次に、このテキスト ブロックをメール プログラムが読み取れる形式に変換する必要があります。 # Base64 メソッドを使用してエンコードします。 $read =base64_encode($read); # これで、base64 メソッドを使用してエンコードされた長い文字列ができました。 # 次に、この長い文字列を 1 行あたり 76 文字で構成される小さなチャンクに分割します。 $read = chunk_split($read); # これでメールの本文を構築できます。 $body = "--$boundary コンテンツタイプ: text/plain; charset=iso-8859-1 コンテンツ転送エンコーディング: 8 ビット $body --$boundary コンテンツタイプ: $mimeType; name=$fileName コンテンツの性質: 添付ファイル名=$fileName コンテンツ転送エンコーディング: Base64 $read --$boundary--"; # 電子メールを送信 mail($to, $subject, $body, $headers); } ?> 以上です。上記の例がよく理解できない場合は、添付ファイル付きの電子メールを何通か自分に送信し、その電子メールのソース コードを注意深く調べることをお勧めします。