IMAPをTELNEtから操作法について

解決


Hiisan  2020-11-05 23:53:00  No: 149313

[Window]のファイルを指定して実行で、Telnet--->command画面に移り--->o imap.gmail.com 993入力後、接続されるのですが、
何かキー入力して下さいのメッセージがでるのですが、? login username passwordを入力したいのですが、
切断されてしまいます。念の為「ESC]相当の#3を入力しても、だめでした。原因を、お教え願います。


take  2020-11-06 09:08:08  No: 149314

接続中のやりとりはSSLでのやりとりが必要ですが使用しているTELNETからはSSL暗号化で接続していますか?
OPENSSLが使える環境で GoogleのIMAPに接続する場合はコマンドプロンプトから

openssl s_client -connect imap.gmail.com:993

のようにすれば接続出来るかと思います。


Hiisan  2020-11-06 18:02:48  No: 149318

ご指導有難うございます。
[1]openssl s_client -connect imap.gmail.com:993を、入力すると、[コマンドエラー]が、で接続できません。
[2]Gmail側からの設定は、「Imap]にチェツクを、入れており、Pop3、IMapは、動作する状態です。
[3]重複ですが、[o imap.gmail.com 993」入力後、接続されるのですが、
  次のステップに入れて、? login username passwordを入力したいのですが、接続切断され、login出来ないのです。
[4]確認:当方は、[Microsoft Telnel]を使用しています。
宜しくお願い致します。


take  2020-11-09 09:03:24  No: 149321

WindowsのTelnetがSSLに対応していないのでその動作で正常と思われます。

Linuxであれば先ほどのコマンドで通信出来ますが
WindowsでSSLターミナルを使おうとすると結構やっかいです。

やり方の1例としてOpenSSL for Windowsを使用する方法があります。
インストール後にWindowsシステム環境変数の pathに

c:\OpenSSL\bin

を追加

コマンドプロンプトで

OpenSSL version

を入力してOpenSSLのバージョンが表示されれば完了です。

コマンドプロンプトで

openssl s_client -connect imap.gmail.com:993

で表示される内容が変われば一歩前進です。

ここまでは「GMailの環境が正しく設定出来ている」ことが必要です。
環境が設定出来ていない場合は「認証が正しくない」とか「不明なアプリからアクセスがありました」
などの警告が出ます。
それでもlogin コマンド直後に切断されなくなります。

GMailの設定方法
説明しているうちにバージョンが変わるのですが

前の質問
https://www.petitmonte.com/bbs/answers?question_id=29756

によるやり方で、「安全性の低いアプリのアクセス」の項目をオンにする必要があります。
オンにしていても数日で自動的にオフになるので確認が必要です。

当方では自作のSSL対応TelnetでGmailへのIMAP接続を確認しています。


Hiisan  2020-11-10 19:52:44  No: 149323

takeさま、大変お礼遅くなり申し訳御座いませんでした。お陰様で[imap]の動作が、手動確認ですが、動作確認できました。
windowのTelnetは、使用せずopenssl検討し、Comに表示のコメントの意味は、
まだ解りませんが、下記動作しました。(手動です)
[1]openssl s_client -connect imap.gmail.com:993  [2]a01 login xxxxx@com passw 
[3]a02 LIST "" "*"                                                     [4]a03 select inbox
[5]a04 search all                                                      [6]a05 fetch  1 fetch
次は、commのレスポンス表示をdelphi上に、取込処理を、検討したいのですが、
「Q1]各tagのレスポンスの意味を、日本語で説明した、URLをご紹介ねがえませんか
  [Q2]EAGetMailObjLIb_TLBコンポネントを使用したサンプルは、良くみかけるのですが有料みたいですが、
   これ相当の無料コンポネントは、ありませんか
宜しくお願い致します。

[7]a06 fetch  1 xxxx.text                                           [8] logout


take  URL  2020-11-11 07:59:15  No: 149324

SSLはクリアしましたか、おめでとうございます。
IMAPですが、日本の書籍ではたしか1冊ほどでIMAPは20ページぐらいの記載しかありません。

IMAPに関する仕様書は
docomo さんが非常に有益な IMAPインターフェイス仕様書を公開しておりますのでそちらをご覧下さい。

https://www.nttdocomo.co.jp/binary/pdf/service/developer/smart_phone/application/imap/mail_imap_spec_151201.pdf


Hiisan  2020-11-11 08:55:45  No: 149325

takeさま、どうもありがとうございました。
又初歩的な質問で、申しありませんが
cmdから、a02 List "" "*"を入力の場合は、OKですが、delphiから[bat]を組み、起動させると、[bad]と出ます。
””処理をご指導願います。


take  2020-11-11 09:10:22  No: 149326

質問が広範囲に及んでいるので整理しましょう。

OPENSSLのコマンドラインでa02 List "" "*" は通るけど
sslexe.batファイルを作って中身は上記のa02 List "" "*"
まずはこのbat ファイルがdelphi抜きにしてとりあえずコマンドラインで実行して動くかどうかですかね

OPENSSLのバッチファイルは未経験ですのであまり力には慣れないかも


Hiisan  2020-11-11 09:21:31  No: 149327

お忙しい処、早速のご指導有難うございます。
コマンドラインからの実行は、動きます。


take  2020-11-11 09:44:47  No: 149328

delphiからバッチファイルを組んで起動ってところを抜き出せる部分でも良いので記載があると解決のヒントになるかも

もしコマンドラインからは通るということはDelphiからの呼び出し時に環境設定変数?だったかな
この辺がバッチファイル直接呼び出しで反映されていないのかも知れません。

Delphiからもっとスマートな使い方がある気もしますが
海外のサンプルだと日本語の解析がうまくいかないから難しいところです。


Hiisan  2020-11-11 17:59:53  No: 149329

takeさま、[a02 list "" "*"]の件、原因は、文字間に遅延を入れないと、連続文字の場合に、2字が飛びます。
下記endCommandPromptに遅延時間を設定しないと、
同一文字が、連続している場合に、読み取りミスを、起こしエラーとなっていましたので、文字間にsleepを挿入すると、直りました
私のPCでは、最低50ms必要でした。なお下記procedureは、XRAYさまの508を使用しています。
遅延時間50msを、使用せず高速化しないと、表示にも違和感を感じます。
この高速化の方法の方法を、お教え願います。
//=====================================
procedure SendCommandPrompt(AText: widestring);  // wide:add,
var
  LhStdInput : THandle;
  LInputRec  : TInputRecord;
  LEventNum  : DWORD;
  i          : Integer;
begin
  //標準入力のハンドルを取得
  LhStdInput := GetStdHandle(STD_INPUT_HANDLE);
  AText := AText+ Chr(VK_RETURN);
  //DelphiのString型は最初の文字が入った要素番号は1
  for i := 1  To Length(AText) do begin
    FillChar(LInputRec, SizeOf(LInputRec), #0);
    LInputRec.EventType := KEY_EVENT;
    LInputRec.Event.KeyEvent.wRepeatCount := 1;
    LInputRec.Event.KeyEvent.UnicodeChar  := AText[i];
    LInputRec.Event.KeyEvent.bKeyDown     := True;
    WriteConsoleInput(LhStdInput, LInputRec, 1, LEventNum );
    sleep(50);//<---ここに挿入しました
  end;
end;


Hiisan  2020-11-11 18:23:29  No: 149330

追記:Sleep(50)では、まだエラーwが、何回か、試験すると、エラーが出ます。
訂正:no.149323のa04 serch--->search


take  2020-11-12 08:55:27  No: 149331

WriteConsoleInputが未経験のため情報が役に立つかわかりませんが
Telnetのようなコンソールに手で入力したかのように命令を送ろうとすると正常に送ることが出来ない現象が発生しました。

原因はエコーバックとして返ってきているデータを正しく処理していませんでした。
Telnetで外部batファイルを指定した送信はソフト側で処理しているので大丈夫なだけのようです。

WriteConsoleInputではPeekConsoleInputで入力バッファを覗けるのでしょうか?
覗けるようであれば 送信した命令のエコーバック状態を確認してみてください。


Mr.XRAY  2020-11-14 13:39:28  No: 149347

> 文字間に遅延を入れないと、連続文字の場合に、2字が飛びます。 

 全く関係ないかも知れませんが,
 telnet の localecho がもしオフだったら,オンにしたらどうなるでしょう.
 
 Microsoft telnet> set localecho  

オフにするのは unset localecho です.


Hiisan  2020-11-16 08:47:35  No: 149359

また解決するまで続けますと、ながくなりますので、
  OpenSSLの使い方は、解りましたので、解決とさせていただきます。
takeさま、XRAy様本当にありがとうございました
takeさま:色々ご指摘有難うございました。
XRayさま、いつもXrayさまのURLは、いつも、参考にしています。
  telnet の localecho がもしオフだったら,オンにしたらどうなるでしょう.
  Microsoft telnet> set localecho  --->OpenSSLで進めていますので、:検討してみます
今後ともよろしくご指導を、お願いいたします


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加