phpでSMTPを使ってメールのコードを送ります。


最近のプロジェクトではSMTPを使ってメールを送る必要がありますが、以前のライブラリは存在しなくなりました。pearをインストールするのも好きではありません。直接discuzからコアを抜き出して少し修正しました。   プロトコル解析ネットワークから、SMTPプロトコルのコマンドと応答を検索し、SMTPプロトコルがSMTPを送信するとSMTPを受信するとの間のセッションは、SMTPのSMTPコマンドを送信することと、SMTPフィードバックを受信することの応答によって行われる。一般的なコマンドは以下の通りです。   HELLO<domain><CRLF>SMTPを受信する送信者を識別するHELLO命令   MAIL FROM:<reverse-path><CRLF><reverse-path>は送信者のアドレスです。このコマンドは、新しいメールの送信開始を受信者に伝え、すべてのステータスとバッファを初期化します。このコマンドはメール転送処理を開始し、最終的にはメールデータを1つ以上のメールボックスに転送することができます。   RCPT TO:<forward-path><CRLF><forward-path>それぞれのメール受信者の住所を表示します。      DATA<CRLF>       受信SMTPは、その後の行為をメールデータとして処理し、<CRLF><CRLF>でデータの末尾を識別する。   REST<CRLF>現在のメール転送を終了/リセットします。   NOOP<CRLF>SMTP受信はOK応答のみと要求します(テスト用)   QUITT<CRLF>は、SMTPを受信してOK応答を返し、送信をクローズすることを要求する。   VREFY<string><CRLF>指定されたメールボックスが存在するかどうかを検証します。安全上、サーバーはこのコマンドを多く禁止します。   EXPN<string><CRLF>所与のメールリストが存在するかどうかを検証し、メールリストを拡張し、使用を禁止することもしばしばあります。   HELP<CRLF>サーバがサポートするコマンドを調べます。   注:<CRLF>は回車、改行で、ASCIIコードはそれぞれ13、10(10進数)です。   また、簡単な手作りSMTPは、commandで、telnetを使って行うことができます。  例えば:telnet smtp.266.net 25  Trying 211.150.6.25…  Connected ト smtp.266.net.  Escape character is '^]'.  220 ウエルカム ト commail System(With) Anti-pam) 2.1 for 263(04326)  HELO [email protected]  250 smtp.266.net  メール from:[email protected]  250 Ok  rpt ト:g [email protected]  250 Ok  ダタ  354 End ダタ with   haha  .  250 Ok: queued as B 9 E 452 FF 3 E  quit  221 Bye  Connection クローズド by foreign ホスト.     この基礎の上で簡単なSMTP種類を書くことができます。  クラス stmp{      prvate $mail cfg=array()      prvate $error_msg=';      機能 __construct($malcfg){          $this->malcfg=malcfg;      }      public 機能 send($mail){          $mail cfg=$this->malcfg;          if(fp。 = fsockopen($mail cfg['server]]は、 $mail cfg['port] $errno $errstr 30) {              return $this->error('(($malcfg[server]):$malcfg[port] CONNET - Unbale ト プロジェクト ト the SMTP server please ロック ヨール \"メールconfig.php\".")          }           ストリームsetblocking($fp) true;           $lastmessage = fgets($fp) 512)          if(substr($lastmessage) 0, 3) != '220') {              return $this->error("malcfg[server]):$malcfg[port] CONNET - $lastmessage");          }          fput($fp) ($mail cfg['auth'] ? 'EHLO : 'HELO." ".$mail cfg['auth_]username.「\r」)          $lastmessage = fgets($fp) 512)          if(substr($lastmessage) 0, 3) != 220 && substr($lastmessage) 0, 3) != 250) {              return $this->error('(($malcfg[server]):$malcfg[port] HELO/EHLO - $lastmessage");          }          while(1) {              if(substr($lastmessage) 3, 1) != '-' || empty($lastmessage) {                   break;               }               $lastmessage = fgets($fp) 512)          }          if($malcfg['auth]) {              fput($fp) "AUTH LOGIN\r";;              $lastmessage = fgets($fp) 512)              if(substr($lastmessage) 0, 3) != 334) {                  return $this->error('(($malcfg[server]):$malcfg[port] AUTH LOGIN - $lastmessage");              }              fput($fp) base 64_encode($malcfg['auth_]username.「\r」)              $lastmessage = fgets($fp) 512)              if(substr($lastmessage) 0, 3) != 334) {                  return $this->error('(($malcfg[server]):$malcfg[port] USERNAME - $lastmessage");              }              fput($fp) base 64_encode($malcfg['auth_]password.「\r」)              $lastmessage = fgets($fp) 512)              if(substr($lastmessage) 0, 3) != 235) {                  return $this->error('(($malcfg[server]):$malcfg[port] PASSWORD - $lastmessage");              }              $email_from = $mail cfg['from];          }          fput($fp) "MAIL FROM: <".preg_replace(/.*)<.+?>.*/) "\\1「 $email_from.「>\r」)          $lastmessage = fgets($fp) 512)          if(substr($lastmessage) 0, 3) != 250) {              fput($fp) "MAIL FROM: <".preg_replace(/.*)<.+?>.*/) "\\1「 $email_from.「>\r」)              $lastmessage = fgets($fp) 512)              if(substr($lastmessage) 0, 3) != 250) {                  return $this->error('(($malcfg[server]):$malcfg[port] MAIL FROM - $lastmessage");              }          }          $email_to=$mail['to']          foreach(explode(',') $email_ト) as $touser) {              $touser = trim($touser)              if($touser) {                  fput($fp) "RCPT TO: <$touser>\r";;                  $lastmessage = fgets($fp) 512)                  if(substr($lastmessage) 0, 3) != 250) {                      fput($fp) "RCPT TO: <$touser>\r";;                      $lastmessage = fgets($fp) 512)                      return $this->error('(($malcfg[server]):$malcfg[port] RCPT TO - $lastmessage");                  }              }          }          fput($fp) "DATA\r");          $lastmessage = fgets($fp) 512)          if(substr($lastmessage) 0, 3) != 354) {              return $this->error('(($malcfg[server]):$malcfg[port] データ - $lastmessage");          }          $str=「To: $email_ト\r From: $email_from\rSubject: ".$mail['subject'].「\r\r」.$mail['content'.「\r.\r」          fput($fp) $str          fput($fp) "QUITT\r");          return true;      }      public 機能 ゲットするerror(){          return $this->error_msg;      }      prvate 機能 error($msg){          $this->error_msg.=$msg;          return false;      }  }  ?>      簡単な呼び出し例:<?  $mail cfg['server'] = 'smatp.1.163.com          $mail cfg['port'] = '25';          $mail cfg['auth'] = 1;          $mail cfg['from'] = 'test '          $mail cfg['auth_]username' = 'test;          $mail cfg['auth_]password] = 'password;              $stmp=new stmp($mail cfg)          $mail=array('to'=>'[email protected]'subject'=''テストタイトル','content''''メールの内容''a href="http://www.phpobject.net>PHP対象(/a>');          if(stmp->send($mail){              echo $stmp->get_error()          }else{              echo 'メール succ          }  ?>    発送が成功すれば、メールでメールを確認することができます。