これまでは主にGmailを使っていたので、RSSで受けとって新着通知用のアプリで流してたんだけど、訳あって別のメールサーバになったのでそれができなくなった。
Zapierなら同じことが出来ることも確認したんだけど、メールアカウントを外部サービスに預けるのはちょっと抵抗がある。でも常時メーラーを起動しておくのも嫌だ。
ということで、通知用のアプリをIMAP対応にして今まで通りの通知が行われるようにした。
ただし、これまでのRSS受信部分をIMAPにも対応するだけなのでPUSH通知には対応していない。
実装
ほとんどは参考記事からのコピペ。
新着通知したいだけなので既読にする処理は排除。
取得するのは昨日からの未読メールのみ。
既に取得済みのメールは詳細を取得しない。
require 'net/imap'
require 'kconv'
# imapのsslを有効にする
imap_usessl = true
imap_host = "imap.gmail.com"
# ssl有効なら993、そうでなければ143
imap_port = 993
# imapのユーザ名とパスワード
imap_user ="user"
imap_passwd = "password"
# 未読(UNSEEN)のみ取得する
search_criterias = [
'UNSEEN',
'SINCE', (Date.today - 1).strftime("%d-%b-%Y")
]
# メールヘッダの件名(Subject)
subject_attr_name = 'BODY[HEADER.FIELDS (SUBJECT)]'
# 接続
imap = Net::IMAP.new(imap_host, imap_port, imap_usessl)
# ログイン
imap.login(imap_user, imap_passwd)
# 対象のメールボックスを選択
imap.examine('INBOX')
# 未読メールを検索
imap.search(search_criterias).each do |msg_id|
# 取得済みの場合はfetchしない
next if msg_exist?(msg_id)
# 未読メールの件名を取得
msg = imap.fetch(msg_id, [subject_attr_name]).first
subject = msg.attr[subject_attr_name].toutf8.strip
# 新着メールの処理
p subject
end
imap.logout