PHPメールトピック

WBOY
リリース: 2016-06-13 12:43:39
オリジナル
1102 人が閲覧しました


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 "n";
echo '';
echo "n";
}}
echo "
状態态 主题時間
$newmail'.$frm.''.$sub.'< /a>'.$date.''.$msg_size.'
n";
echo "< ;tr>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 "n";
else
echo "n";
echo "
gt;第一页 第一页gt;前一页前一页後一页後一页$last_page --;
if ( $last_page < $next_page)
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;$iattach);$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 ファイルです


--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 タイプは任意である可能性があります。例を見てみましょう:

# 次に、フォームを生成しましょう。ファイルをアップロードできるフォームを生成するときは、
#
タグの "enctype" 属性を "multipart/form-data" に設定することを忘れないでください。
echo "n";
echo "
n";
echo "
n";
echo "echo "
n";
echo "