smtp
/***********************************
PHP MIME SMTP ver 1.0 Powered by Boss_ch, Unigenius software co. Ltd
All Rights Reserved, Copyright 2000;
このクラスは、PHP を使用して、smtp および sock 操作を通じて MIME タイプの電子メールを送信できます。
このバージョンは、base64 エンコードを使用して、個別に送信するためのものです。複数人バージョン。唯一のことは、受信側のユーザーの観点からは、それが個人に送信されるたびに再エンコードされるということです。
複数の人が送信する状況では、送信は 1 回だけ行われ、複数の RCPT TO コマンドを通じて別の人のメールボックスに送信されます。
手順:
$hostname を権限のあるデフォルトの SMTP サーバーとして設定するか、新規作成時に指定してください。 $charset をデフォルトの文字セットに変更します
Html テキストに画像がある場合は、絶対パス参照 "httP://host/path/image.gif" を使用してください
そしてプログラムが確実に実行できるようにインターネットに接続します。お読みください 画像データ情報
フォームから送信されたHTMLテキストの場合は、最初にStripSlashes($html_body)を使用してテキストコンテンツを前処理してください
HTMLで使用されるスタイルシートファイルについては、を使用しないでください。スタイル シート定義を
タグ内に直接保存してください。バグ レポート: Boss_ch@china.com
********** *** ***********************/
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="GB2312";
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->port=$port;
$this->timeout=$time_out;
return true;
関数 outdebug($message)
{
echo htmlspecialchars($message)."
n";
関数コマンド($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
}
else
{
$resp=fgets;接続,256);
if($this->debug)
$this->outdebug("$resp");
if (substr($resp,0,$return_lenth)!=$return_code)
{
$this->err_str=$command." コマンド服务器は返無效:".$resp;
return false;
}
else
return true;
}
}
Function open()
{
if($this->hostname=="")
{$this->err_str="無效的ホスト名!!";
return false
}
if ($this->debug) echo "$this->hostname,$this->port, &$err_no, &$err_str, $this->タイムアウト
";
if (!$this->connection=fsockopen($this->ホスト名,$this->ポート,&$err_no, &$err_str, $this->timeout))
{
$this->err_str="接続到SMTP サービス务器失败,错误信息:".$err_str."错误号:".$err_no;
}
else
{
$resp=fgets($this->connection,256)
if($this->debug)
$this->outdebug("$resp"); ($resp,0,1)!="2")
{$this->err_str="服务器返無效的信息:".$resp."请检查SMTP 服务器が正确を返す";
true を返す
}
}
関数 Close()
{
if($this->connection!=0)
{
fclose($this->connection); =0;
}
}
関数 Buildhead($from_name,$to_name,$from_mail,$to_mail,$subject)
{
if (empty($from_name))
$from_name=$from_mail; $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));
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";
休憩;
ケース "gif":
$content_type="image/gif";
休憩;
ケース "png":
$content_type="image/x-png";
休憩;
ケース "tif":
$content_type="image/tif";
休憩;
デフォルト:
$content_type="image/";
休憩;
}
$this->temp_body_images[$image_count][name]=basename($image_tag);
$this->temp_body_images[$image_count][type]=$content_type;
$this->temp_body_images[$image_count][cid]=$cid;
$this->temp_body_images[$image_count][data]=$image_data;
$image_count++;
}
$this->temp_html_body=$passed.$html_body;
true を返します。
}
function build_content($bound_level=0,$text_body,$html_body,$hava_att=false)
{
if ($html_body)
{
if (eregi("<*img[[:space:] ]+src[[:space:]]*=[[:space:]]*([^ ]+)",$html_body,$reg))
{
$bound_level++;
if ($text_body)
{
$this->body.="Content-Type: multipart/relative;
type="multipart/alternative";
boundary="";
$this->body.= $this->bound_begin.$bound_level.$this->bound_end.""rnrn";
}
else
{
$this->body.="Content-Type: multipart/popular;
boundary="";
$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;
boundary="";
$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.="charset="$this->charset"rn";
$this->body.="コンテンツ転送エンコーディング: Base64 rn";
$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.="charset="$this->charset"rn";
$this->body.="コンテンツ転送エンコーディング: Base64 rn";
$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.="charset="$this->charset"rn";
$this->body.="コンテンツ転送エンコーディング: Base64 rn";
$this->body.="rn".chunk_split(base64_encode(StripSlashes($this->temp_html_body)))."rn";
} //正文コード、テキスト部分の有無、異なる形式になります。
for ($i=0;$i
{
$this-> ;body.="--".$this->bound_begin.$bound_level.$this->bound_end."rn";
$this->body.="Content-Type:".$this->temp_body_images[$i][type].";
name="";
$this->body.=$this- >temp_body_images[$i][名前].""rn";
$this->body.="コンテンツ転送エンコーディング: 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;
boundary="";
$this->body.=$this->bound_begin.$bound_level.$this->bound_end. ""ルンルン";
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.="charset="$this->charset"rn";
$this->body.="コンテンツ転送エンコーディング: Base64 rn";
$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.="charset="$this->charset"rn";
$this->body.="コンテンツ転送エンコーディング: Base64 rn";
$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.="charset="$this->charset"rn";
$this->body.="コンテンツ転送エンコーディング: Base64 rn";
$this->body.="rn".chunk_split(base64_encode(StripSlashes($this->temp_html_body)))."rn";
} //正文コード、有または無 text 部分、別の形式。
} // end else
}
else // 場合は無有 html 正文、ただ有 text 正文
{
$this->body. ="Content-Type: text/plain;
charset="$this->charset"rn";
$this->body.="コンテンツ転送エンコーディング: Base64 rn";
$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;
boundary="";
$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][名前];
$file_source=$att[$i][ソース];
$file_size=$att[$i][サイズ]; ;
if (file_exists($file_source))
{
$file_data=addslashes(fread($fp=fopen($file_source,"r"), filesize($file_source))); StripSlashes($file_data)));
$this->body.="--".$this->bound_begin.$bound_level.$this->bound_end."rn"; .="Content-Type: $file_type;rn name="$file_name"rnContent-Transfer-Encoding:base64rn";
$this->body.="Content-Disposition:attachment; filename="$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); );
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; false;
}
if (gettype($to_mail)!="array")
$to_mail=split(",",$to_mail); //如果不是数组,转换成数组,哪怕只有一送信对象; if (gettype($to_name)!="array")
$to_name=split(",",$to_name); //如果不是数组,转换成数组,哪怕只有一個送对象
$this-> Buildbody($text_body,$html_body,$att);
// すべての情報の内容は一意であり、異なる信人に対してのみ可能です。Head
if (!$this-> open()) return false
if (!$this->command("HELO $this->hostname",3,"250")) return false
// 与服务器建立链接
if (!$ this->open()) return false;
if (!$this->command("HELO $this->hostname",3,"250")) return false;
for ($i=0;$i
$this->Buildhead($from_name,$to_name[$i],$from_mail,$to_mail[$i] ,$件名);
if (!$this->command("RSET",3,"250")) は false を返します。
if (!$this->command("MAIL FROM:".$from_mail,3,"250")) false を返します。
if (!$this->command("RCPT TO:".$to_mail[$i],3,"250")) false を返します。
if (!$this->command("DATA",3,"354")) は false を返します。
// 準備送信邮件
if ($this->debug) $this->outdebug("sending subject;");
if (!fputs($this->connection,$this->subject)) { $this->err_str="発行邮件头時刻出错!"; return false;}
if ($this->debug) $this->outdebug("sending body;");
if (!fputs($this->connection,$this->body)) { $this->err_str="発行正文時出错!"; return false;}
if (!fputs($this->connection,".rn")) { $this->err_str="発行正文時出错!"; return false;} //正文送信完毕,退出;
$resp=fgets($this->connection,256);
if($this->debug)
$this->outdebug("$resp");
if (substr($resp,0,1)!="2")
{
$this->err_str="発行完了後,服务器没有响应!!";
false を返します。
}
// 送信邮件
}
if (!$this->command("QUIT",3,"221")) return false;
$this->close();
true を返します。
}
}//クラス定義終了
}//終了 if(!isset($__smtp_class__))
?>