40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

iPhoto写真を一括でEvernoteに取り込めそうだけど・・・

※2010年9月13日追記
MacユーザでRubyの環境が整っていない人向けにAppleScript 使って特定のフォルダ配下の写真をまとめてインポートするを書きましたのでよろしければそちらもご覧ください

iPhoto写真を一括でEvernoteに取り込むのに、

「あーそういえば、Evernoteってメール送信で情報取り込めたんだった」

っていうのを思い出して、GmailSMTPサーバ使うことを思いつきました。

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()