メールを見たい? curlで良いんじゃない?
ほとんどのエンジニアには解けるパズル2を解いていたらcurlが楽しくなってしまったので、curlの勉強をしようと思いまして。 んで色々調べていたら、どうもcurlはIMAPも取り扱えるらしい。なんでやねん、と思いつつ試してみたので、やり方をメモ。
今回はgmailで試すのでgmailのアドレスを書いていますが、おそらくIMAPサーバーならどこででも使えます。試してません。
curlでメールを送信する記事もあります。あわせてどうぞ。
メールの件数を取得する
とりあえず、メールボックスの一覧を取得します。
$ curl -u username 'imaps://imap.gmail.com:993' Enter host password for user 'username': * LIST (\HasNoChildren) "/" "INBOX" * LIST (\HasChildren \Noselect) "/" "[Gmail]" * LIST (\All \HasNoChildren) "/" "[Gmail]/&MFkweTBmMG4w4TD8MOs-" * LIST (\HasNoChildren \Trash) "/" "[Gmail]/&MLQw33ux-" --以下略--
環境にもよると思いますが、なんかいっぱい出てきます。ずらずら。文字化け(?)は気にしてはいけない。
そしたら、INBOXに入ってるメールの件数を取得してみます。
$ curl -u username 'imaps://imap.gmail.com:993' -X 'EXAMINE INBOX' Enter host password for user 'username': * FLAGS (\Answered \Flagged \Draft \Deleted \Seen $Forwarded $MDNSent $NotPhishing $Phishing Junk NonJunk) * OK [PERMANENTFLAGS ()] Flags permitted. * OK [UIDVALIDITY 123456789] UIDs valid. * 10051 EXISTS * 0 RECENT * OK [UIDNEXT 12345] Predicted next UID. * OK [HIGHESTMODSEQ 1234567
一部適当な数字で置き換えていますが、だいたいこんな出力。
気にすべきは、10051 EXISTS
ってところ。10051件のメールがあります。わお。
メールを読む
そしたら今度は、いよいよメールを読んでみます。
$ curl -u username --silent 'imaps://imap.gmail.com:993/INBOX;UID=10051;SECTION=TEXT' | nkf Enter host password for user 'username': ここからメールの本文。ずらずらと。
--silent
オプションを外すと、ダウンロードの進捗状況が表示されます。無くても良い。
nkf
はメールをデコードするために使っています。必要無い場合もあるし、別のコマンドにしないといけない場合もあるかも。
UID=10051
のところで指定している数字がメールの番号で、数字を大きくすると新しい、小さくすると古いメールになります。
;SECTION=TEXT
を外すとヘッダー込みのデータが、;SECTION=HEADER
にするとヘッダーのみのデータを取得出来ます。
未読/既読の操作
でまあ、こうなると未読メールの一覧も取得したくなるわけです。取得してみます。
$ curl -u username 'imaps://imap.gmail.com:993/INBOX' -X 'SEARCH UNSEEN' Enter host password for user 'username': * SEARCH 10046 10050
こんな感じ。 お察しの通り、表示された番号がメールのUIDです。さっきのメールを見るコマンドを使えば目的のメールを見ることが出来ます。 取得するだけで既読フラグが付くようで、わりと良い感じです。
既読フラグを操作したいときはSTOREコマンドで以下のように。
$ curl -u username 'imaps://imap.gmail.com:993/INBOX' -X 'STORE 10050 -Flags \Seen' Enter host password for user 'username': * 10050 FETCH (FLAGS ()) $ curl -u username 'imaps://imap.gmail.com:993/INBOX' -X 'STORE 10050 +Flags \Seen' Enter host password for user 'username':
大体同じ感じのコマンド。
違うのはFlags
の前の+
と-
だけです。+
なら既読に、-
なら未読に。
なんでも出来る感じあって良いね、curl。もっときちんと使いこなせるようになりたいものです。