着信メールメッセージでスクロールロックを点滅(perl + bash)

この問題に基づいています。



目的:受信トレイに新しい未読メッセージがある場合にキーボードのLEDを点滅させる方法を学びます。



追加します。 条件:OS-Linux、言語-perl(メールチェック)およびbash(実際に点滅)。







実際、最初のトピックでアドバイスしたように、問題をコンポーネントに分割します。

  1. ダイオードを点滅させることを学ぶ
  2. 新しいメッセージがないかメールを確認する方法を学ぶ
  3. 両方のアイテムを友達にする




ダイオードを点滅させることを学ぶ


Ledcontrolデーモンはありますが、リポジトリにはありませんでしたので、 xsetコマンドを使用してカーソルを点滅させます

#!/bin/bash trap 'xset -led named "Scroll Lock"; exit ' SIGINT SIGTERM while(true); do xset led named "Scroll Lock" ; sleep 0.05 ; xset -led named "Scroll Lock"; sleep 0.05; done
      
      





このコードはbeepScrollファイルに保存され、ファイルは$ PATHにリストされているディレクトリのいずれかに置かれ、実行権が与えられました。 SIGINTを受信すると、LEDをオフにし、トラップ経由でオフにすることに注意してください。

新しいメッセージのメールをチェックすることを学ぶ


 sub mymail(){ use Mail::IMAPClient; use IO::Socket::SSL; while (42){ my $user = 'login'; my $server = 'server.ltd'; my $pass = 'P@ssw0rd'; my $socket = IO::Socket::SSL->new( PeerAddr => $server, PeerPort => 993, ) or die "socket(): $@"; my $imap = Mail::IMAPClient->new( Socket => $socket, Server => $server, User => $user, Password => $pass, Debug => 0) or die "Cannot connect to $server as $user: $@"; my $not_read; foreach my $f ($imap->folders) { my $i = $imap->unseen_count($f)||0 ; $not_read += $i; } $imap->logout(); print $not_read; } }
      
      





ここで必要なモジュールを接続し(Mail :: IMAPClientは標準配信に含まれません、個別に配信する必要があります)、1)imapを介してサーバーに接続し、INBOXディレクトリとそのサブディレクトリで未読メッセージの数を受信し、その数を返し、待機します分から始まり、最初から始まります。



みんな一緒


ここで、私はもっと詳しく説明したいと思います。 2つのスレッドを実行します。 最初のものはメールをチェックし、未読メッセージの数を2番目に送信します。 2番目は最初からメッセージを受信し、カーソルで点滅スクリプトを開始/停止します。

だから:
 #!/usr/bin/perl #   use strict; use threads; #  use Thread::Queue; #       my $mypipe = Thread::Queue->new; #  #    threads->create(\&mymail); #   threads->create(\&myleds)->join; #    
      
      





2番目のスレッドに参加するということは、アクションを続行する前に、このスレッドの終了を待つ必要があることを意味します。

myleds関数コード自体:

 sub myleds(){ my $beep = 0; #1     . my $mypid; # pid ,   while($_ = $mypipe->dequeue){ #     if ($_ > 1){ if ($beep == 0){ $mypid = `nohup beepScroll > /dev/null 2>&1 &echo \$!`; #     pid'   $beep = 1; } } else { `kill $mypid` if $mypid; #    ,      . $mypid = 0 if $mypid; $beep = 0; } } }
      
      



、および関数mymail()で置換する必要があります
 prinr $not_read
      
      



 $mypipe->enqueue($not_read+1)
      
      



「$ not_read + 1」は、whileが0になった場合、条件が偽と見なされるためです。



スクリプトの最終バージョン
 #!/usr/bin/perl use strict; use threads; use Thread::Queue; my $mypipe = Thread::Queue->new; threads->create(\&mymail); threads->create(\&myleds)->join; sub mymail(){ use Mail::IMAPClient; use IO::Socket::SSL; while (42){ my $user = 'login'; my $server = 'server.ltd'; my $pass = 'P@ssw0rd'; my $socket = IO::Socket::SSL->new( PeerAddr => $server, PeerPort => 993, ) or die "socket(): $@"; my $imap = Mail::IMAPClient->new( Socket => $socket, Server => $server, User => $user, Password => $pass, Debug => 0) or die "Cannot connect to $server as $user: $@"; my $not_read; foreach my $f ($imap->folders) { my $i = $imap->unseen_count($f)||0 ; $not_read += $i; } $imap->logout(); $mypipe->enqueue($not_read+1); sleep 60; } #     ...     :) $mypipe->enqueue(undef); exit 1; } sub myleds(){ my $beep = 0; my $mypid; while($_ = $mypipe->dequeue){ if ($_ > 1){ if ($beep == 0){ $mypid = `nohup beepScroll > /dev/null 2>&1 &echo \$!`; $beep = 1; } } else { $beep = 0; `kill $mypid` if $mypid; $mypid = 0 if $mypid; } } }
      
      






All Articles