この記事では主に、メール送信を実装するための SMTP プロトコルに基づく PHP のサンプル コードを紹介します。興味のある方は参考にしてください。
SMTP プロトコル
PHP のサードパーティ ライブラリやツールを使用する場合。クラスを使用して電子メールを送信するときに、次の質問について考えたことはありますか:
電子メールの検出を実現するために独自の PHP コードを記述して、他の人のライブラリを使用できないのはなぜですか? PHPでメールを送信するにはどうすればよいですか?
まず、メール送信の基本原理を理解する必要があります。この記事では、SMTP プロトコルに基づいてメール送信を実装します
SMTP (Simple Mail Transfer Protocol) は、シンプルなメール転送プロトコルです。簡単に言うと、一連のルールを定義し、このルールに従って電子メールの送信者、受信者、内容、件名、その他の情報を送信することを SMTP サーバーに伝えるだけです。
その後、SMTP サーバーは、この一連のルールに従って送信された情報を解析し、最終的に電子メールを送信します。
163、qq などのメール サーバーはすべて SMTP サービスを提供しており、SMTP サーバーに接続して、電子メールを送信するためのデータを書き込むだけです。
実際、コードを書かなくても、Linux Telnet ツールを直接使用して SMTP サービスに接続し、電子メールを送信できます。これを使用して、電子メール送信のプロセス全体を理解します。
メールを送信するための Telnet
Linux 環境で telnet コマンドを使用して、163、ポート 25 (通常、smtp はポート 25 を使用します) の smtp サービスに接続し、smtp の送信プロセスを理解することができます。
telnet smtp.163.com 25
その後、接続が成功したことを示す次の結果が得られます
Trying 220.181.12.16... Connected to smtp.163.com. Escape character is '^]'. 220 163.com Anti-spam GT for Coremail System (163com[20141201])
次に、次のコマンドを実行して、相手に自分の身元がどこから来たのかを伝えます
HELO smtp.163.com
相手はWe send 250 OK
に戻り、AUTH LOGINを実行して本人認証を開始したい旨を相手に伝えると、相手からメッセージが返信されます。
その後、ユーザー名、パスワード、メールの内容、送信者、受信者、その他の情報を入力して会話を終了すると、SMTP サーバーがメールの送信を支援します。
SMTP プロトコルには電子メール コンテンツの形式に関する厳しい要件があり、コマンド ラインでの実行が難しいため、プロセス全体はここでは実行されず、後で PHP コードを使用して完全に実装されます。
Telnet を使用して SMTP メールに接続する上記のプロセスからわかるように、メールを送信するプロセスは実際には非常に簡単です。SMTP サービスのポート 25 に接続し、送信したいメールを相手に伝えるだけです。プロトコルに従って送信します。これはプラットフォームやプログラミング言語とは関係ありません。
C 言語、Java、PHP のいずれを使用しても、Socket を使用して SMTP サーバーに接続する限り、メールを送信できます。
SMTP コマンド
Telnet を使用して上記の SMTP サービスに接続するときに、HELO、AUTH LOGIN などを入力しました。これらが何なのかについて疑問があるかもしれません。
実際、これらは SMTP プロトコルによって定義された命令、つまりルールであり、SMTP サーバーはこれらの命令を通じて私たちが何をしたいのかを認識します。
よく使われるコマンドは以下の通りです:
Command | Function |
---|---|
HELO | 相手のメールサーバーに発行する自分の身元を特定するためのコマンド |
認証ログイン | 本人確認近日公開 認証 |
MAIL FROM | このメールの差出人を相手に伝える |
RCPT TO | 誰に |
DATA | このメールが誰であるかを相手に伝える。次にメールの具体的な内容を送信します |
QUIT | メールの内容を入力したら、このコマンドを実行して終了します |
php实现邮件发送
直接上代码
class Mailer { private $host; private $port = 25; private $user; private $pass; private $debug = false; private $sock; public function __construct($host,$port,$user,$pass,$debug = false) { $this->host = $host; $this->port = $port; $this->user = base64_encode($user); //用户名密码一定要使用base64编码才行 $this->pass = base64_encode($pass); $this->debug = $debug; //socket连接 $this->sock = fsockopen($this->host,$this->port); if(!$this->sock){ exit('出错啦'); } //读取smtp服务返回给我们的数据 $response = fgets($this->sock); $this->debug($response); //如果响应中有220返回码,说明我们连接成功了 if(strstr($response,'220') === false){ exit('出错啦'); } } //发送SMTP指令,不同指令的返回码可能不同 public function execCommand($cmd,$return_code){ fwrite($this->sock,$cmd); $response = fgets($this->sock); //输出调试信息 $this->debug('cmd:'.$cmd .';response:'.$response); if(strstr($response,$return_code) === false){ return false; } return true; } public function sendMail($from,$to,$subject,$body){ //detail是邮件的内容,一定要严格按照下面的格式,这是协议规定的 $detail = 'From:'.$from."\r\n"; $detail .= 'To:'.$to."\r\n"; $detail .= 'Subject:'.$subject."\r\n"; $detail .= 'Content-Type: Text/html;'."\r\n"; $detail .= 'charset=gb2312'."\r\n\r\n"; $detail .= $body; $this->execCommand("HELO ".$this->host."\r\n",250); $this->execCommand("AUTH LOGIN\r\n",334); $this->execCommand($this->user."\r\n",334); $this->execCommand($this->pass."\r\n",235); $this->execCommand("MAIL FROM:<".$from.">\r\n",250); $this->execCommand("RCPT TO:<".$to.">\r\n",250); $this->execCommand("DATA\r\n",354); $this->execCommand($detail."\r\n.\r\n",250); $this->execCommand("QUIT\r\n",221); } public function debug($message){ if($this->debug){ echo '<p>Debug:'.$message . PHP_EOL .'</p>'; } } public function __destruct() { fclose($this->sock); } }
调用示例
$port = 25; $user = 'username'; //请替换成你自己的smtp用户名 $pass = 'pass'; //请替换成你自己的smtp密码 $host = 'smtp.163.com'; $from = 'xxxxx@163.com'; $to = 'xxxx@qq.com'; $body = 'hello world'; $subjet = '我是标题'; $mailer = new Mailer($host,$port,$user,$pass,true); $mailer->sendMail($from,$to,$subjet,$body);
在执行指令时有输出调试信息,输出了我们每次执行的指令以及smtp服务返回给我们的响应数据。
因此我们可以看到以下结果
Debug:220 163.com Anti-spam GT for Coremail System (163com[20141201]) Debug:cmd:HELO smtp.163.com ;response:250 OK Debug:cmd:AUTH LOGIN ;response:334 dXNlcm5hbWU6 Debug:cmd:aXR6aG91anVuYmxvZ0AxNjMuY29t ;response:334 UGFzc3dvcmQ6 Debug:cmd:QzBjSGRRNe32xiNGFYUE5oag== ;response:235 Authentication successful Debug:cmd:MAIL FROM: ;response:250 Mail OK Debug:cmd:RCPT TO:<380472723@qq.com> ;response:250 Mail OK Debug:cmd:DATA ;response:354 End data with . Debug:cmd:From:itzhoujunblog@163.com To:380472723@qq.com Subject:我是标题 Content-Type: Text/html; charset=gb2312 hello world . ;response:250 Mail OK queued as smtp11,D8CowACXHE5APdNYCo0hAQ--.19144S2 1490238785 Debug:cmd:QUIT ;response:221 Bye
总结
邮件发送步骤
使用socket连接smtp服务
使用smtp指令进行对话,输入身份信息,邮件信息等
结束对话
以上就是本文的全部内容,希望对大家的学习有所帮助。
相关推荐:
以上がSMTP プロトコルに基づいて電子メール送信インスタンスを実装する PHP メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

PHPでは、特性は方法が必要な状況に適していますが、継承には適していません。 1)特性により、クラスの多重化方法が複数の継承の複雑さを回避できます。 2)特性を使用する場合、メソッドの競合に注意を払う必要があります。メソッドの競合は、代替およびキーワードとして解決できます。 3)パフォーマンスを最適化し、コードメンテナビリティを改善するために、特性の過剰使用を避け、その単一の責任を維持する必要があります。

依存関係噴射コンテナ(DIC)は、PHPプロジェクトで使用するオブジェクト依存関係を管理および提供するツールです。 DICの主な利点には、次のものが含まれます。1。デカップリング、コンポーネントの独立したもの、およびコードの保守とテストが簡単です。 2。柔軟性、依存関係を交換または変更しやすい。 3.テスト可能性、単体テストのために模擬オブジェクトを注入するのに便利です。

SplfixedArrayは、PHPの固定サイズの配列であり、高性能と低いメモリの使用が必要なシナリオに適しています。 1)動的調整によって引き起こされるオーバーヘッドを回避するために、作成時にサイズを指定する必要があります。 2)C言語アレイに基づいて、メモリと高速アクセス速度を直接動作させます。 3)大規模なデータ処理とメモリに敏感な環境に適していますが、サイズが固定されているため、注意して使用する必要があります。

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

JavaScriptでは、nullcoalescingoperator(??)およびnullcoalescingsignmentoperator(?? =)を使用できます。 1.??最初の非潜水金または非未定されたオペランドを返します。 2.??これらの演算子は、コードロジックを簡素化し、読みやすさとパフォーマンスを向上させます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版
ビジュアル Web 開発ツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
