iPhoto写真を一括でEvernoteに取り込めそうだけど・・・
※2010年9月13日追記
MacユーザでRubyの環境が整っていない人向けにAppleScript 使って特定のフォルダ配下の写真をまとめてインポートするを書きましたのでよろしければそちらもご覧ください
「あーそういえば、Evernoteってメール送信で情報取り込めたんだった」
っていうのを思い出して、GmailのSMTPサーバ使うことを思いつきました。
Rubyで日本語の添付ファイル付きメールを送信するというエントリを参考にさせていただきつつ、Gmailでメール送信する時にポートを587にしたりと色々と設定ししないといけないから、rubyでgmailの送受信をするを参考にして、mail2evernote.rbというファイルを作成しました。
上記のmail2evernoteがメール送信部分を担当するような形にしたので、後は指定フォルダ配下のファイルに対して順次処理するrbiphoto2evernoteByEmail.rbというのを作成して、一応は動いた。たしかに動いたんだけど、これダメすぎる。
- メール送信の日付=写真撮影日に指定して処理しているつもりだけど、実際にはそこの部分の処理が意図通りになっていないから、Evernoteに取り込まれる時にはスクリプトを実施した時間になってしまっているので、撮影日にならない
- とりあえず10件だけ一気に処理したけど、画像ファイルのBase64エンコード処理がそれなりに時間かかるし、それが原因か画像が重複してる・・・(こういうのは非同期処理でやったほうがよさそうだけど、でもまだよく理解出来ていない)
- 原因はわからないけど、シンプルなテキストだけの情報をメール経由でEvernoteに送ったときに、それがうまく送信されないことがあった。
手元でSMTPサーバたててそれを利用するならまだしも、こういう処理をメール経由で処理するのは、相手(この場合にはGoogle)になんか悪い感じがするし、スパムメール扱いされそうなんで、メール送信経由では無く、順番にenexファイルを作成してそれを順番にインポートするやり方をもう一度模索することにした。
そもそもテストが無い時点でダメすぎだし、晒すのも恥ずかしいけど今の自分の力量を将来の自分がみてどう感じるのかも知りたいので書いておく。
mail2evernote.rbのソースコード
require 'rubygems' require 'tmail' require 'tlsmail' require 'net/smtp' require 'kconv' require 'base64' # 日本語メールクラス class JMail # 初期化処理 def initialize() @mail = TMail::Mail.new @mail.mime_version = '1.0' end # アカウントの設定 def set_account(smtp_server, from_address,login_id,login_passwd) @smtp_server = smtp_server @mail.from = from_address @mail.reply_to = from_address @login_id = login_id @login_passwd = login_passwd end # 宛先を設定する。 def set_to(to_address) @mail.to = to_address @to_address = to_address end # タイトルを設定する。 def set_subject(subject) work = Kconv.tojis(subject).split(//,1).pack('m').chomp @mail.subject = "=?ISO-2022-JP?B?"+work.gsub('\n', '')+"?=" end # 本文を設定する。 def set_text(text) main_text = TMail::Mail.new main_text.set_content_type 'text', 'plain', {'charset'=>'iso-2022-jp'} main_text.body = Kconv.tojis(text) @mail.parts.push main_text end # メールを送信する。 def send(senddate) @mail.date = senddate @mail.write_back Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE) Net::SMTP.start(@smtp_server, 587, 'localhost.localdomain', @login_id, @login_passwd,:login) do |smtp| smtp.sendmail(@mail.encoded, @mail.from, @to_address) end end # ファイルを添付する。 def set_attach(file_path) attach = TMail::Mail.new %r|(^.*)/(.+$)|.match(file_path) file_path, file_name = $1, $2 tmp_file_path = File.expand_path(file_name,file_path) attach.body = Base64.encode64 File.read(tmp_file_path) attach.set_content_type 'application','zip','name'=>file_name attach.set_content_disposition 'attachment','filename'=>file_name attach.transfer_encoding = 'base64' @mail.parts.push attach end end
iphoto2evernoteByEmail.rbのソースコード
require 'rubygems' require 'mail2evernote' require 'nokogiri' class I2E SMTP_SERVER = 'smtp.gmail.com' TO_ADDRESS = 'xxxxxx@m.evernote.com' FROM_ADDRESS = 'xxxxxx@gmail.com' LOGIN_ID = 'xxxxxx@gmail.com' LOGIN_PASSWD = 'xxxxxxx' def initialize(base_directory) @base_directory = base_directory end attr_accessor :evernote_created_date, :evernote_note_title,:evernote_hash, :imgdata def convert jmail = JMail.new() Dir::glob(@base_directory + "Pages/*.html").each{|f| doc = Nokogiri::HTML(open(f)) _filename = f.split(@base_directory + 'Pages/') image_file_name = _filename[1].split('.html') tds = doc.xpath("//td") jmail.set_account(SMTP_SERVER, FROM_ADDRESS, LOGIN_ID, LOGIN_PASSWD) jmail.set_to(TO_ADDRESS) jmail.set_subject(doc.xpath("//title").inner_html) jmail.set_text("scriptから送信" ) jmail.set_attach(@base_directory + "Images/"+ image_file_name[0] + ".jpg") sent_mail_date = convert_date_format(tds[10].text) jmail.send(sent_mail_date) } end private def convert_date_format(str) separete_str = str.split(" ") each_date_element = separete_str[0].split("/") each_minutes_element = separete_str[1].split(":") return Time.local(each_date_element[0].to_i ,each_date_element[1].to_i ,each_date_element[2].to_i, each_minutes_element[0].to_i, each_minutes_element[1].to_i, each_minutes_element[2].to_i) end end _dir = "/Users/xxxxx/Desktop/photobook/" i2e = I2E.new(_dir) i2e.convert()