Ruby SMTP メール

Rubyでメールを送信する

  RubyにはSMTPを扱うライブラリがある。

  • 単にメールを送る
require 'net/smtp'

#SMTP.start でセッションを開く
#第一引数がサーバのアドレスで第二引数がポート番号
#ブロックを使うとセッションの終了を自動的にやってくれる。
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
  #send_mail(テンプレート, 送信元, 送信先)
  #テンプレートをメールとして送信します。eachイテレータを持つオブジェクトならなんでもよい(StringやFileなど)。 
    smtp.send_mail <<EndOfMail, 'your@mail.address', 'to@some.domain'
From: Your Name <your@mail.address>
To: Dest Address <to@some.domain>
Subject: test mail
Date: Sat, 23 Jun 2001 16:26:43 +0900
Message-Id: <unique.message.id.string@some.domain>

This is test mail.
EndOfMail
}
  • 日本語でメールを送る
require 'net/smtp'
#日本語化のライブラリ?
require "nkf"

def sendmail(to, from, subject, body)
body = <<EOT
From: #{from}
#宛先は改行して表示
To: #{to.to_a.join(",\n ")}
#-Mオプション:自動で折り返し。
#-m0オプション:MIMEデコードをしない。
#-Wオプション:(W:UTF-8 / E:EUC-JP / S:SJIS)
Subject: #{NKF.nkf("-WMm0", subject)}
Date: #{Time::now.strftime("%a, %d %b %Y %X")}
#最低限3つのMIMEヘッダをつける。
#Mime-Version,Content-Type,Content-Transfer-Encoding
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

#{NKF.nkf("-Wjm0", body)}
EOT
Net::SMTP.start( 'mail-smtp.sample.co.jp', 25 ) {|smtp|
  smtp.send_mail body, from, to
}
end

sendmail("s@mple.co.jp", "s@mple.co.jp", "日本語", "テストメール")
    • 参考:NKFライブラリ

     http://www.ruby-lang.org/ja/man/html/nkf.html#a.a5.aa.a5.d7.a5.b7.a5.e7.a5.f3.ca.b8.bb.fa.ce.f3

  • 完成形
require 'net/smtp'
require "nkf"

def sendmail(to, from, subject)
#-Mオプション:自動で折り返し。
#-m0オプション:MIMEデコードをしない。
#-Wオプション:(W:UTF-8 / E:EUC-JP / S:SJIS)
#疑問:件名と本文で文字コードが異なる。(件名はSJIS,本文UTF-8)
body = <<EOT
From: #{from}
To: #{to.to_a[1].join(",\n ")}
Cc: #{to.to_a[0].join(",\n ")}
Bcc: #{to.to_a[2].join(",\n ")}
Subject: #{NKF.nkf("-SMm0", subject)}
Date: #{Time::now.strftime("%a, %d %b %Y %X")}
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

EOT
#ファイルをテンプレートとして読み込み
  File.open( 'template.txt' ) {|f|
  f.each{|line| body += NKF.nkf("-Wjm0", line)}
}
Net::SMTP.start( 'mail-smtp.sample.co.jp', 25 ) {|smtp|
  smtp.send_mail body, from, to
}
end

to = ["s@mple.co.jp","admin@example.com","ex@mple.co.jp"]
sendmail(to, "s@mple.co.jp", "○○の件")