- ベストアンサー
メールサーバーの違いによる受信方法の違いはあるのでしょうか?
先日、VC6.0を使用してOpenSSLを使用したSSL対応のメーラを作成しましたが、 テストサーバではエラーが起こらないのですが、実装サーバではエラーが起こってしまいます。 そこで、ご質問なのですが、 メールサーバに使用するソフト(Postfix等)によって、 受信時に渡ってくるデータが異なることはあるのでしょうか? テストサーバーにつきましては、 Courier-IMAPを使用しております。 SSLを使用するのも初めてであり、 メールサーバーにつきましての知識もないため、 わかりずらい質問になってしまい申し訳ないのですが、 どうかよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>POPを使用しております。 ならば、とりあえずpostfixは関係ないでしょう。 >FD_READの知識もなく、ネットで調べて見ましたが、 >こちらは、受信バッファがある場合に必ず受けるものではないのですか? Socketの受信バッファに入れば通知されるでしょう。 が、SSLの場合、暗号化されたデータはSSLのhandshake(どういう暗号化方式を使用するかとかお互いの対応しているバージョン等々)のデータも送受信されます。 一方Socketはその中に流れているデータがなんなのかについては関知しません。 # TCPなのでストリームの順番とエラー発生時の再送処理などは保証されますが。 で、handshake中だった場合はアプリケーションが必要とするデータはありませんからSSL_read()しても有効データは取れません。 ということで-1を返しているのでしょう。 # エラー取得などで調べれば取れるかも知れません。 # 0を返さないのは「Socketの切断」とされないためかと。 とりあえず、私のメールチェッカーではFD_READの後でSSL_in_connect_init()で接続処理中か判定しています。 # ヘッダのコメントとか確認してください。 ちなみに、SSL_read()で読み出せるデータがあるかどうかはSSL_pending()で取得できる……らしいです。 私はあまりアテにしていませんが。 また、SSL_read()したあとFD_READの通知が来なくなることがあるみたいです。 # どういう条件の時かは忘れましたが…受信データがあるハズなのにFD_READが来なくなったことが。 # プログラムにミスがあった可能性は否定できませんけど。
その他の回答 (1)
- Wr5
- ベストアンサー率53% (2173/4061)
>メールサーバに使用するソフト(Postfix等)によって、 >受信時に渡ってくるデータが異なることはあるのでしょうか? >テストサーバーにつきましては、 >Courier-IMAPを使用しております。 SMTPとPOPとどちらなんでしょう? POP over SSL対応なメールチェッカーを作ったことありますが… FD_READ受けてSSL_read()で-1が返される。ということがありました。 復号できるだけのデータが受信できていなかったのでしょう。 また、SSLのhandshake中もFD_READを受けるコトがあります。
お礼
ご回答ありがとうございます。 >FD_READ受けてSSL_read()で-1が返される。ということがありました。 >復号できるだけのデータが受信できていなかったのでしょう。 >また、SSLのhandshake中もFD_READを受けるコトがあります。 FD_READの知識もなく、ネットで調べて見ましたが、 こちらは、受信バッファがある場合に必ず受けるものではないのですか? SSL_read()を行っている部分で、 エラーが返されていた気がするので、 もしかしたら、同様の現象かもしれないです^^; 知識が足りず申し訳ないのですが、ご教授お願いします。
補足
>SMTPとPOPとどちらなんでしょう? POPを使用しております。
お礼
ご回答ありがとうございます。 一応、自己解決致しました^^; 問題としては、Char型の配列が 初期化されていなかった部分が問題のようでした。 しかし、メールサーバの違いによって、 エラーが出るとは思えない部分の問題だったので、 完全に修復出来たとは言えないかもです・・・。 >とりあえず、私のメールチェッカーではFD_READの後でSSL_in_connect_init()で接続処理中か判定しています。 こちらの関数がとても気になるので、 再度、調査を重ねていこうと思います。 >ちなみに、SSL_read()で読み出せるデータがあるかどうかはSSL_pending()で取得できる……らしいです。 SSL_read()の部分で、SSL_pending()は使用しておりましたが、 どうも使い方が悪いせいか、こちらでは上手く動作しませんでした^^; >また、SSL_read()したあとFD_READの通知が来なくなることがあるみたいです。 なるほど、ネットワークプログラムはサーバ内の環境によっても、 かなり事例が異なって来るのですね・・・。 奥深いです>< とりあえず、エラーが表示されなくなりましたので、 まだまだネットワーク部分に関しては、ご教授頂きたいことがあるのですが、 質問掲示板として内容がずれてしまう気がしますので、 これで締め切らせて頂きます。 大変ご親切に有難うございました^^