ホームページ  >  記事  >  php教程  >  php 単純な smtp クラス

php 単純な smtp クラス

WBOY
WBOYオリジナル
2016-06-13 12:30:461032ブラウズ

smtp.class.php

コードをコピー コードは次のとおりです:



define('SMTP_STATUS_NOT_CONNECTED', 1, TRUE); 
define('SMTP_STATUS_CONNECTED', 2, TRUE); 

class smtp
{

var $connection; 
var $recipients; 
var $headers; 
var $timeout; 
var $errors; 
var $status; 
var $body; 
var $from; 
var $host; 
var $port; 
var $helo; 
var $auth; 
var $user; 
var $pass; 
var $debug; 

/**
* パラメーターは配列です。
* host SMTP サーバーのホスト デフォルト: localhost
* port SMTP サーバーのポート デフォルト: 25
* helo 送信する HELO コマンドの名前 デフォルト: localhost
* user SMTP サーバーユーザー名 デフォルト: NULL
* SMTP サーバーのログインパスワードを渡す デフォルト: NULL
* timeout 接続タイムアウト デフォルト: 5
* @return bool
*/

function smtp($params = array())
{

if(!define('CRLF'))定義('CRLF', “rn”, TRUE); 

$this->タイムアウト = 5; 
$this->ステータス = SMTP_STATUS_NOT_CONNECTED; 
$this->host = ‘localhost’; 
$this->ポート = 25; 
$this->auth = FALSE; 
$this->user = ”; 
$this->pass = ”; 
$this->errors = array(); 
$this->debug = false; 
foreach($params as $key => $value)
{
$this->$key = $value; 
}

$this->helo = $this->host; 

// 如果没有設置用户名则不验证
$this->auth = (” == $this->user) ? 偽: 真。 
}

function connect($params = array())
{

if(!isset($this->status))
{
$obj = 新しい smtp($params); 

if($obj->connect())
{
$obj->status = SMTP_STATUS_CONNECTED; 
}

return $obj; 

}
else
{

$this->connection = fsockopen($this->host, $this->port, $errno, $errstr, $this->タイムアウト); 
socket_set_timeout($this->connection, 0, 250000); 

$greeting = $this->get_data(); 

if(is_resource($this->connection))
{
$this->status = 2; 
$this-> 認証を返しますか? $this->ehlo() : $this->helo(); 
}
else
{
$this->errors[] = ‘サーバーへの接続に失敗しました: ‘.$errstr; 
FALSE を返します。 
}
}
}

/**
* パラメータは配列です。
* 受信者 受信者の配列
* 送信者のアドレスからのもので、返信アドレスとしても使用されます
* headers ヘッダー情報の配列
* body の本文メール
*/

function send($params = array())
{

foreach($params as $key => $value)
{
$this->set($key, $value); 
}

if($this->is_connected())
{
// 服务器が必要かどうか验证
if($this->auth)
{
if(!$this->auth()) return FALSE; 
}

$this->mail($this->from); 

if(is_array($this->recipients))
{
foreach($this->recipients as $value)
{
$this->rcpt ($値); 
}
}
else
{
$this->rcpt($this->recipients); 


if(!$this->data()) return FALSE; 

$headers = str_replace(CRLF.'.', CRLF.'..', trim(implode(CRLF, $this->headers))); 
$body = str_replace(CRLF.'.', CRLF.'..', $this->body); 
$body = $body[0] == ‘。 ? '.'.$body : $body; 

$this->send_data($headers); 
$this->send_data(”); 
$this->send_data($body); 
$this->send_data('.'); 

return (substr(trim($this->get_data()), 0, 3) === ‘250’); 
}
else
{
$this->errors[] = ‘接続されていません!’; 
FALSE を返します。 
}
}

function helo()
{
if(is_resource($this->connection)
AND $this->send_data('HELO ' .$this->helo)
AND substr(trim($error = $this->get_data()), 0, 3) === '250′ )
{
return TRUE; 

}
else
{
$this->errors[] = ‘HELO コマンドが失敗しました。出力: ‘ 。 トリム(substr(トリム($error),3)); 
FALSE を返します。 
}
}

function ehlo()
{
if(is_resource($this->connection)
AND $this->send_data('EHLO ' .$this->helo)
AND substr(trim($error = $this->get_data()), 0, 3) === '250′ )
{
return TRUE; 
}
else
{
$this->errors[] = ‘EHLO コマンドが失敗しました。出力: ‘ 。 トリム(substr(トリム($error),3)); 
FALSE を返します。 
}
}

関数 auth()
{
if(is_resource($this->connection)
AND $this->send_data('AUTH LOGIN ')
AND substr(trim($error = $this->get_data()), 0, 3) === '334′
AND $this->send_data(base64_encode($this->> ;user)) // ユーザー名を送信
AND substr(trim($error = $this->get_data()),0,3) === '334′
AND $this->send_data( base64_encode($this->pass)) // パスワードを送信
AND substr(trim($error = $this->get_data()),0,3) === '235′ )
{
TRUE を返します。 
}
else
{
$this->errors[] = ‘AUTH コマンドが失敗しました: ‘ 。 トリム(substr(トリム($error),3)); 
FALSE を返します。 
}
}

関数 mail($from)
{

if($this->is_connected()
AND $this->send_data ('MAIL FROM:<'.$from.'>')
AND substr(trim($this->get_data()), 0, 2) === '250′ )
{
TRUE を返します。 
}
else
{
return FALSE; 
}
}

関数 rcpt($to)
{
if($this->is_connected()
AND $this->send_data('RCPT TO:<'.$to.'>')
AND substr(trim($error = $this->get_data()), 0, 2) === '25′ )
{
TRUE を返します。 
}
else
{
$this->errors[] = trim(substr(trim($error), 3)); 
FALSE を返します。 
}
}

function data()
{

if($this->is_connected()
AND $this->send_data(' DATA')
AND substr(trim($error = $this->get_data()), 0, 3) === '354′ )
{
return TRUE; 
}
else
{
$this->errors[] = trim(substr(trim($error), 3)); 
FALSE を返します。 
}
}

関数 is_connected()
{
return (is_resource($this->connection) AND ($this->status === SMTP_STATUS_CONNECTED)) ; 
}

関数 send_data($data)
{
if(is_resource($this->connection))
{
if($this->debug )
echo nl2br($data.CRLF); 
return fwrite($this->connection, $data.CRLF, strlen($data) 2); 
}
else
{
return FALSE; 
}


function &get_data()
{

$return = ”; 
$line = ”; 

if(is_resource($this->connection))
{
while(strpos($return, CRLF) === FALSE OR substr($line,3,1) != = ' ')
{
$line = fgets($this->connection, 512); 
$return .= $line; 
}
if($this->debug===true)
echo nl2br($return.CRLF); 
return $return; 

}
else
{
return FALSE; 
}
}

function set($var, $value)
{
$this->gt;$var = $value; 
TRUE を返します。 
}
} // クラス終了
?> 


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。