ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルで SMTP を使用して電子メールを送信するためのコード

PHP_PHP チュートリアルで SMTP を使用して電子メールを送信するためのコード

WBOY
WBOYオリジナル
2016-07-21 15:54:09879ブラウズ

最近のプロジェクトでは、電子メールを送信するために SMTP が必要でした。以前のライブラリ クラスはもう存在しません。pear をインストールしたり、pear の net/smtp クラスを使用したりするのは面倒です。 discuz からコアを直接抽出し、少し修正しました。
プロトコル分析 Web サイトから、SMTP プロトコルのコマンドと応答を見つけました。SMTP プロトコルの送信側と SMTP 側の通信は、SMTP コマンドの送信と SMTP フィードバック応答の受信によって完了します。よく使われるコマンドは以下のとおりです。
HELLO<domain><CRLF>SMTP を受信する送信者を識別する HELLO コマンド
MAIL FROM:<reverse-path><CRLF><reverse-path>は送信者のアドレスです。このコマンドは、受信者に新しいメール送信の開始を通知し、すべてのステータスとバッファを初期化します。このコマンドはメール転送プロセスを開始し、最終的に 1 つ以上のメールボックスへのメール データの転送を完了します。
RCPT TO: 各電子メール受信者のアドレスを識別します
DATA
SMTP を受信すると、 を使用して後続のアクションを処理用の電子メール データとして扱います。データの終わりを識別します。
REST<CRLF>現在のメール送信を終了/リセットします。
NOOP<CRLF>受信SMTPはOK応答のみを要求します。 (テスト用)
QUIT は、受信側 SMTP が OK 応答を返し、送信を閉じることを要求します。
VRFY<文字列><CRLF>指定されたメールボックスが存在するかどうかを確認します。セキュリティ上の理由により、サーバーはこのコマンドを禁止していることがよくあります。
EXPN指定されたメールボックス リストが存在するかどうかを確認し、メールボックス リストを展開し、多くの場合使用が禁止されます。
HELP<CRLF>サーバーがサポートしているコマンドを問い合わせる

注: はキャリッジリターンとラインフィードを意味し、ASCII コードはそれぞれ 13 と 10 (10 進数) です。

さらに、コマンドの下で Telnet を使用して、単純に SMTP を手動で使用することもできます。
例:


telnet smtp.263.net 25
211.150.96.25 を試行しています...
smtp.263.net に接続しています。
エスケープ文字は '^]' です
220 coremail システムへようこそ (スパム対策あり)。 ) 2.1 for 263(040326)
HELO weiqiong@cctk.net
250 smtp.263.net
mail from:weiqiong@cctk.net
250 OK
rcpt to:g2_t1@263.net
250 Ok
data
354 でデータを終了します。

250 OK: B9E452FF3E としてキューに登録されました
終了
221 バイバイ
接続が外部ホストによって閉じられました



単純な SMTP クラスを作成できます。

 
class stmp{

private $mailcfg=array(); 
プライベート $error_msg=''; 

関数 __construct($mailcfg){

$this->mailcfg=$mailcfg; 

}

パブリック 関数 send($mail){
$mailcfg=$this->mailcfg; 
if(!$fp = fsockopen($mailcfg['server'], $mailcfg['port'], $errno, $errstr, 30)) {
return $this->error("($mailcfg[server ]:$mailcfg[port]) 接続 - SMTP サーバーに接続できません。「mail_config.php」を確認してください。"); 
}
stream_set_blocking($fp, true); 
$lastmessage = fgets($fp, 512); 
if(substr($lastmessage, 0, 3) != '220') {
return $this->error("$mailcfg[server]:$mailcfg[port] CONNECT - $lastmessage"); 
}
fputs($fp, ($mailcfg['auth'] ? 'EHLO' : 'HELO')." ".$mailcfg['auth_username']."rn"); 
$lastmessage = fgets($fp, 512); 
if(substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
return $this->error("($mailcfg[server]:$mailcfg[ポート]) HELO/EHLO - $lastmessage"); 
}
while(1) {
if(substr($lastmessage, 3, 1) != '-' || empty($lastmessage)) {
break; 
}
$lastmessage = fgets($fp, 512); 
}
if($mailcfg['auth']) {
fputs($fp, "AUTH LOGINrn"); 
$lastmessage = fgets($fp, 512); 
if(substr($lastmessage, 0, 3) != 334) {
return $this->error("($mailcfg[server]:$mailcfg[port]) AUTH LOGIN - $lastmessage"); 
}
fputs($fp, base64_encode($mailcfg['auth_username'])."rn"); 
$lastmessage = fgets($fp, 512); 
if(substr($lastmessage, 0, 3) != 334) {
return $this->error("($mailcfg[server]:$mailcfg[port]) USERNAME - $lastmessage"); 


fputs($fp, base64_encode($mailcfg['auth_password'])."rn"); 
$lastmessage = fgets($fp, 512); 
if(substr($lastmessage, 0, 3) != 235) {
return $this->error("($mailcfg[server]:$mailcfg[port]) PASSWORD - $lastmessage"); 
}

$email_from = $mailcfg['from']; 
}
fputs($fp, "MAIL FROM: <".preg_replace("/.*<(.+?)>.*/", "\1", $email_from).">rn" ); 
$lastmessage = fgets($fp, 512); 
if(substr($lastmessage, 0, 3) != 250) {
fputs($fp, "MAIL FROM: <".preg_replace("/.*<(.+?)>.*/" , "\1", $email_from).">rn"); 
$lastmessage = fgets($fp, 512); 
if(substr($lastmessage, 0, 3) != 250) {
return $this->error("($mailcfg[server]:$mailcfg[port]) MAIL FROM - $lastmessage"); 
}
}

$email_to=$mail['to']; 
foreach(explode(',', $email_to) as $touser) {
$touser = trim($touser); 
if($touser) {
fputs($fp, "RCPT TO: <$touser>rn"); 
$lastmessage = fgets($fp, 512); 
if(substr($lastmessage, 0, 3) != 250) {
fputs($fp, "RCPT TO: <$touser>rn"); 
$lastmessage = fgets($fp, 512); 
return $this->error("($mailcfg[server]:$mailcfg[port]) RCPT TO - $lastmessage"); 
}
}
}
fputs($fp, "DATArn"); 
$lastmessage = fgets($fp, 512); 
if(substr($lastmessage, 0, 3) != 354) {
return $this->error("($mailcfg[server]:$mailcfg[port]) DATA - $lastmessage"); 

$str="To: $email_tornFrom: $email_fromrnSubject: ".$mail['subject']."rnrn".$mail['content']."rn.rn"; 
fputs($fp, $str); 
fputs($fp, "QUITrn"); 
true を返します。 
}

public function get_error(){
return $this->error_msg; 
}

プライベート 関数 error($msg){
$this->error_msg.=$msg; 
false を返します。 
}

}
?> 

简单的调用例:

 
$mailcfg['server'] = 'smtp.163.com'; 

$mailcfg['ポート'] = '25'; 

$mailcfg['auth'] = 1; 
$mailcfg['from'] = 'test '; 

$mailcfg['auth_username'] = 'test'; 

$mailcfg['auth_password'] = 'パスワード';     
$stmp=new stmp($mailcfg); 
$mail=array('to'=>'test@gmail.com','subject'=>'测试标题','content'=>'邮件内容PHP面向对象'); 
if(!$stmp->send($mail)){
echo $stmp->get_error(); 
}else{
echo 'メール成功!'; 
}
?> 

送信が成功した場合は、ボックスを削除してファイルを確認できます。^_^

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/318510.html技術記事ある項目は SMTP 送信ツールを必要とし、以前のクラスは存在せず、また、pear をインストールするか、最近使用した net/smtp クラスを使用する必要があり、ディスクから直接抽出されます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。