Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > library net/smtp

library net/smtp

要約

メールを送信するためのプロトコル SMTP (Simple Mail Transfer Protocol) を扱うライブラリです。

ヘッダなどメールのデータを扱うことはできません。 SMTP の実装は [RFC2821] に基いています。

使用例

とにかくメールを送る

SMTP を使ってメールを送るにはまず SMTP.start でセッションを開きます。 第一引数がサーバのアドレスで第二引数がポート番号です。 ブロックを使うと File.open と同じように終端処理を自動的にやってくれる のでおすすめです。

require 'net/smtp'
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
  # use smtp object only in this block
}

your.smtp.server は適切な SMTP サーバのアドレスに読みかえてください。 通常は LAN の管理者やプロバイダが SMTP サーバを用意してくれているはずです。

セッションが開いたらあとは Net::SMTP#send_message でメールを流しこむだけです。

require 'net/smtp'

Net::SMTP.start('your.smtp.server', 25) {|smtp|
  smtp.send_message(<<-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 a test mail.
  EndOfMail
}

セッションを終了する

メールを送ったら Net::SMTP#finish を呼んで セッションを終了しなければいけません。 File のように GC 時に勝手に close されることもありません。 いろいろなところで finish がないソースコードの例を見掛けますが、 すべて誤りです。finish は必ず呼んでください。

またブロック付きの Net::SMTP.start, Net::SMTP#start を使うと finish を呼んでくれるので便利です。 可能な限りブロック付きの start を使うのがよいでしょう。

require 'net/smtp'

# using SMTP#finish
smtp = Net::SMTP.start('your.smtp.server', 25)
smtp.send_message mail_string, 'from@address', 'to@address'
smtp.finish

# using block form of SMTP.start
Net::SMTP.start('your.smtp.server', 25) {|smtp|
  smtp.send_message mail_string, 'from@address', 'to@address'
}

文字列以外からの送信

ひとつ上の例では文字列リテラル (ヒアドキュメント) を使って送信しましたが、 each メソッドを持ったオブジェクトからならなんでも送ることができます。 以下は File オブジェクトから直接送信する例です。

require 'net/smtp'

Net::SMTP.start('your.smtp.server', 25) {|smtp|
  File.open('Mail/draft/1') {|f|
    smtp.send_message f, 'your@mail.address', 'to@some.domain'
  }
}

HELO ドメイン

SMTP ではメールを送る側のホストの名前 (HELO ドメインと呼ぶ) を要求 されるのですが、Net::SMTP ではとりあえず localhost.localdomain と いう名前を送信しています。たいていの SMTP サーバはこの HELO ドメイン による認証はあまり真面目に行わないので (簡単に偽造できるからです) 問題にならないことが多いのですが、まれにメールセッションを切られる こともあります。そういうときはとりあえず HELO ドメインを与えてみて ください。もちろんそれ以外の時も HELO ドメインはちゃんと渡すのが ベストです。

HELO ドメインは Net::SMTP.start, Net::SMTP#start の第三引数 helo_domain に指定します。

Net::SMTP.start('your.smtp.server', 25, 'mail.from.domain') {|smtp|

よくあるダイヤルアップホストの場合、HELO ドメインには ISP のメール サーバのドメインを使っておけばたいてい通ります。

発生する例外

セッション中に (SMTP レベルの) エラーがおこった場合、 以下の例外が発生します。

Net::ProtoSyntaxError

SMTP コマンドの構文ミス (500番台)

Net::ProtoFatalError

恒久的なエラー (550番台)

Net::ProtoUnknownError

予期しないエラー。おそらくバグ

Net::ProtoServerBusy

一時的なエラー (420/450番台)

クラスとモジュール

class Net::SMTP

Classes

Sublibraries