PHPでSMTPを使用して電子メールを送信するためのコード

WBOY
リリース: 2016-06-13 12:30:56
オリジナル
943 人が閲覧しました

最近のプロジェクトでは、電子メールを送信するために SMTP が必要でした。以前のライブラリ クラスはもう存在しません。pear をインストールしたり、pear の net/smtp クラスを使用したりするのは面倒です。 discuz からコアを直接抽出し、少し修正しました。
プロトコル解析 Web サイトから、SMTP プロトコルのコマンドと応答を見つけました。SMTP プロトコルの送信側と受信側の間の会話は、SMTP コマンドを送信し、SMTP フィードバック応答を受信することで完了します。一般的に使用されるコマンドは次のとおりです。
HELLOSMTP を受信する送信者を識別する HELLO コマンドです。
MAIL FROM: が送信者です。住所。このコマンドは、受信者に新しいメール送信の開始を通知し、すべてのステータスとバッファを初期化します。このコマンドはメール転送プロセスを開始し、最終的に 1 つ以上のメールボックスへのメール データの転送を完了します。
RCPT TO: は、各電子メール受信者のアドレスを識別します。
DATA
受信 SMTP は、後続のアクションを処理用の電子メール データとして扱います。 CRLF>. データの終わりを識別します。
REST 現在のメール送信を終了/リセット
NOOP OK 応答の場合のみ SMTP の受信が必要です。 (テスト用)
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 System(スパム対策あり) 2.1 へようこそ (263(040326))
HELO weiqiong@cctk.net
250 smtp.263.net
メール送信元:weiqiong@ cctk .net
250 Ok
rcpt to:g2_t1@263.net
250 Ok
data
354 データは で終了します。< LF> ;
はは
.
250 OK: B9E452FF3E としてキューに入れられました
終了
221 バイ
外部ホストによって接続が閉じられました。

class stmp{

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

関数 __construct($mailcfg){

$this->mailcfg=$mailcfg; 

}

public function send($mail){
$mailcfg=$this->mailcfg; 
if(!$fp = fsockopen($mailcfg['server'], $mailcfg['port'], $errno, $errstr, 30)) {
return $this->error("( $mailcfg[サーバー]:$mailcfg[ポート]) 接続 - SMTP サーバーに接続できません。「mail_config.php」を確認してください。"); 
}
stream_set_blocking($fp, true); 
$lastmessage = fgets($fp, 512); 
if(substr($lastmessage, 0, 3) != '220') {
return $this->error("$mailcfg[サーバー]:$mailcfg[ポート] 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'] = 'テスト'; 

$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 'メール成功!'; 
}
?> 

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート