2012-02-19 2 views
1

私はPHPでソケットを使ってメールを送信するSMTPクラスを作成しています。問題はそれがランダムに作業していることで、電子メールを送信するのに多くの時間がかかることがあります。ソケットを使ってphpでメールを送る

"。"私は、電子メールが送信された応答を取得する必要がありますが、代わりに、私は "QUIT"コマンドを送信すると、同じメッセージを送信を閉じているサーバーを取得しているし、電子メールが送信されたメッセージ。

メッセージは何らかの理由で混在していますが、最後の2つのコマンドでのみ表示されます。と "終了"。

誰でも私に手を差し伸べることができますか?

はここでアップロード:http://pastebin.com/9vweVpe7

PD:私はphpmailerのか、SWIFTを使用することができることを知っているが、私は学ぶために自分でそれをやりたいの。 compile_message()の穴)

1:

+0

私はPHPで、 "ベアボーン"の方法はsendmailを使う 'mail()'関数を使うことだと思います。私はあなた自身のソケットのことを書くことができると思うが、それは合理的であるより多くの車輪を再発明しているようだ。 – Mala

+0

パケットトレースを投稿する。 – Brad

+0

@seinこんにちはSein、私もこれについて学びたいです。解決済みのSMTPクラスを投稿してください。 –

答えて

3

あり、実装にはいくつかのバグやロジックの穴がありますが、あなたの質問に関連するとして、直接私に目立つ最も重要なものです。

2)電子メールデータを送信するときに2)悪用されるcommand()

最初にDATAコマンドを送信して応答を受け取ったら、後で送信する電子メールデータのすべての行は独自のコマンドではなく、そのまま扱います。電子メールデータの各行にcommand()を呼び出すと、存在しないために到着することのない応答が期待されます。電子メールデータの各行について、command()の代わりにfwrite()を呼び出してください。 .コマンド(BTWは、if not htmlブロックの外に移動する必要があります)を送信する準備ができるまで、command()に電話しないでください。

また、電子メールデータの個別の行を送信する場合は、ピリオドで始まる余分な期間を先頭に付けなければなりません。これはRFC 2821 Section 4.5.2に記載されています。あなたのコードはそれを全く扱っていません。電子メールデータを適切にエスケープしないと、誤って電子メールを途中で途切れてしまい、後続の電子メール行がサーバーによって未知のコマンドとして解釈され、適切なエラー応答が送信されます。サーバーが未知のコマンドの束を受け取った場合、接続を強制終了することは不合理ではありません。

+0

あなたは正しいのですが、新しい行のドットについては、私はテストのラインを送っていました。第一に、より多くのデータを処理する前に作業をしたいと思っていました。オフセットされたメッセージについては、まだコマンドを送信していなくてもサーバー情報を取得してから通信を開始できる場合でも、ソケット接続が完了した直後に応答する必要があるという問題がありました。 –

+0

はい、最初のコマンドを送信する前に、サーバーは最初の挨拶応答を送信します。その応答は、あなたがSMTPサーバと通信していることだけをypuに伝えるだけでなく、ESMTPをサポートするかどうかを示唆しています(間違ったと思えばより包括的なエラーコードを提供し、 'EHLO'を使って確認します)あなたのコマンドかどうか。 –

関連する問題