From: Minero Aoki Date: 2000-04-27T18:34:00+09:00 Subject: [ruby-list:22157] Re: net/smtp あおき(net/smtp.rb 作者)です。 In mail "[ruby-list:22153] net/smtp" Jota Matsubara wrote: > ruby 1.4.3 で標準に付いて来る net/smtp の sendmail の使い方がわかりま > せん。 どなたかご教示頂けないでしょうか? > > def sendmail( mailsrc, fromaddr, toaddrs ) ← subject のための引数を取 > らないので、送出される mail には subject が付きません。これをうまく > subject がつけられるようにする方法はあるでしょうか? smtp.rb は本当に SMTP のやることしかやらないので、メールを送ること しかしません。Subject: や To: (ヘッダ)は SMTP によって送られる データであって smtp.rb が作るわけではないので、送る側で別に 用意しておかなければいけません。(それは、引数 mailsrc の中に含めます。) > 当方では5〜10分間隔で数百〜数千のアドレスにメールを送る機能を作ろうと > 考えているのですが、調べてみたところ mail に関するライブラリは複数ある > ということでした。 上記の目的のためにお勧めのライブラリもあれば教えて > 頂ければ幸いです。 メールをつくる部分に関しては TMail(あおき作) があります。 送信の部分については net/smtp.rb で十分です。 その間をつなぐ部分は自動化されていません。 ぼくが一番よく知ってるのは TMail なので、ここでは TMail と smtp.rb を組みあわせて使う例をあげます。 1. メッセージを作成する 一般に、まともに外に出せるメールをつくるなら 1) To:、Subject:、Date:、Mime-Version:、Content-Type: をつける 2) ヘッダにある mail safe でない部分を B エンコード 3) 必要なら本体を Base64 エンコード 4) できればヘッダの文法チェック は最低でも行う必要があります。 1) は tmail.date = Time.now tmail.['Mime-Version'] = '1.0' tmail.set_content_type 'text', 'plain', {'charset'=>'iso-2022-jp'} のようにすればできます。もちろん、Content-Type の text とか charset とかは適切な値を使ってください。 2) 4) は TMail::Mail#encoded メソッドが自動でやります。 3) は tmail.body = [tmail.body].pack('m') tmail.encoding = 'Base64' でできます。ゼロからメールを作成するなら、すでに文字列になっていると 思うのでその場合は最初の行を tmail.body = [mailbody].pack('m') とします(このへんのところがまだヨワい)。 2. 送信 # 宛先アドレスを To Cc Bcc から集める toa = [] tmail.each_dest {|a| toa.push a } # Bcc は消す tmail.delete 'bcc' # 送信元は From: の最初のアドレスを使うことで妥協しておく fro = tmail.from # 送る Net::SMTP.start( addr, port ) do |smtp| # メール全体が文字列になるのででかいと危険 smtp.sendmail tmail.encoded, fro, toa end ちなみに TMail は RAA からとれます。使い方の詳細はパッケージに 入ってる HTML ドキュメントを参照してください。 ------------------------------------------------------------------- あおきみねろう