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つのパラメータを実行時引数として与え、標準入力の内容をメール本文にします。
- SMTPサーバー名
- 送信者(From)メールアドレス
- 宛先(To)メールアドレス
- 件名(Subject)
また、件名と標準入力の文字コードは Shift_JIS とし、メールは UTF-8 形式で送信する事にします。(件名も UTF-8)
ちなみに、Evernote へのノート登録は JIS(ISO-2022-JP)でも特に問題無いようでした。
Scala でメール送信
JavaMail を直接使うのは面倒なので、今回は Commons Email を使いました。
- Apache Commons Email 1.2
- JavaMail 1.4.3
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
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 オプションを指定する必要があります)