PHP メール トピック_PHP チュートリアル

WBOY
リリース: 2016-07-21 16:08:33
オリジナル
834 人が閲覧しました


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 "<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 "n";
echo '';
echo "n";
}}
echo "< ;/table>n";
echo "
状態态発行者< /td>主题時間大小
$newmail'.$frm.'< /td>'.$sub.''.$msg_size.'
>

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 "
第一页第一页前一页前一页後一页後一页< ;/td>n";
$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));

スイッチ ($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

<br></head> <br><h2> ; <br></body> <br></html> <br><br>--396d983d6b89a-- <br><br><br><br> 最初の 7 行は、Content-type ヘッダー部分に注目してください。このヘッダーは、電子メールが複数の部分で構成されていることをメール プログラムに伝えます。添付ファイルのない電子メールには、メッセージ自体という 1 つの部分のみが含まれます。添付ファイル付きの電子メールは通常、メッセージと添付ファイルという少なくとも 2 つの部分で構成されます。このように、2 つの添付ファイルを持つメッセージは、メッセージ、最初の添付ファイル、2 番目の添付ファイルの 3 つの部分で構成されます。 <br><br>添付ファイルのあるメールは、複数の部分を行で区切って区切ります。分割線は Content-type ヘッダーで定義されます。メッセージの新しいセクションはそれぞれ、2 つのハイフン (--) と区切り線で始まります。最後の分割線の後にも 2 つのハイフンがあり、電子メールに他の部分がないことを示しています。 <br><br>各分割線の後には、このセクションのコンテンツの種類をメール プログラムに伝えるいくつかの行があります。たとえば、上の例の最初の分割線の後の 2 行、つまり Content-type: text/plain で始まる行に注目してください。これらの行は、その後に続くのが ISO-8859-1 文字セットのプレーン テキストであることを示しています。 2 番目の区切り文字に続く行は、現在のセクションが HTML ファイルであり、その名前が「attachment.html」であることをメール プログラムに伝えます。 <br><br>Content-disposition は、可能であれば添付ファイルをインラインで表示するように電子メール プログラムに指示します。新しい電子メール プログラムでは、メッセージの後に HTML コンテンツが表示されるようになりました。 Content-disposition が添付ファイルに設定されている場合、メール プログラムは HTML ファイルの内容を表示しませんが、ファイルに関連付けられたアイコン (または類似のもの) を表示します。添付ファイルの内容を表示するには、受信者はこのアイコンをクリックする必要があります。通常の状況では、添付ファイルがテキスト (HTML を含む) の場合、Content-disposition はインラインに設定されます。これは、ほとんどの電子メール プログラムが他のブラウザを使用せずに添付ファイル (テキスト) のコンテンツを直接表示できるためです。添付ファイルがテキスト (画像やその他の同様のコンテンツなど) ではない場合、Content-disposition は添付ファイルに設定されます。 <br><br>2. PHP を使用して添付ファイル付きの電子メールを生成します<br><br>ここでは、定義された HTML ファイルを電子メールに添付ファイルとして追加する方法を示す例を示します: <br><br><?php <br># 最初に実際のメッセージのコンテンツを記述しましょう<br> $emailBody = "これはメールの本文に入るテキストです。"; <br><br># 次に、HTML ファイルを添付ファイルとして必要とします <br>$attachment = "<html> <br><head> <br><title>添付ファイル
これは添付されたHTMLファイルです

# on メッセージのさまざまな部分を区切る分割線。
# 基本的に、分割線は任意の文字列にすることができます。
# ただし、重要な点は、メールを書いた人を特定することです
# これではランダムな文字列が書き込まれるため、
# uniqid 関数を使用してランダムな文字列を生成します。
$boundary = uniqid( "");

# 次に、電子メールのヘッダーを作成する必要があります。このメールに 1 つ以上の添付ファイルが含まれていることを示すために、
# Content-type ヘッダーを挿入することを忘れないでください。
$headers = "From: [email]someone@example.com[/email]
Content-type: multipart/mixed; border="$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 ヘッダーの設定は簡単でした。以下の例では、ユーザーが HTML ファイル、PNG ファイル、vCard ファイルなどをアップロードする可能性があるため、MIME タイプは任意である可能性があります。例を見てみましょう:

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

# ユーザーが「送信」ボタンを押した場合"
if ($send ) {
# 境界を定義します
$boundary = uniqid( "");

# メールヘッダーを生成します
$headers = "From: $from
Content-type: multipart/mixed; border="$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 を使用してエンコードされたロング メッセージが得られます。メソッド文字列。
# 次に、この長い文字列を 1 行あたり 76 文字で構成される小さなチャンクに分割します
$read = chunk_split($read);

# これでメールの本文を作成できます
$body = " --$境界
コンテンツ タイプ: text/plain;
コンテンツ転送エンコーディング: 8 ビット

$body

--$boundary
コンテンツ タイプ: $mimeType name=$fileName
Content-性質:attachment; filename=$fileName
Content-transfer-encoding:base64

$read

--$boundary--";

# メールを送信
mail($to, $subject, $body, $headers) ;
}
?> 以上です。上記の例がよく理解できない場合は、添付ファイル付きの電子メールを何通か自分に送信し、その電子メールのソース コードを注意深く調べることをお勧めします。



http://www.bkjia.com/PHPjc/314797.html
www.bkjia.com

tru​​ehttp://www.bkjia.com/PHPjc/314797.html技術記事 PHP メールトピック PHP SMTP クラス? /*********************************** PHP MIMESMTP ver 1.0 Powered by Boss_ch 、Unigenius software co. Ltd 著作権所有、著作権 2000; このカテゴリは使用されています...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート