真 もわ爛漫

しゃーら、しゃーらしゃーら

Ruby でメールを送るのに手間取った。

  • HTML から引っ張ってきたtitle内の文字列をメールのSubjectにして
  • メール本文にはtitleとURL(とフッタ)を入れて
  • SMTPで送信する

とか言うのをRubyでやろうとした。

すぐにできるかと思ったら、

  • Ruby ワカッテナイ
  • MIME ワカッテナイ

せいで酷い文字化けメールを何件も食らい、妙に時間がかかった。

つーかそもそもRubyなんか for 文の書き方すら良く分かってない。なんてことだ。

結局表題程度のことをやるのに2時間半かかったようだ

…貴重な週末が(涙

      • -

以下の実装が「間違ってる」「非効率的」「バカ」という場合には是非つっこんでください

require 'iconv'
require 'net/smtp'
require 'open-uri'
require 'optparse'

...

def parse_uri(uri)
  open(uri) {|f|
    content = f.read
    # TODO(mowa): Is this ok when the title contains "\n"?
    if %r{<title>(.+)</title>} =~ content
      title = Iconv.tou8("#{$+}")
    else
      title = "(no title)"
    end
    # TODO(mowa): MIME B encoding? ...I don't know about it well! :(
    # subject = Iconv.conv("iso-2022-jp", "utf-8", title)
    # escaped_title = subject.to_a.pack('m').gsub(/\n/, '')
    # subject = "=?iso-2022-jp?B?#{escaped_title}?="
    escaped_title = title.to_a.pack('m').gsub(/\n/, '')
    subject = "=?utf-8?B?#{escaped_title}?="
    content = "#{title}\n#{uri}"
    return subject, content
  }
end

...

ちなみに Iconv.tou8() これ: Ruby: 日本語の文字列を UTF-8 に変換する - bkブログ

utf-8への自動変換も標準ライブラリにないのかしらん…。Python 2.4 で iconv-codec とかいうのが要らなくなったように。

追記:

コメントより

      title = Iconv.tou8("#{$+}")

      title = Iconv.tou8($+)

そうですね(^^;