BLOGTIMES
» ArchiveList (Tag for "perl" )
«Prev || 1 · 2 · 3 · | Next»
2018/07/15

IMAP over SSL/TLS のデバッグを行うスクリプト

perl  systemmanagemant 

SMTP Auth /w STARTSSL のデバッグを行うスクリプトを書いたので、これと対になる IMAPs に対するデバッグスクリプトも作ってみました。

こちらは Mail::IMAPClient というライブラリを使っているので、以下のような感じであらかじめモジュールをインストールしておく必要があります。

cpanm Mail::IMAPClient

書いたスクリプトは以下のような感じ。

imapsLoginDebug.pl

#!/usr/bin/env perl use Mail::IMAPClient; use Data::Dumper; use warnings; use strict; my ($server, $port, $user, $pass) = @ARGV; my $imap = Mail::IMAPClient->new( Server => $server, User => $user, Password => $pass, Authmechanism => 'LOGIN', Ssl => 1, Uid => 1, Debug => 1, Showcredentials => 1, ) or die "ERROR: $@"; print "Login OK.\n"; my $features = $imap->capability; $imap->logout or die "ERROR: Logout ", $imap->LastError, "\n";

コマンドラインの引数として、サーバ名、ポート番号、ユーザー名、パスワードの4つを取ります。
# ただ、ポート番号は使っていないので無視されます。

実際の動作としては以下のような感じでしょうか。
IMAP はちょっとプロトコルが複雑なので、手動だと操作がちょっと難しいんですよね。

perl imapsLoginDebug.pl smtp.office365.com 0 user@example.jp 'password' Started at Sun Jul 15 21:37:17 2018 Using Mail::IMAPClient version 3.39 on perl 5.028000 Connecting with IO::Socket::SSL PeerAddr smtp.office365.com PeerPort 993 Proto tcp Timeout 600 Debug 1 Connected to smtp.office365.com Read: * OK The Microsoft Exchange IMAP4 service is ready. [VABZAEEAUABSADAAMQBDAEEAMAAxADUANQAuAGoAcABuAHAAcgBkADAAMQAuAHAAcgBvAGQALgBvAHUAdABsAG8AbwBrAC4AYwBvAG0A] Sending: 1 LOGIN user@example.jp "password" Sent 45 bytes Read: 1 OK LOGIN completed. Login OK. Sending: 2 CAPABILITY Sent 14 bytes Read: * CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS MOVE ID UNSELECT CLIENTACCESSRULES CLIENTNETWORKPRESENCELOCATION BACKENDAUTHENTICATE CHILDREN IDLE NAMESPACE LITERAL+ 2 OK CAPABILITY completed. Sending: 3 LOGOUT Sent 10 bytes Read: * BYE Microsoft Exchange Server IMAP4 server signing off. 3 OK LOGOUT completed.

    at 22:29 |
    2018/07/15

    SMTP Auth /w STARTSSL のデバッグを行うスクリプト

    perl  systemmanagemant 

    仕事場のメールサーバが Office 365 に切り替わったのですが、なぜか SMTP だけ認証が効かなかったので状況を調査するための簡単なスクリプトを書いてみました。

    昔は通信が平文だったので、SMTP のデバッグも telnet コマンドでイケましたが、今は TLS で暗号化されているのが標準という時代なので、openssl を使う必要が出てきます。今回は SMTP Auth の部分も必要だったので、なるべくマニュアル作業が少なくなるように Perl でスクリプトを書いてみました。

    Perl はしばらく触れていなかったので、すっかり時代に取り残されてしまっている感じですが、標準の Net::SMTP ライブラリでも SMTP Auth とか、STARTSSL なんかに対応しているんですね。

    smtpStartsslDebug.pl

    #!/usr/bin/env perl use strict; use warnings; use utf8; use Net::SMTP 3.0; use Authen::SASL qw(Perl); my ($mailserver, $port, $user, $password) = @ARGV; my $smtp = Net::SMTP->new( $mailserver, Port => $port, Timeout => 10, Debug => 1, ); die "ERROR: smtp connection failed.$!" if !defined $smtp; $smtp->starttls(); $smtp->auth( $user, $password) or die "ERROR: Authentication failed.\n"; $smtp->quit();

    コマンドラインの引数として、サーバ名、ポート番号、ユーザー名、パスワードの4つを取ります。

    実際に実行してみると、以下のような感じで接続の様子が表示されます。
    # 実際のパスワード等についてはダミーに書き換えてあります。

    $ perl smtpStartsslDebug.pl smtp.office365.com 587 user@example.jp 'password' Net::SMTP>>> Net::SMTP(3.11) Net::SMTP>>> Net::Cmd(3.11) Net::SMTP>>> Exporter(5.73) Net::SMTP>>> IO::Socket::IP(0.39) Net::SMTP>>> IO::Socket(1.39) Net::SMTP>>> IO::Handle(1.39) Net::SMTP=GLOB(0x2829750)<<< 220 TYAPR01CA0017.outlook.office365.com Microsoft ESMTP MAIL Service ready at Sun, 15 Jul 2018 12:41:09 +0000 Net::SMTP=GLOB(0x2829750)>>> EHLO localhost.localdomain Net::SMTP=GLOB(0x2829750)<<< 250-TYAPR01CA0017.outlook.office365.com Hello [160.16.198.140] Net::SMTP=GLOB(0x2829750)<<< 250-SIZE 157286400 Net::SMTP=GLOB(0x2829750)<<< 250-PIPELINING Net::SMTP=GLOB(0x2829750)<<< 250-DSN Net::SMTP=GLOB(0x2829750)<<< 250-ENHANCEDSTATUSCODES Net::SMTP=GLOB(0x2829750)<<< 250-STARTTLS Net::SMTP=GLOB(0x2829750)<<< 250-8BITMIME Net::SMTP=GLOB(0x2829750)<<< 250-BINARYMIME Net::SMTP=GLOB(0x2829750)<<< 250-CHUNKING Net::SMTP=GLOB(0x2829750)<<< 250 SMTPUTF8 Net::SMTP=GLOB(0x2829750)>>> STARTTLS Net::SMTP=GLOB(0x2829750)<<< 220 2.0.0 SMTP server ready Net::SMTP::_SSL=GLOB(0x2829750)>>> EHLO localhost.localdomain Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-TYAPR01CA0017.outlook.office365.com Hello [160.16.198.140] Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-SIZE 157286400 Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-PIPELINING Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-DSN Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-ENHANCEDSTATUSCODES Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-AUTH LOGIN XOAUTH2 Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-8BITMIME Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-BINARYMIME Net::SMTP::_SSL=GLOB(0x2829750)<<< 250-CHUNKING Net::SMTP::_SSL=GLOB(0x2829750)<<< 250 SMTPUTF8 Net::SMTP::_SSL=GLOB(0x2829750)>>> AUTH LOGIN Net::SMTP::_SSL=GLOB(0x2829750)<<< 334 VXNlcm5hbWU6 Net::SMTP::_SSL=GLOB(0x2829750)<<< (decoded) Username: Net::SMTP::_SSL=GLOB(0x2829750)>>> (decoded) user@example.jp Net::SMTP::_SSL=GLOB(0x2829750)>>> ************************ Net::SMTP::_SSL=GLOB(0x2829750)<<< 334 UGFzc3dvcmQ6 Net::SMTP::_SSL=GLOB(0x2829750)<<< (decoded) Password: Net::SMTP::_SSL=GLOB(0x2829750)>>> (decoded) ******** Net::SMTP::_SSL=GLOB(0x2829750)>>> ******************** Net::SMTP::_SSL=GLOB(0x2829750)<<< 235 2.7.0 Authentication successful target host TYAPR01MB2608.jpnprd01.prod.outlook.com Net::SMTP::_SSL=GLOB(0x2829750)>>> QUIT Net::SMTP::_SSL=GLOB(0x2829750)<<< 221 2.0.0 Service closing transmission channel

      at 22:08 |
      2018/07/14

      plenv で Perl 環境を作る

      perl 

      以前から Ruby は rbenv というソフトウェアを使って、自由にバージョンを切り替えたりできるようにしているのですが、同じことを Perl で実行できる plenv というソフトウェアがあることが分かったのでメモ。

      インストール方法

      以下のような感じでインストールできるのですが、rbenv にそっくりですね。

      git clone git://github.com/tokuhirom/plenv.git ~/.plenv git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/ echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(plenv init -)"' >> ~/.bash_profile . ~/.bash_profile

      Perl の特定のバージョンのインストールや切り替えについても rbenv とほぼ同様の操作でイケます。

      plenv install --list plenv install 5.28.0 plenv global 5.28.0 plenv install-cpanm plenv rehash

        at 22:59 |
        2013/10/24

        CPAN で依存モジュールのインストール時にプロンプトが出ないようにする

        perl 

        CPAN でモジュールをインストールしようとすると、デフォルトでは依存するモジュールをインストールするか yes/no で選択するプロンプトが出るようになっていると思います。依存性が少ない場合はそれほど気になりませんが、依存性が多いモジュールをインストールする場合には何度も yes と打ち込んでいく必要があるわけですが、これがなかなかに面倒なので、プロンプトなしで自動的にインストールするようにする方法を調べたのでメモ。

        CPAN を起動し、下記のコマンドを入力して、CPAN の設定を変更すればOKです。
        ちなみにこの o コマンドで設定できる項目については「Config Variables - CPAN - search.cpan.org」で解説されているので、一度目を通しておくと良いです。

        # perl -MCPAN -e shell cpan shell -- CPAN exploration and modules installation (v1.7602) ReadLine support enabled cpan> o conf prerequisites_policy follow #依存モジュールをインストールするように prerequisites_policy follow cpan> o conf build_requires_install_policy yes #ビルド時にのみ必要なモジュールをインストールするように build_requires_install_policy yes cpan> o conf commit #設定を保存 commit: wrote /usr/lib/perl5/5.8.8/CPAN/Config.pm

          at 21:23 |
          2013/09/03

          Regexp::Assemble で正規表現を生成する

          perl  regex 
          詳説 正規表現 第3版

          以前、Regexp Assemble For PHP は使ったことがありましたがオリジナルの Regexp::Assemble は使ったことがなかったのでちょっと動かしてみました。
          このモジュールを使えば、フクロウ本とにらめっこしなくても、複雑な正規表現を効率よく組み立てることができます。

          サンプルほとんどそのままですが、UTF-8が通るようにしてあります。

          #!/usr/bin/env perl use Regexp::Assemble; use warnings; use strict; use utf8; binmode STDIN, ":utf8"; binmode STDOUT, ":utf8"; my $ra = Regexp::Assemble->new(); while (my $line = <STDIN>){ chomp($line); $ra->add($line); } print $ra->re;

          以下、実行例。

          [Regexp::Assemble で正規表現を生成する の続きを読む]

            at 17:45 |
            2010/10/31

            perlに1秒未満のsleepをさせるには

            perl 

            久しぶりにperlのスクリプトを書いていたら、sleepの引数がfloatにできなくてはまったのでメモ。

            test.pl

            #!/usr/bin/perl sleep (1.5);

            これを実行すると、実際には1秒しかsleepしてくれません。

            $ time ./test.pl real 0m1.004s user 0m0.001s sys 0m0.001s

            この問題についてググってみるとTime::HiRes*1を使えばいいことが分かったので、モジュールをインストールして下記のようにプログラムを書き換えてみました。

            test2.pl

            #!/usr/bin/perl use Time::HiRes qw ( sleep ); sleep (1.5);

            これでsleepを小数点対応にオーバーライドすることができました。

            $ time ./test2.pl real 0m1.517s user 0m0.012s sys 0m0.002s

            at 02:55 |
            2010/09/28

            AddressDB.pdb を .vcf ファイルに変換する

            ios  palm  perl 

            先ほどのエントリでカレンダーは取り込めたので、次はアドレス帳の取り込みに挑戦です。

            iPod TouchはvCard形式のデータ(.vcf)を取り込むことができることが分かったので、DatebookDB.pdbの時と同じようにAddressDB.pdbを.vcfに変換するスクリプトを探して見たところ「Tip: Perl script to turn AddressDB.pdb into a vcar... - Palm Support Community」で紹介されているAddressDB2VCard.plが使えそうだったので、これを使うことにしました。

            が、一筋縄ではいかなかったのでその顛末をメモ。

            [AddressDB.pdb を .vcf ファイルに変換する の続きを読む]

              at 21:50 |

              DatebookDB.pdb を ics ファイルに変換してGoogleカレンダーにインポート

              ios  palm  perl  scheduler 

              iPod Touch はいわゆるPDA的な使い方ができる端末なのですが、PDAという単語で僕は2000年~2004年頃にかけてPalmをかなり使い込んでいたことを思い出しました。既にPalmの実機は手元にはないのですが、家の中を探したところデータのバックアップを取ったメモリが残っていたので、DatebookDB.pdb から当時のスケジュールデータを復元してみることにしてみました。

              なんとかics形式まで持っていければ、Googleカレンダーに取り込むことができるので、何か方法はないかと調べたところ「Palm データベースの iCalendar 形式への変換 | yendo weblog」に掲載されている、 pdatebook2ical.pl がそのものズバリの作業をしてるようだったので、今回はこれを使います。

              まず、CPANのモジュールが必要なのでインストールします。

              # perl -MCPAN -e 'shell' cpan> install Palm::PDB Palm::Datebook

              スクリプトはファイルの変換が ~/.jpilot/DatebookDB.pdb → ~/.evolution/calendar/local/system/calendar.ics に固定されているので、これを下記のようにカレントディレクトリのファイルが処理対象になるように変更しておきます。

              $ diff -u pdatebook2ical.pl.org pdatebook2ical.pl --- pdatebook2ical.pl.org 2006-11-08 02:24:09.000000000 +0900 +++ pdatebook2ical.pl 2010-09-28 18:59:54.000000000 +0900 @@ -12,8 +12,10 @@ my $location_delimiter =" "; # delimiter between summary & location my $codeset = "utf8"; # output codeset -my $dbfile = "$ENV{HOME}/.jpilot/DatebookDB.pdb"; -my $icsfile ="$ENV{HOME}/.evolution/calendar/local/system/calendar.ics"; +my $dbfile = "./DatebookDB.pdb"; +my $icsfile ="./calendar.ics"; # my $icsfile ="/media/iPod/Calendars/calendar.ics"; my $data_server = "evolution-data-server-1.4";

              あとはDatebookDB.pdbをカレントディレクトリに置き、下記のコマンドを実行してやると calendar.ics が得られるので、これをGoogleカレンダーにインポートしてやればOKです。いきなり、既存のカレンダーに予定をマージするのは危険なので、できればインポート用に別のカレンダーを作ってからマージするのがオススメです。

              $ perl pdatebook2ical.pl

              復元されたカレンダー情報は10年前というとちょうど大学3年生の時で、駆け出しITエンジニア&就職活動が始まるちょっと前という感じでした。眺めていると思わず目頭が熱くなるような記録もあり、当時のエピソードが昨日のことのように思い出されたものもありました。当時から考えれば、10年後にこんなことになってるとは夢にも思わなかったなぁ。


                at 19:22 |
                2009/09/24

                Thunderbirdのアドレスブックからメールアドレスを取り出す

                perl  thunderbird 

                最近spamがまた酷くなってきたので、フィルタリングのルールを強くしたら、仕事関係のメールがspamに振り分けられるという問題が発生してきたので、メーラーのアドレス帳からメールアドレスを拾ってホワイトリストを作ろうと思って、Thunderbirdのアドレス帳からメールアドレスを抽出するスクリプトを書いてみました。

                Thunderbirdのアドレスブックは.mabというちょっと変な形式になっています。どうやら歴史的な経緯でこの形式が使われているようなのですが、なかなか厄介な形式のようです。

                Mork の謎 Firefox Hacks 翻訳日記/ウェブリブログ

                Mork の何が悪いのか?
                1. Mozilla 以外には使われていない、独自仕様のデータフォーマット。
                2. 仕様書がない (に等しい) ので解析が困難。
                3. 開発者がすでに退社しており、継続的な開発・修正が困難。
                4. ファイルの一部が破損したときに手作業での修復が困難。
                5. 開発者の言によれば、「テキストファイル形式を使うのは馬鹿げている、と思ったがそうしろと命令されたから作った」(前出 WebArchive のページ)

                これを扱うためのライブラリとしてCPANにFile::Morkというモジュールがあり、すでにこれを使ってスクリプトを書いた人もいるようなので*1、そのプログラムを参考(というか、ほとんどそのまま)にスクリプトを作ってみました。

                [Thunderbirdのアドレスブックからメールアドレスを取り出す の続きを読む]

                at 23:37 |
                2009/06/01

                XML-RPCを使ってTracのチケットに添付ファイルを投げ込む(Perl編)

                trac  perl 

                仕事場に導入したTracはかなり活用されてきていて、導入した自分としては嬉しい限りです。僕はコンソール作業の記録をしばしばTracに転記しているのですが、そうするとコンソールとウェブブラウザを行ったり来たりしなければならないので、それがちょっと面倒になってきました。

                ということで、ブラウザを開かずに、Linux上のコンソールのコマンドで特定のチケットに添付ファイルを投げ込むスクリプトを書いてみました。Tracには他のシステムと連携するためにXML-RPCというインタフェイスが用意されているので、これをPerlから叩いてみます。XML-RPCについてはNucleus関連の開発でも散々いじったので自分としてはPHPで書くのが一番得意なのですが、今回はPerlで開発することにします。

                [XML-RPCを使ってTracのチケットに添付ファイルを投げ込む(Perl編) の続きを読む]

                  at 21:03 |
                  «Prev || 1 · 2 · 3 · | Next»
                  » ArchiveList (Tag for "perl" )