ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルでソケットを使用してメールを送信する

PHP_PHP チュートリアルでソケットを使用してメールを送信する

WBOY
WBOYオリジナル
2016-07-13 17:37:40820ブラウズ

筆者が申請したいくつかのPHPホームページスペースの中で、メール機能を提供できるスペースは多くありません
mail()関数を呼び出すと必ず消えてしまいます。 それ以上は何もありません。しかし、オンライン生活における電子メールの役割はますます大きくなっており、これ以上は話したくありませんが、ホームページ スペースが mail() の送信をサポートしていない場合はどうすればよいでしょうか。ソケット経由でメールを実装することも考えました
送信しますが、残念ながら私は PHP を使用したソケット プログラミングに慣れていません。また、電子メールを送信するには SMTP プロトコルを使用する必要があり、大量の英語を読む必要があるため、
これまで一度も勉強したことがありません。ついにある日、ソケット プログラミングを使用して電子メールを送信することに関する記事を見つけました。宝物のようにコピーさせていただきました
これをダウンロードして、誰でも使用できる PHP で利用できるクラスに変換します。元の記事は単なる簡単な例であり、もう 1 つあります
多くの実験と修正を経て、最終的にソケットを直接使用して指定されたメールボックスにメールを送信するクラス (
など) に変更しました。 前回の MIME 送信の記事と組み合わせると、mail() 関数をサポートしていない Web サイトでもメールを送信できます。髪のせい
メール送信の処理には時間がかかり、mail()の処理機構と全く同じではないため速度は遅くなりますが、メール送信の問題は解決できます
メールを送信する機能は緊急に必要ですが、同時にソケットプログラミングのためのphpの使い方も学ぶことができます。以下にこのクラスの実装原理を紹介します
あわせてSMTPに関する基礎知識も解説します。

ソケットプログラミングの紹介
私は TCP/IP プログラミングの専門家ではないので、ここでは私の理解と経験を共有するだけであることを皆さんに宣言したいと思います。

fsockopen 関数を使用してインターネット接続を開きます。 関数構文形式:

int fsockopen(string ホスト名, int ポート, int [errno], string [errstr], int [タイムアウト]);

パラメータの意味については説明する必要はないと思います。ここでは SMTP プロトコルが使用されているため、ポート番号は 25 です。接続が正常に開かれると、
が返されます。 ファイル ハンドルのように使用できるソケット ハンドル。利用可能な操作は fputs()、fgets()、feof()、fclose() です
待って。

とても簡単な紹介は以上です。

SMTPの基本
TCP/IPに基づくインターネットプロトコルの一般的なコマンド形式はリクエスト/レスポンス方式で実装されており、すべてテキスト情報が使用されるため、
対処が少し楽になります。 SMTP は Simple Mail Transfer Protocol の略称で、クライアントがサーバーに電子メールを送信できるようにします。それで
以下で説明するコマンドは、クライアントがサーバーに要求命令を送信することを指し、応答はサーバーからクライアントに返される情報を指します。

SMTPはコマンドヘッダーとメッセージボディの2つの部分に分かれています。コマンドヘッダーは主にクライアントとサーバー間の接続、検証などを完了します。プロセス全体は複数のライフで構成されています
注文構成。各コマンドがサーバーに送信されると、サーバーは応答情報 (通常は 3 桁の応答コードと応答テキスト) を返します。違う服
サーバーから返される応答コードはプロトコルに準拠していますが、応答本文はプロトコルに準拠していません。各コマンドと応答の最後には復帰文字があるため、
fputs() と fgets() を使用してコマンドと応答を処理します。 SMTP コマンドと応答メッセージは 1 行です。情報システムは弱気なのか
テキストの本文部分では、最後の終了行を別の「.」で終了する必要があります。

クライアントで一般的に使用される SMTP コマンドは次のとおりです:

HELO ホスト名: サーバーに挨拶し、使用されているマシン名をクライアントに伝えます。気軽に入力できます
MAIL FROM: sender_id: サーバーに送信者のアドレスを伝えます
RCPT TO:receiver_id:受信者のアドレスをサーバーに伝えます
データ: 手紙の内容は以下で送信され始め、
だけを含む特別な行で終わる必要があります。 RESET: 前のコマンドをキャンセルして最初からやり直します
VERIFY userid: アカウントが存在するかどうかを確認します (このコマンドはオプションであり、サーバーによってサポートされていない可能性があります)
QUIT: 接続を終了し、終了します
サーバーから返される応答情報は次のとおりです (形式: 応答コード + スペース + 説明):

220 サービス準備完了 (ソケット接続が成功すると、この情報が返されます)
221 処理
250 リクエスト電子メールアクションは正しく完了しています (この情報は、HELO、MAIL FROM、RCPT TO、QUIT コマンドが正常に実行された場合に返されます)
354 はデータの送信を開始し、 で終了します (この情報は DATA コマンドが正常に実行された場合に返され、クライアントは情報を送信する必要があります)
500 構文エラー、コマンドが認識されません
550 コマンドを実行できず、メールが無効です
552 割り込み処理: ユーザーがファイル容量を超えました
以下は単純なコマンド ヘッダー (これはソケットを開いた後に実行されます) であり、stmp.263.net に電子メールを送信したテスト結果です。

HELO リモドゥ

250 smtp.263.net
メール送信者: chatme@263.net
250 わかりました
RCPT 宛先: chatme@263.net
250 わかりました
データ
354 データを
で終了します。 宛先: chatme@263.net
送信者: chatme@263.net
件名: テスト
送信者: chatme@263.net
テスト

やめてください
250 OK: C46411C5097E0 としてキューに登録されました

SMTPに関する簡単な知識です。関連コンテンツは RFC にあります。

RFC 821 は、電子メールの送受信に関する関連手順を定義しています。
RFC 822 は電子メールのコンテンツの形式を指定します。
RFC 2045-2048 は、マルチメディア電子メール コンテンツの形式を指定します。
RFC 1113、1422-1424 では、電子メールの機密性を向上させる方法について説明しています。

send_mailクラスの実装
それでは、私が作成したメール送信クラスを紹介します。上記の準備知識を踏まえて、以下のように実装していきます。

クラスのメンバー変数

var $lastmessage; // 返された最後の応答メッセージを記録します
var $lalast; //最後のアクション、文字列形式
var $welcome; //ユーザーを歓迎するために HELO の後に使用されます
var $debug; //デバッグ情報を表示するかどうか
var $smtp; //SMTP サーバー
var $port; //SMTP ポート番号
var $fp; //ソケットハンドル

このうち、$lastmessageと$lastactは、最後の応答情報と実行されたコマンドを記録するために使用され、エラーが発生したときにユーザーが使用できます。 彼ら。テストの必要性のために、$debug 変数も定義しました。その値が true の場合、実行中のプロセス中にいくつかの実行情報が表示されます。それ以外の場合は何も表示されません
任意の出力。 $fp は、開いたソケット ハンドルを保存するために使用されます。

クラスの構築

-------------------------------------------------- ---------------------------------
関数 send_mail($smtp, $welcome="", $debug=false)
{
if(empty($smtp)) die("SMTP を NULL にすることはできません!"); $this->smtp=$smtp; if(空($welcome))
{
$this->welcome=gethostbyaddr("localhost"); }
それ以外は
$this->ようこそ=$ようこそ
$this->debug=$デバッグ
$this->lastmessage=""; $this->lastact=""; $this->ポート="25"; }
-------------------------------------------------- ---------------------------------
このコンストラクターは主にいくつかの初期値の決定と設定を完了します。 $welcome は、サーバーにユーザーの名前を伝えるために HELO ディレクティブで使用されます。
HELO 命令にはマシン名が必要ですが、マシン名がなくても使用できます。ユーザーが $welcome を指定しない場合、ローカル マシン名が自動的に検索されます。

デバッグ情報を表示

------------------------------------------------- ---------------------------------
1 関数 show_debug($message, $inout)
2 {
3 if ($this->デバッグ)

4 {

5 if($inout=="in") //レスポンス情報

6 {

7 $m=<< 8 }
他9個
10
$m=>> 11 if(!ereg(" $"、$message))
12 $message .= "
"; 13 $メッセージ=nl2br($メッセージ); 14 echo "${m}${メッセージ}"; 15 }
16 }
-------------------------------------------------- ----------------------------------



http://www.bkjia.com/PHPjc/486554.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/486554.html

技術記事

筆者が申請したいくつかの PHP ホームページ スペースの中で、メール機能を提供できるものは多くありません。 mail() 関数を呼び出した後は、常に何もする必要がありません。しかし、オンライン生活における電子メールの役割...

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