ホームページ >php教程 >php手册 >PHP で Socket を使用してメールを送信する (1)

PHP で Socket を使用してメールを送信する (1)

WBOY
WBOYオリジナル
2016-06-21 09:14:06811ブラウズ

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

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

fsockopen 関数を使用してインターネット接続を開きます。関数の構文形式は次のとおりです。

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

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

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

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

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

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

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

HELO limodou
250 smtp.263.net
MAIL FROM: chatme@263.net
250 OK
RCPT TO: chatme@263.net
250 OK
DATA
354 でデータを終了します。 : chatme@263.net
From: chatme@263.net
Subject: test
From: chatme@263.net
test
.
QUIT
250 OK: C46411C5097E0 としてキューに登録されました

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

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



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