ホームページ  >  記事  >  バックエンド開発  >  Smartupload.jar PHP で SMTP を使用して電子メールを送信するためのコード

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

WBOY
WBOYオリジナル
2016-07-29 08:37:22851ブラウズ

最近のプロジェクトでは、電子メールを送信するために 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
35 4 エンドデータ

250 OK: B9E452FF3E としてキューに登録されました
終了
221 さようなら
外部ホストによって接続が閉じられました
これに基づいて、次のように書くことができます。シンプルなSMTPクラス。
 
class stmp{
private $mailcfg=array(); 
プライベート $error_msg=''; 
関数 __construct($mailcfg){
$this->mailcfg=$mailcfg; 
}
public 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'] = 'テスト'; 
$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 'メール 成功!'; 
}
?> 
送信が成功した場合は、ボックスを削除してファイルを確認できます。^_^

以上は、smartupload.jar php を介して SMTP 発行アプリケーションのコードを使用しており、smartupload.jar に関する内容が含まれているため、PHP の教則に関心のある友人の助けになることが望ましいです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。