pandazx's blog

データ分析など雑多な技術ブログ

ruby1.9.3: ActionMailerでメール

Rubyでメールを送る #Ruby #mail #ActionMailer - Qiita
このブログを参考に実装させていただきました。
RailsのActionMailerを利用してメールするのでインストールから。

gem install actionmailer

以下、ソース(ほぼ参考にしたコードそのまま)

#! /usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'action_mailer'

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  address:   'smtp.gmail.com',
  port:      587,
  domain:    'gmail',
  user_name: 'user_name',
  password:  'password'
}

class SampleMailer < ActionMailer::Base
  def first_example(to, from, subject, body)
    mail(
      to:      to,
      from:    from,
      subject: subject.to_s,
      body:    body.to_s
    )
  end
end

to = "test@example.com"
from = "test@example.com"
subject = "テストメール"
body = "こんにちは。今日もよろしくお願いします。"
SampleMailer.first_example(to, from, subject, body).deliver

以下、実装までの七転八倒

NKFでエラー

最初、ActionMailerを使わずにメールする方法を探したところ、
以下のブログがありました。
Rubyで日本語のメールを送る。 - こせきの技術日記

しかし、nkfを使うところで、no output encoding given (ArgumentError)
というエラーが発生。
出力エンコーディングが指定されていないということらしい。

バージョンアップで動作が変わったか?と思い、
ネットを調べたけど、該当するページが見当たらない。

ruby-list jp - [ruby-list:44769] Ann: Ruby-1.9.0-1 Windowsインストーラパッケージ
上記のやりとりで、解決方法が提示されているが、
LANGを削除するというのはやりたくない。

上記はKconvを使う際にencodingを指定してね、ということだが、
私の場合は直接、nkfを使う場合なのでちょっと違う。
この指定方法を調べればいいだけだが、簡単に出てこないので後で調べる

require 'English'

参考にしたコードで require 'English' とあったが意味がわからなかったのでチェック。
$@のようなマジックワードを$ERROR_POSITION というように
人に優しい言葉で書けるようになるらしい。
$@ などの特殊変数をわかりやすい英語名で使用する - わからん

失敗例

発狂する近況 - RubyからGMailにメールを送る テキスト編
このブログも参考にして実行した。
しかし、エラーは出ないが、メールが届かないという現象になった。