LoginSignup
4
3

More than 5 years have passed since last update.

IMAPで新着記事取得(Ruby)

Posted at

これまでは主に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

参考

rubyを使った未読メール取得のサンプル(IMAP) · GitHub

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3