Scala, F#, Ruby によるメール送信 - メールで Evernote にノート登録

メールを使った Evernote へのノート登録を Scala, F#, Ruby で試してみました。

Evernote は、ノート登録用のメールアドレス(アカウント情報に記載あり)に以下のような Subject(件名)でメール送信するだけでノート登録ができます。(メールの本文がノートの内容となる)

Subjectの命名規則
ノート名 @ノートブック #タグ1 #タグ2 ・・・

ただし、# を含んだタグ(例 F#)の指定方法はわかりません。

サンプルソースは http://github.com/fits/try_samples/tree/master/blog/20101101/


なお、各プログラムは以下の 4つのパラメータを実行時引数として与え、標準入力の内容をメール本文にします。

  1. SMTPサーバー名
  2. 送信者(From)メールアドレス
  3. 宛先(To)メールアドレス
  4. 件名(Subject)

また、件名と標準入力の文字コードShift_JIS とし、メールは UTF-8 形式で送信する事にします。(件名も UTF-8

ちなみに、Evernote へのノート登録は JIS(ISO-2022-JP)でも特に問題無いようでした。

Scala でメール送信

JavaMail を直接使うのは面倒なので、今回は Commons Email を使いました。

charset に UTF-8 を設定すれば UTF-8 で送信できます。

send_mail.scala
import scala.io.Source
import org.apache.commons.mail.SimpleEmail

new SimpleEmail {
    charset = "UTF-8"
    hostName = args(0)
    setFrom(args(1))
    addTo(args(2))
    subject = args(3)
    //標準入力を文字列化して本文に設定
    setMsg(Source.stdin.mkString)
}.send
実行例(test ノートブックにタグ "scala" "java" "開発" を付けてノート登録)
> set CLASSPATH=commons-email-1.2.jar;mail.jar;%CLASSPATH%
> scala send_mail.scala localhost xxxx@xxx.com xxxx@m.evernote.com "テストノート by Scala @test #scala #java #開発" < mail.txt

F# でメール送信

.NET Framework の System.Net.Mail.SmtpClient を使いました。
デフォルト UTF-8 でメール送信するので文字コードを指定する必要はありません。

send_mail.fs
open System
open System.Net.Mail

[<EntryPoint>]
let main(args: string[]) =
    let smtp = new SmtpClient(args.[0])
    //標準入力を文字列化
    let body = Console.In.ReadToEnd()
    //メール送信
    smtp.Send(args.[1], args.[2], args.[3], body)
    0
実行例(test ノートブックにタグ "fsharp" ".NET" "開発" を付けてノート登録)
  • F# 2.0.0
> fsc send_mail.fs
> send_mail.exe localhost xxxx@xxx.com xxxx@m.evernote.com "テストノート by Fsharp @test #fsharp #.NET #開発" < mail.txt

Ruby でメール送信

Net::SMTP だと文字コードまわりが面倒そうだったので、ActionMailer 3.0 を単体で使ってみました。

  • ActionMailer 3.0

ActionMailer::Base のサブクラスを定義するのが一般的な使い方(Rails の場合)だと思いますが、今回は ActionMailer::Base を直接使ってます。

なお、enable_starttls_auto は環境に合わせて設定すればよいと思います。

また、デフォルト UTF-8 でメール送信するのでメール送信時の文字コードを指定する必要はありませんが、Subject やメール本文に使用する文字列は事前に Shift_JIS から UTF-8文字コード変換を行っておく必要があります。

send_mail.rb(Ruby1.9用)
require "rubygems"
require "action_mailer"

ActionMailer::Base.smtp_settings = {
    #SMTPサーバー設定
    :address => ARGV[0],
    :enable_starttls_auto => false
}

subject = ARGV[3].encode("UTF-8", "Shift_JIS")
#標準入力を文字列化
body = $stdin.readlines.join.encode("UTF-8", "Shift_JIS")

ActionMailer::Base.mail(:from => ARGV[1], :to => ARGV[2], :subject => subject, :body => body).deliver

Windows 環境だと個人的に JRuby の方が使い勝手が良い気がしているので、JRuby で実行しています。(encode を使用できるようにするため --1.9 オプションを指定する必要があります)

実行例(test ノートブックにタグ "ruby" "java" "開発" を付けてノート登録)
> jruby --1.9 send_mail.rb localhost xxxx@xxx.com xxxx@m.evernote.com "テストノート by JRuby @test #ruby #java #開発" < mail.txt