Rubyで日本語メールを送信する関数
genki
genki
ATOMRSS
  • ソースコードID: 108
  • 登録日時: 2007/08/03 20:39
  • 最終更新日時: 2008/05/18 13:35
  • アクセス数: 2588
  • タグ:  ruby メール送信
  • codeなにがしブックマークに追加する 0 users
  • このページを del.icio.us に追加
  • このページをはてなブックマークに追加
  • GoodJob
  • 1

GJ

説明

Ruby で日本語のメールを送信するためのスクリプトです。下記のように使います

msg "メールの本文\nあいうえお\n";

SENDMail("hoge@example.com",
"fromaddr@example.com",
"メールのサブジェクト",
msg,
"X-hogehoge: hugahoge",
"replyto@example.com")

ソースコード

コメント

ぱっとソースを読んだ限りでは
msgはグローバル変数でなくても動くと思うのですが、
何か特殊な事情があるのでしょうか?

私はnet/smtpにはあまり詳しくないです:-)

GJGJGJGJGJGJGJGJGJGJ

  • ゲスト
  • 2:ゲスト
  • 2007/08/04 11:19

というか、この人の書いたRubyスクリプトはどれも「Rubyらしくない」ものばかり。
http://code.nanigac.com/user/source/14
TRUEなんて定数使ってる人久しぶりに見たよ。
あまりRubyには詳しくないんだろうと思う。

あとメール作成ならtmailをインストールすれば割と簡単。
http://i.loveruby.net/ja/projects/tmail/doc/usage.html
TMail::Mail.new して mail.from ['from@example.com'] とかしていって
最後に mail.encoded して適当に SMTP で送信。

  • GoodJob
  • 0

  • genki
  • 3:genki
  • 2007/08/05 15:39

>>1 
 間違えて $msg と書いてました。。。

>>2
 はい、そうです。納期に追いまくられて覚えた/書いてるんで、危なくないコードであるようにすることは気にかけているんですが、あまりRubyの流儀には詳しく無いんですよね(^^;
Rubyの流儀では、普通何を返す事が多いんですか?

TMail なかなか良さそうですね。暇を見つけて見てみますね。ありがとうございます。

  • GoodJob
  • 0

いやいや、true/falseを返す事もよくありますよ。
ググったら、昔のバージョンでは定数TRUE、FALSE、NILしか
使えなかったようですが、現在は変数true, false, nilが使用できるので、こちらを使用する事が推奨されるようです。

  • GoodJob
  • 0

  • ゲスト
  • 5:ゲスト
  • 2007/11/13 14:28

2ちゃんねるでこんなの見つけました。
cat jmail.rb
=begin RDoc

JMail is class for japanese mail only (MUA)

Synopsis
 THIS SCRIPT IS PREPARE FOR SENDMAIL TO MIME ENCODE.
 ONLY JAPANESE MAIL BOTH PLAIN TEXT MAIL AND MULTIPART MAIL.
 日本語のメールを作成するライブラリ
 テキストメールだけでなくファイルを添付することもできる。
 ISO-2022-JP,Base64でエンコードされる。

Usage
 mail JMail.new
 mail.from    address of sender
 mail.to      address of recipient
 mail.subject subject
 mail.text    mail body               メール本文(Stringクラス)
 mail.attach  path of attachment file 添付ファイルのパス
 mail.prepare
 puts mail.encoded

Author
 UNKNOWN

Copyright
 Copyright (c) Licensed under the same terms as Ruby.
 
=end

require 'mime/types'
require 'nkf'
require 'tmail'

class JMail TMail::Mail
        include TMail

        初期化メソッド
        def initialize
                super
                @plain_text String.new
                @multi Array.new
        end

        private

        アドレス用ヘッダに日本語が含まれる場合のJIS Base64エンコードメソッド
        def header_encode(str)
                /(.*?)<(.*?)>/ =~ str
                return $& "#{NKF.nkf('-jM', $1)}<#{$2}>" str
        end

        public

        日本語メール用ヘッダのオーバーライド
        def bcc=(*strs)
                super strs.flatten.map!{|str| header_encode str }
        end

        日本語メール用ヘッダのオーバーライド
        def cc=(*strs)
                super strs.flatten.map!{|str| header_encode str }
        end

        日本語メール用ヘッダのオーバーライド
        def from=(*strs)
                super strs.flatten.map!{|str| header_encode str }
        end

        日本語メール用ヘッダのオーバーライド
        def to=(*strs)
                super strs.flatten.map!{|str| header_encode str }
        end

        日本語メール用ヘッダのオーバーライド
        def subject=(str)
                super NKF.nkf('-jM', str)
        end

        ファイルを添付するメソッド。複数の添付可。フルパスを指定。
        def attach(filepath)
                @multi << filepath
        end

        メール本文をセットするメソッド
        def text=(str)
                @plain_text NKF.nkf('-j', str)
        end

        メール本文を返すメソッド
        def text
                puts @plain_text
        end

        メール作成用メソッド
        def prepare
                self.mime_version '1.0'
                if @multi.size == then
                        self.body @plain_text
                        self.set_content_type 'text', 'plain', 'charset' => 'ISO-2022-JP'
                        self.transfer_encoding '7bit'
                else
                        plain TMail::Mail.new
                        plain.set_content_type 'text', 'plain', 'charset' => 'ISO-2022-JP'
                        plain.transfer_encoding '7bit'
                        plain.body @plain_text
                        self.parts.push(plain)

                        @multi.each{|part|
                                filename NKF.nkf('-jM', File.basename(part))
                              part_encoded NKF.nkf('-MB', File.read(part))
                                part_encoded [File.read(part)].pack('m').chomp.gsub(/.{76}/, "\\1\n")
                                type MIME::Types.of(part)[0].instance_variable_get(:@raw_media_type)
                                sub MIME::Types.of(part)[0].instance_variable_get(:@raw_sub_type)
                                attachment TMail::Mail.new
                                attachment.body part_encoded
                                attachment.transfer_encoding 'base64'
                                attachment.set_content_type(type, sub, 'name' => filename)
                                attachment.set_content_disposition('inline', 'filename' => filename)
                                self.parts.push(attachment)
                        }
                        self.write_back
                end
        end

        alias add_attachment attach
        alias attach= attach
end

  • GoodJob
  • 0

通りすがりですが、気になったのでコメント。

Ruby っぽく見えないのは、ブロックを使っていないのが大きいと思いますよ。
例えば今回の場合、以下のようにすればいいのでは。

Net::SMTPSession.new('localhost', 25)
m.open_timeout=600
start() do
  m.sendmail(msg, from, to)
end

こうすると、 sendmail で例外が起きても自動的に finish されます。
open_timeout の指定が必要なければ、以下で OK です。

Net::SMTPSession.start('localhost', 25) do |m|
  m.sendmail(msg, from, to)
end

あと、 Ruby はまだ名前付き引数をサポートしていないので、
address= とかは単なるローカル変数への代入になってしまいます。
また、最後に評価した値が返り値になるので、 return は不要ですね。

こんなところでしょうか。
確かに obsolete だけど、定数の書き方で dis られても困っちゃうよね(^^;

  • GoodJob
  • 0

おっと、 start にレシーバ付け忘れた。

Net::SMTPSession.new('localhost', 25) 
m.open_timeout=600 
m.start() do 
 m.sendmail(msg, from, to) 
end

ですね。

GJ

GJ

前へ 1 次へ

コメントする

[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。

[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。

ゲスト投稿者:ゲスト:

PDFLib | A library for processing PDF on the fly プレゼン公開・共有サイト handsOut.jp オープンタイプ株式会社 チーム・マイナス6% - みんなで止めよう温暖化

ソースコードのブログパーツ

デフォルトのフォントサイズ
修飾
表示サイズ
px px
プレビュー (表示する)
下のプレビュー領域をクリックすると、ポップアップで全体を見ることができます。
パラメータが不正です

    GoodJobしたユーザ

    ブックマークコメント

    関連するなにがし

    前へ 1 次へ

    タグ

    2重登録防止位置スクロールscrolltopositionedoffsetpositionprototype.jslink_tocyclecheck_box_tagチュートリアルactive_formerror_messages_forハイライトバリデーションvalidate便利リスト非対応機種デコメデコレーションメールtilestext_field_tag一括複数情報テキストデータ抽出hexrtpetherealvalidwhen一括更新リセットplop置換replacepcoslogmixisregソケットnet::telnetfopenmutexサンプルcalendar[linux][bash][シェルスクリプト][大容量]rails2.1rormobileclipboardクリップボード横向きピラミッドs2jdbc-genjsonicお絵かきフルパス名抽出サブドメインサブドメイン名s2jdbcエンティティ自動生成xhtmlドコモrestdoltengspidering背景変更グラデーションiso一括登録xトークンチェックreplicationslavemonitoreval画像処理acts_as_taggable_on_steroidsacts_as_versionedフレームワークsuper agile strutssastrutsgetipaddrtablesshlabsラボsiocgifaddr自マシンipアドレスtipmagejquery回転validation経過日数経過秒forkprocess生ソケットipproto_ipnetwork

    前へ 1 2 3 ... 7 次へ