Thu May 21 20:34:51 JST 2015

メール通知

Macの「メール」なる標準アプリ (それ以上に詳しい名前がそのソフトウェアに与えられているか知らない) なら新着が来たら通知が少しの間だけデスクトップの右上にあるけど. すぐに消えるし, Macの上でだけだし.

すぐに気づくのはTwitterのリプライだ.

なにはともかく, メールの新着をチェックするところを書いた.

nodeの process_child で openssl を呼んで, IMAPのコマンドを直に叩かせるだけである. IMAPの実際のコマンドを見るのは初めてだったが, コマンドラインから ssh をつかい GMail で読み書きする - KRAKENBEAL RECORDS ってゆう記事の 「コマンドラインでGMailのメールを読む」の節を参照した.

IMAPを用いてGMailでメール何件溜まってるかと最新のやつのfromだけ取ってくる

{spawn} = require 'child_process'
client = spawn 'openssl', ("s_client -crlf -connect imap.gmail.com:993".split ' ')

gmail = "your@gmail.com"
password = "yourS3cr3tPassowrd"

mail_number = -1
from = false

defer = ->
  console.log "#{mail_number} mails exist in inbox"
  console.log "the last one from #{from}"

client.stdout.on 'data', (data) ->
  data = data.toString()
  console.log data
  switch
    when (data.indexOf 'OK Gimap ready') >= 0
      client.stdin.write "? login #{gmail} #{password}\n"
    when (data.indexOf 'authenticated (Success)') >= 0
      client.stdin.write '? select inbox\n'
    when (/\*\s\d*\sEXISTS/.test(data))
      mail_number = data.match(/\*\s(\d*)\sEXISTS/)[1] | 0
      client.stdin.write "? fetch #{mail_number} body[]\n"
    when (data.indexOf 'Message-ID: ') >= 0
      lines = data.split '\n'
      around = false
      for i in [0...lines.length]
        if (lines[i].indexOf 'From: ') is 0
          around = lines[i] + lines[i+1]
      from = if /<.*>/.test around
        around.match(/<(.*)>/)
      else
        (around.split ' ')[1]
      client.kill 'SIGHUP'
      do defer

この defer の部分を Twitter にして, 全体を数分置きに呼ぶというものを csisv16:~/mail_notify/main.coffee に置いて現在試用中である


先日Amazonで注文したイヤホンが今日の15時にポストを見ると入ってた