-
-
/** - * php ソケット smtp メール送信
- * 編集: bbs.it-home.org
- */
//define("SOL", "n");
- define(" EOL", "rn");
- define("SMTP_HOST", "smtp.163.com");//SMTP サーバー
- define("SMTP_PORT", "25");//SMTP サーバーのポート
- define("SMTP_USER") ", "");//SMTP サーバーのユーザー アカウント
- define("SMTP_PASS", "");//SMTP サーバーのユーザー パスワード
$from = ""; //SMTP サーバーのユーザーメールアドレス
- $to = "";//送信先、カンマ区切りで複数のメールを送信可能
- $cc = "";
- $bcc = "";
-
$subject= "これは PHP によって送信された添付ファイル付きのメールです";//多くのクライアントではメールの件名が文字化けするので、変換してください
- $body = "これは添付ファイル付きのメール送信プログラムです
ご覧ください。HTM タグがここに表示されます。リンクをクリックしてください ".date('Y-m-d H:i:s');//メール内容
- $smtp = new smtp(SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASS, true);//これらのうち true は認証が使用されることを意味し、それ以外の場合は認証が使用されません。
- $smtp->addAttachment("mail.zip");
- $smtp->sendmail($to, $from, $subject, $body, $ cc , $bcc);
class smtp {
/* パブリック変数 */
- public $attachments = array();
- /* プライベート変数 * /
- プライベート $smtp_host;
- プライベート $smtp_port;
- プライベート $time_out;
- プライベート $host_name;
- プライベート $auth;
- プライベート $user;
- プライベート $pass;
- プライベート $sock;
public function smtp($smtp_host = null, $smtp_port = null, $user = null, $pass = null, $auth = true) { - $this->smtp_host = (!empty($ smtp_host )) $smtp_host : SMTP_HOST;
- $this->smtp_port = (!empty($smtp_port)) ? $smtp_port : SMTP_PORT;
- $this->user = (!empty($user)) ? : SMTP_PORT;
- $this->pass = (!empty($pass)) ? $pass : SMTP_PORT;
- $this->auth = $auth;
- $this->time_out = 15;
- #
- $ this ->host_name = "localhost";
- $this->sock = FALSE;
- }
/* Main Function */
- public function sendmail($to, $from, $ subject = "", $body = "", $cc = "", $bcc = "") {
- $bndp = md5(uniqid("")) . rand(1000, 9999);
- $bnd = md5( uniqid ("")) . rand(1000, 9999);
- list ($msec, $sec) =explode(" ", microtime());
$mail_from = $this- > ;strip_line_breaks($from);
- $mail_to =explode(",", $to);
- $body = preg_replace("/(^|(rn))(\.)/", "", $body) ;
- if ($cc != "") $mail_to = array_merge($mail_to,explode(",", $cc));
- if ($bcc != "") $mail_to = array_merge($mail_to,explode( " ,", $bcc));
$headers = "MIME-Version:1.0" . EOL;
- $headers .= "To: " . $ cc != "") {
- $headers .= "Cc: " . $cc }
- $headers .= "差出人: $from<" 。 $から。 「>」 。 EOL;
- $headers .= "件名: " . $subject 。 EOL;
- $headers .= "日付: " . date("r") . EOL;
- $headers .= "X-Mailer: Webmail ver 1.0 (PHP バージョン/" . phpversion() . ")" . EOL;
- $headers .= "メッセージ ID: <" 。 date("YmdHis", $sec) 。 「。」 。 ($msec * 1000000) 。 「。」 。 $から。 「>」 。 EOL;
- if (count($this->attachments) > 0) {
- $headers .= "Content-Type: multipart/mixed;" 。 EOL 。 chr(9) 。 " 境界="" . $bndp . """ . EOL 。 EOL;
- $headers .= '--'.$bndp 。 EOL;
- $headers .= 'Content-Type : multipart/alternative;境界="' . $bnd . '"' . EOL 。 EOL;
- $headers .= '--' 。 $bnd 。 EOL;
- $headers .= 'Content-Type: text/plain; charset=utf-8' 。 EOL;
- $headers .= "コンテンツ転送エンコーディング: 8 ビット" . EOL 。 EOL;
- $headers .= $body . EOL;
- $headers .= '--' 。 $bnd 。 EOL;
- $headers .= 'コンテンツタイプ: text/html; charset=utf-8' 。 EOL;
- $headers .= "コンテンツ転送エンコーディング: 8 ビット" . EOL 。 EOL;
- $headers .= $body . EOL;
- $headers .= '--' 。 $bnd 。 「--」。 EOL;
foreach ($this->attachments as $att) {
- $headers .= "--" . $bndp 。 EOL 。 $att;
- }
- $headers .= '--' . $bndp 。 「--」。 EOL;
- $this->clear_attachments();
- } else {
- $headers .= 'Content-Type : multipart/alternative;boundary="'.$bnd.'"' 。 EOL 。 EOL;
- $headers .= '--'.$bnd 。 EOL;
- $headers .= 'Content-Type: text/plain; charset=utf-8' 。 EOL;
- $headers .= "コンテンツ転送エンコーディング: 8 ビット" . EOL 。 EOL;
- $headers .= $body . EOL;
- $headers .= '--'.$bnd 。 EOL;
- $headers .= 'コンテンツタイプ: text/html; charset=utf-8' 。 EOL;
- $headers .= "コンテンツ転送エンコーディング: 8 ビット" . EOL 。 EOL;
- $headers .= $body . EOL;
- $headers .= '--'.$bnd.'--' 。 EOL;
- }
$sent = TRUE;
- foreach ($mail_to as $rcpt_to) {
- $rcpt_to = $this->strip_line_breaks($rcpt_to);
- if (!$this->smtp_sockopen($rcpt_to)) {
- $this- >log_write("エラー: " に電子メールを送信できません。$rcpt_to);
- $sent = FALSE;
- continue;
- }
- if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to) , $headers, $body)) {
- $this->log_write("メールが <" . $rcpt_to . ">" に送信されました);
- } else {
- $this->log_write( 「エラー: $rcpt_to にメールを送信できません。">");
- $sent = FALSE;
- }
- $this->log_write(" {$mail_to} send over;");
- return $sent;
- }
public function addAttachment($file, $dispo = "添付ファイル") {
- $file_data = (file_exists($file)) ? file_get_contents($file) : "";
- if ($file_data != "") {
- $filename = Basename($file);
- $ext = pathinfo($filename, PATHINFO_EXTENSION);
- $chunks = chunk_split(base64_encode( $file_data));
- $parts = "Content-Type: application/$ext; name="" . $filename . """ . EOL;
- $parts .= "コンテンツ転送エンコーディング: Base64" . EOL;
- $parts .= "Content-Disposition: " . $dispo 。 "; ファイル名="" . $ファイル名 . """ . EOL 。 EOL;
- $parts .= $chunks 。 EOL 。 EOL;
- $this->attachments[] = $parts;
- }
- }
private function clear_attachments() {
- unset($this->attachments);
- $this->attachments = array();
- }
/* プライベート関数 */
- プライベート関数 smtp_send($helo, $from, $to, $header, $body = "") {
- if (!$this->smtp_putcmd("HELO", $helo)) {
- //$this->log_write("エラー: HELO コマンドの送信中にエラーが発生しました。");
- return FALSE;
- }
- #auth
- if ($this->auth) {
- if (!$this- >smtp_putcmd("AUTH LOGIN",base64_encode($this->user))) {
- //$this->log_write("エラー: HELO コマンドの送信中にエラーが発生しました。");
- return FALSE;
- }
- if (!$this->smtp_putcmd("",base64_encode($this->pass))) {
- //$this->log_write("エラー: HELO コマンドの送信中にエラーが発生しました。");
- return FALSE;
- }
- }
- if (!$this->smtp_putcmd("MAIL", "FROM:<" . $from . ">")) {
- //$this->log_write("エラー: MAIL FROM コマンドの送信中にエラーが発生しました。");
- return FALSE;
- }
- if (!$this->smtp_putcmd("RCPT", "TO:<" . $to . ">")) {
- //$this->log_write("エラー: RCPT の送信中にエラーが発生しましたTO コマンド。");
- return FALSE;
- }
- if (!$this->smtp_putcmd("DATA")) {
- //$this->log_write("エラー: DATA コマンドの送信中にエラーが発生しました。" );
- return FALSE;
- }
- if (!$this->smtp_message($header, $body)) {
- //$this->log_write("エラー: メッセージの送信中にエラーが発生しました。");
- return FALSE;
- }
- if (!$this->smtp_eom()) {
- //$this->log_write("エラー: の送信中にエラーが発生しました。 return FALSE;
- }
- if (!$this->smtp_putcmd("QUIT")) {
- //$this->log_write("エラー: 送信中にエラーが発生しましたQUIT コマンド。");
- return FALSE;
- }
- return TRUE;
- }
- private function smtp_sockopen($address) {
- if ($this->smtp_host == "") {
- return $this->smtp_sockopen_mx ($address);
- } else { // bbs.it-home.org
- return $this->smtp_sockopen_relay();
- }
- }
- private function smtp_sockopen_relay() {
- $this->log_write("Trying接続する " 。 $this->smtp_host 。 「:」。 $this->smtp_port 。 "...");
- $this->sock = @fsockopen($this->smtp_host, $this->smtp_port, $errno, $errstr, $this->time_out);
- if (! ($this->sock && $this->smtp_ok())) {
- $this->log_write("エラー: 接続エラー" . $errstr . " (" . $errno . ")");
- return FALSE;
- }
- $this->log_write("Connected Ok");
- return TRUE;
- }
- プライベート関数 smtp_sockopen_mx($address) {
- $domain = preg_replace("/^.+@([^@ ]+)$/", "1", $address);
- if (!@getmxrr($domain, $MXHOSTS)) {
- $this->log_write("エラー: MX を解決できません "" . $domain . """);
- return FALSE;
- }
- foreach ($MXHOSTS as $host) {
- $this->log_write("Trying to " . $host . ":" . $this->smtp_port);
- $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
- if (!($this->sock && $this-> ;smtp_ok())) {
- $this->log_write("接続エラー ," . $errstr . " (" . $errno . ")");
- 続行;
- }
- $this->log_write(" mx ホストに接続しました " . $host);
- return TRUE;
- }
- $this->log_write("エラー: どの mx ホストにも接続できません (" . implode(", ", $MXHOSTS) 。 ")");
- return FALSE;
- }
- プライベート関数 smtp_message($header, $body) {
- fputs($this->sock, $header . "rn" . $body);
- return TRUE;
- }
- プライベート関数 smtp_eom() {
- fputs($this->sock, "rn.rn");
- return $this->smtp_ok();
- }
- プライベート関数 smtp_ok() {
- $response = str_replace( "rn", "", fgets($this->sock, 512));
- if (!preg_match("/^[23]/", $response)) {
- fputs($this->sock, "QUITrn");
- fgets($this->sock, 512);
- $this->log_write("エラー: リモート ホストが "" . $response . """);
- return FALSE;
- }
- return TRUE;
- }
- プライベート関数 smtp_putcmd($cmd, $arg = "") {
- if ($arg != "") $cmd = ($cmd == "") ? $arg : ($cmd . " " . $arg);
- fputs($this->sock, $cmd . "rn");
- return $this->smtp_ok();
- }
- プライベート関数strip_line_breaks( $address) {
- $address = preg_replace("/([trn])+/", "", $address);
- $address = preg_replace("/^.*<(.+)>.*$ /", "", $address);
- return $address;
- }
- public function log_write($message) {
- $message = date("M d H:i:s ") . get_current_user() 。 「[」。 getmypid() 。 "]: " 。 $message;
- file_put_contents(dirname(__FILE__) . '/mail.log', $message . PHP_EOL, FILE_APPEND | LOCK_EX);
- }
- }
复制代
|