[#46093] 質問:mingw環境でのtcltklib.soのコンパイル — Dice <rubyist@...>

Diceです。

12 messages 2009/06/16

[ruby-list:46095] TMailで、TMail::Mail.write_backの使い方

From: MATSUNAGA Ichiro <vikke@...95.to>
Date: 2009-06-17 07:04:12 UTC
List: ruby-list #46095
松永といいます。

ruby 1.8.7p173 on Ubuntu8.04の環境で作業しています。

rfc822で複数メールを添付されているメール(MLの過去ログ取得等)をMaildir形式でメール毎にバラしたく、丁度rubyの勉強も兼ねて書いてみました。メールの取り扱いはTMail(1.2.3.1)をgemで入れて使っています。
しかし、エラーが出てしまい原因がわかりません。なにかアドバイスがあればお願いします。

問題の箇所ですが、バラしたメールを新しいPortで作成したメールに入れて、
new_mail.write_back();
でファイルに書き出しているつもりなのですが、下記のようなエラーが出てしまい、正常に書込めません。
./Maildir/tmp/生成されたファイルを見てみると、改行が2つ(0a0a)のみ入ったメールファイルが作成されています。

またエラーと関係無いのですが、./Maildir/tmpに作成されたメールを./Maildir/newへ移動したく、新規作成したメールのPortに対してmove_to_newしても、同一内容が./Maildir/newに作成されるだけど、依然./Maildir/tmpにファイルが残ります。なにか私が勘違いしているのでしょうか?これは、write_backしている部分をとりあえずコメントアウトして実行した時に発生しています。

以上、よろしくお願いします。

- エラー -------------------------------------------
/usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/encode.rb:530:in `fold': undefined method `string' for #<File:0xb7ad35c4> (NoMethodError)
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/encode.rb:509:in `add_lwsp'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/encode.rb:291:in `space'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/header.rb:599:in `do_accept'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/header.rb:165:in `accept'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/mail.rb:174:in `accept'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/mail.rb:344:in `ordered_each'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/mail.rb:344:in `each'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/mail.rb:344:in `ordered_each'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/mail.rb:342:in `each'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/mail.rb:342:in `ordered_each'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/mail.rb:171:in `accept'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/mail.rb:192:in `with_multipart_encoding'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/mail.rb:170:in `accept'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/encode.rb:98:in `accept_strategy'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/encode.rb:74:in `encoded'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/mail.rb:166:in `write_back'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/port.rb:87:in `open'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/port.rb:87:in `wopen'
        from /usr/local/lib/ruby/gems/1.8/gems/tmail-1.2.3.1/lib/tmail/mail.rb:166:in `write_back'
        from ./r8s.rb:59
        from ./r8s.rb:32:in `each'
        from ./r8s.rb:32





- script -------------------------------------------
#!/usr/bin/env ruby1.8.7

require 'rubygems'
require 'tmail'

class TMail::Mail

	def copy_from!(src_mail)
		src_mail.each_header(){|k, v|
			self[k] = v.to_s();
		}
		self.body = src_mail.body;
	end

	def headers_to_s
		tmp="";
		self.each_header(){|k, v|
			tmp += "#{k}: #{v}\n";
		}
		return tmp;
	end

end

# 抽出元メール。rfc822で複数メールが添付されている。
target_mail = TMail::Mail.load("./target_mail");
# 出力先Maildir
maildir = TMail::Maildir.new("./Maildir/");

mails = target_mail.parts();

mails.each(){ |m|
	if m.content_type() != "message/rfc822" then
		continue;
	end

	tmp_mail = TMail::Mail.parse(m.body());

#	print("#<start>##################\n");
#	print(tmp_mail.headers_to_s());
#	print(tmp_mail.to_s() + "\n");
#	print("#< end >###################\n");

	# 新規にMaildir形式でメールを作成し、添付されていたメールを流し込む。
	port = maildir.new_port();
	new_mail = TMail::Mail.new(port);
	new_mail.copy_from!(tmp_mail);

#	print("#<start>###################\n");
#	print(new_mail.headers_to_s());
#	print(new_mail.to_s() + "\n");
#	print("#< end >###################\n");
	
	p(new_mail.port);
	
	# 実際に書込み?
	new_mail.write_back();
	# tmpからnewへ移動?
	port.move_to_new();
}


-- 
MATSUNAGA Ichiro
e-mail: vikke@mars95.to
/.j: http://slashdot.jp/~vikke/
last.fm: http://www.lastfm.jp/user/vikke_bsd/
twitter: http://twitter.com/vikke

Just remember - when you think all is lost, the future remains.
 -- Robert H. Goddard

GPG fingerprint = DCEF C86E 2930 45D0 0941  E977 4DCE A95F 3914 4BED

In This Thread

Prev Next