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 } ?> 発送が成功すれば、メールでメールを確認することができます。