Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |

2006-09-12(Tue)

net/pop - メールの受信

Ruby勉強

pop/apopサーバーに接続してメールを取って来る。下のサンプルではyahooメールアクセスして各メールのunique-idとヘッダと本文10行をファイルに保存。文字コードはJIS。タイトルデコードNKFで実施、オプションはBだと思ったらNだった、この辺は良くわかっていないです。

追記

nkfオプションmBで上手くいかなかったのは、=?ISO-2022-JP?B?……?=という風にデーコード文字列の両端に識別用?の文字が付加していたためでした。これを除去したらmBデコードできました。ちなみにヘッダにある日本語はSubject以外も同じエンコードを行う模様。


unique-idがわかるのでヘッダだけリストアップして必要なメールだけ取って来るなんていう処理も比較的簡単にできそうですね。


マニュアルhttp://www.ruby-lang.org/ja/man/?cmd=view;name=net%2Fpop

require 'net/pop'
require 'nkf'

POPSERVER = 'pop.mail.yahoo.co.jp'
PORT      = 110
ACCOUNT   = 'user_name'
PASSWARD  = 'passward'

is_apop = false   # APOPならばtrueにする
INBOX   = 'F:/inbox'

pop = Net::POP3::APOP(is_apop).new( POPSERVER, PORT )
pop.start( ACCOUNT, PASSWARD ) do |pop|
  if pop.mails.empty? then
    puts 'no mail.'
  else
    pop.each_mail do |m|
      File.open( INBOX , 'a' ) do |f|
        f.puts "unique_id = " + m.unique_id
        f.puts 
        #h = m.header         # ヘッダのみ
        h = m.top(10)         # ヘッダ+本文(10行)
        flag_subj = false     # Subject: 処理中
        subject = ""
        h.each_line("\n") do |line|
          line.chomp!
          # Subjectのデコード  エンコードされたブロックが複数個ある場合に改行されてる?
          # 本文がJISだったのでタイトルも合わせる
          if flag_subj && /^ / =~ line
            subject << line.lstrip.gsub(/(\=\?.*?\?\=)/){|base| NKF.nkf('-mNj', base)}
          elsif /^Subject:/ =~ line
            subject = line.gsub(/(\=\?.*?\?\=)/){|base| NKF.nkf('-mNj', base)}
            flag_subj = true
          else
            f.puts subject if flag_subj
            f.puts line
            flag_subj = false
          end
        end
        f.puts '---------------------------------------------------'
      end
      # m.delete        # サーバーから削除
    end
  end
end

asaasa_mixasaasa_mix 2006/09/12 23:36 懐かしく思いながらはけさんのスクリプトを眺めてました。自作のhttp://asaasa.tk/wiki/?Ruby/Project/chkmail.rb なスクリプトの最終メンテが5月初旬ですかぁ...そろそろPOP3も、ヘッダ取得&新着チェックの次に進みたいところです(^^ゞ

hakehake 2006/09/13 20:56 今晩は、いろいろとお忙しいそうですね。
「公開メモ」のページはいろいろと参考にさせていただいていますので、また更新されるのを楽しみにしていますね。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hake/20060912/p2