クラスSMTP{
/* パブリック変数 */
var $smtp_port;
var $time_out;
var $host_name;
var $log_file;
var $relay_host;
var $debug;
var $auth;
var $user;
var $pass;
/* プライベート変数 */
var $sock;
/* 建設業者 */
関数 smtp($relay_host = "", $smtp_port = 25, $auth = false, $user, $pass) {
$this->debug = false;
$this->smtp_port = $smtp_port;
$this->relay_host = $relay_host;
$this->time_out = 30; // fsockopen() で使用されます
$this->auth = $auth; //認証
$this->user = $user;
$this->pass = $pass;
$this->host_name = "localhost"; //HELOコマンドで使用されます
$this->log_file = "";
$this->靴下 = false;
}
/* メイン関数 */
関数 sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $Additional_headers = "") {
$mail_from = $this->get_address($this->strip_comment($from));
$body = ereg_replace("(^|(rn))(.)", "1.3", $body);
$header .= "MIME バージョン:1.0rn";
if ($mailtype == "HTML") {
$header .= "Content-Type:text/htmlrn";
}
$header .= "宛先: " . $to 。 「ん」;
if ($cc != "") {
$header .= "Cc: " . $cc 。 「ん」;
}
$header .= "差出人: $from<" 。 $から。 ">rn";
$header .= "件名: " . $subject 。 「ん」;
$header .= $Additional_headers;
$header .= "日付: " . date("r") 。 「ん」;
$header .= "X-Mailer:By Redhat (PHP/" . phpversion() . ")rn";
list ($msec, $sec) =explode(" ", microtime());
$header .= "メッセージ ID: <" 。 date("YmdHis", $sec) 。 「。」 。 ($msec * 1000000) 。 「。」 。 $mail_from 。 ">rn";
$TO =explode(",", $this->strip_comment($to));
if ($cc != "") {
$TO = array_merge($TO,explode(",", $this->strip_comment($cc)));
}
if ($bcc != "") {
$TO = array_merge($TO,explode(",", $this->strip_comment($bcc)));
}
$sent = true;
foreach ($TO として $rcpt_to) {
$rcpt_to = $this->get_address($rcpt_to);
if (!$this->smtp_sockopen($rcpt_to)) {
$this->log_write("エラー: " . $rcpt_to . "n" にメールを送信できません");
$sent = false;
続き;
}
if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
$this->log_write("メールは <" . $rcpt_to . ">n" に送信されました);
} その他 {
$this->log_write("エラー: <" . $rcpt_to . ">n" にメールを送信できません");
$sent = false;
}
fclose($this->靴下);
$this->log_write("リモートホストnから切断されました");
}
$sent を返す;
}
/* プライベート関数 */
関数 smtp_send($helo, $from, $to, $header, $body = "") {
if (!$this->smtp_putcmd("HELO", $helo)) {
return $this->smtp_error("HELO コマンドを送信中");
}
// 認証
if ($this->auth) {
if (!$this->smtp_putcmd("認証ログイン",base64_encode($this->user))) {
return $this->smtp_error("HELO コマンドを送信中");
}
if (!$this->smtp_putcmd("", Base64_encode($this->pass))) {
return $this->smtp_error("HELO コマンドを送信中");
}
}
if (!$this->smtp_putcmd("MAIL", "FROM:<" . $from . ">")) {
return $this->smtp_error("sending MAIL FROM command");
}
if (!$this->smtp_putcmd("RCPT", "TO:<" . $to . ">")) {
return $this->smtp_error("RCPT TO コマンドを送信中");
}
if (!$this->smtp_putcmd("DATA")) {
return $this->smtp_error("DATA コマンドを送信中");
}
if (!$this->smtp_message($header, $body)) {
return $this->smtp_error("メッセージ送信中");
}
if (!$this->smtp_eom()) {
return $this->smtp_error("を送信中。 [EOM]");
}
if (!$this->smtp_putcmd("QUIT")) {
return $this->smtp_error("QUIT コマンドを送信中");
}
true を返す;
}
関数 smtp_sockopen($address) {
if ($this->relay_host == "") {
return $this->smtp_sockopen_mx($address);
} その他 {
return $this->smtp_sockopen_relay();
}
}
関数 smtp_sockopen_relay() {
$this->log_write(" . $this->relay_host . ":" . $this->smtp_port . "n");
$this->sock = @ fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
if (!($this->sock && $this->smtp_ok())) {
$this->log_write("エラー: リレー ホストに接続できません " . $this->relay_host . "n");
$this->log_write("エラー: " . $errstr . " (" . $errno . ")n");
false を返す;
}
$this->log_write("リレー ホストに接続しました " . $this->relay_host . "n");
true を返す;
;
}
関数 smtp_sockopen_mx($address) {
$domain = ereg_replace("^.+@([^@]+)$", "1", $address);
if (!@ getmxrr($domain, $MXHOSTS)) {
$this->log_write("エラー: MX を解決できません "" . $domain . ""n");
false を返す;
}
foreach ($MXHOSTS として $host) {
$this->log_write(" . $host . ":" . $this->smtp_port . "n");
$this->sock = @ fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
if (!($this->sock && $this->smtp_ok())) {
$this->log_write("警告: mx ホストに接続できません " . $host . "n");
$this->log_write("エラー: " . $errstr . " (" . $errno . ")n");
続き;
}
$this->log_write("mx ホストに接続しました " . $host . "n");
true を返す;
}
$this->log_write("エラー: どの mx ホストにも接続できません (" . implode(", ", $MXHOSTS) . ")n");
false を返す;
}
関数 smtp_message($header, $body) {
fputs($this->sock, $header . "rn" . $body);
$this->smtp_debug("> " . str_replace("rn", "n" . "> ", $header . "n> " . $body . "n> "));
true を返す;
}
関数 smtp_eom() {
fputs($this->sock, "rn.rn");
$this->smtp_debug(".[EOM]n");
return $this->smtp_ok();
}
関数 smtp_ok() {
$response = str_replace("rn", "", fgets($this->sock, 512));
$this->smtp_debug($response . "n");
if (!ereg("^[23]", $response)) {
fputs($this->sock, "QUITrn");
fgets($this->sock, 512);
$this->log_write("エラー: リモート ホストが "" . $response . ""n");
false を返す;
}
true を返す;
}
関数 smtp_putcmd($cmd, $arg = "") {
if ($arg != "") {
if ($cmd == "")
$cmd = $arg;
その他
$cmd = $cmd 。 「」。 $arg;
}
fputs($this->sock, $cmd . "rn");
$this->smtp_debug("> " . $cmd . "n");
return $this->smtp_ok();
}
関数 smtp_error($string) {
$this->log_write("エラー: " . $string . ".n" 中にエラーが発生しました");
false を返す;
}
関数 log_write($message) {
$this->smtp_debug($message);
if ($this->log_file == "") {
true を返します;
}
$message = date("M d H:i:s ") 。 get_current_user() 。 「[」。 getmypid() 。 "]: " 。 $メッセージ;
if (!@ file_exists($this->log_file) || !($fp = @ fopen($this->log_file, "a")) {
$this->smtp_debug("警告: ログ ファイルを開けません "" . $this->log_file . ""n");
false を返す;
;
}
群れ($fp, LOCK_EX);
fputs($fp, $message);
fclose($fp);
true を返す;
}
関数strip_comment($address) {
$comment = "([^()]*)";
while (ereg($comment, $address)) {
$address = ereg_replace($comment, "", $address);
}
$address を返す;
}
関数 get_address($address) {
$address = ereg_replace("([ trn])+", "", $address);
$address = ereg_replace("^.*<(.+)>.*$", "1", $address);
$address を返す;
}
関数 smtp_debug($message) {
if ($this->debug) {
$message をエコーします。 「
;";
}
}
}
?>
|