keystone 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/README +3 -0
- data/Rakefile +26 -0
- data/VERSION +1 -0
- data/doc/classes/Dir.html +139 -0
- data/doc/classes/Dir.src/M000003.html +25 -0
- data/doc/classes/FlagSetMaker.html +138 -0
- data/doc/classes/FlagSetMaker.src/M000018.html +18 -0
- data/doc/classes/FlagSetMaker/FlagSet.html +186 -0
- data/doc/classes/FlagSetMaker/FlagSet.src/M000019.html +24 -0
- data/doc/classes/FlagSetMaker/FlagSet.src/M000020.html +26 -0
- data/doc/classes/FlagSetMaker/FlagSet.src/M000021.html +18 -0
- data/doc/classes/FlagSetMaker/FlagSet.src/M000022.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.html +304 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000023.html +19 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000024.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000025.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000026.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000027.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000029.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000030.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000031.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000032.html +18 -0
- data/doc/classes/FlagSetMaker/Flags.src/M000033.html +18 -0
- data/doc/classes/Hoge.html +113 -0
- data/doc/classes/Keystone.html +174 -0
- data/doc/classes/Keystone/Base.html +191 -0
- data/doc/classes/Keystone/Base.src/M000054.html +22 -0
- data/doc/classes/Keystone/Base.src/M000055.html +18 -0
- data/doc/classes/Keystone/Base.src/M000056.html +25 -0
- data/doc/classes/Keystone/Base.src/M000057.html +18 -0
- data/doc/classes/Keystone/Base.src/M000058.html +20 -0
- data/doc/classes/Keystone/Batch.html +115 -0
- data/doc/classes/Keystone/Batch/Base.html +208 -0
- data/doc/classes/Keystone/Batch/Base.src/M000052.html +54 -0
- data/doc/classes/Keystone/Batch/Base.src/M000053.html +30 -0
- data/doc/classes/Keystone/CoreExt.html +105 -0
- data/doc/classes/Keystone/Mail.html +115 -0
- data/doc/classes/Keystone/Mail/Send.html +171 -0
- data/doc/classes/Keystone/Mail/Send.src/M000034.html +18 -0
- data/doc/classes/Keystone/Mail/Send.src/M000035.html +42 -0
- data/doc/classes/Keystone/Mail/Send.src/M000036.html +18 -0
- data/doc/classes/Keystone/Os.html +184 -0
- data/doc/classes/Keystone/Os.src/M000037.html +18 -0
- data/doc/classes/Keystone/Os.src/M000038.html +27 -0
- data/doc/classes/Keystone/Os/AbstractOs.html +227 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000046.html +17 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000047.html +17 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000048.html +17 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000049.html +17 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000050.html +17 -0
- data/doc/classes/Keystone/Os/AbstractOs.src/M000051.html +25 -0
- data/doc/classes/Keystone/Os/Centos.html +113 -0
- data/doc/classes/Keystone/Os/Darwin.html +139 -0
- data/doc/classes/Keystone/Os/Darwin.src/M000039.html +18 -0
- data/doc/classes/Keystone/Os/Linux.html +139 -0
- data/doc/classes/Keystone/Os/Linux.src/M000045.html +26 -0
- data/doc/classes/Keystone/Os/Osx.html +113 -0
- data/doc/classes/Keystone/Os/Unix.html +199 -0
- data/doc/classes/Keystone/Os/Unix.src/M000040.html +27 -0
- data/doc/classes/Keystone/Os/Unix.src/M000041.html +18 -0
- data/doc/classes/Keystone/Os/Unix.src/M000042.html +18 -0
- data/doc/classes/Keystone/Os/Unix.src/M000043.html +18 -0
- data/doc/classes/Keystone/Os/Unix.src/M000044.html +18 -0
- data/doc/classes/Keystone/Rails.html +105 -0
- data/doc/classes/Keystone/StringUtil.html +226 -0
- data/doc/classes/Keystone/StringUtil.src/M000059.html +43 -0
- data/doc/classes/Keystone/StringUtil.src/M000060.html +25 -0
- data/doc/classes/Keystone/StringUtil.src/M000061.html +24 -0
- data/doc/classes/Keystone/StringUtil.src/M000062.html +18 -0
- data/doc/classes/Keystone/StringUtil.src/M000063.html +21 -0
- data/doc/classes/Object.html +240 -0
- data/doc/classes/Object.src/M000012.html +18 -0
- data/doc/classes/Object.src/M000013.html +20 -0
- data/doc/classes/Object.src/M000014.html +18 -0
- data/doc/classes/Object.src/M000015.html +18 -0
- data/doc/classes/Object.src/M000016.html +18 -0
- data/doc/classes/Object.src/M000017.html +19 -0
- data/doc/classes/Tempfile.html +139 -0
- data/doc/classes/Tempfile.src/M000011.html +25 -0
- data/doc/classes/TestCoreExt.html +152 -0
- data/doc/classes/TestCoreExt.src/M000009.html +17 -0
- data/doc/classes/TestCoreExt.src/M000010.html +21 -0
- data/doc/classes/TestStringUtilBase.html +197 -0
- data/doc/classes/TestStringUtilBase.src/M000004.html +17 -0
- data/doc/classes/TestStringUtilBase.src/M000005.html +23 -0
- data/doc/classes/TestStringUtilBase.src/M000006.html +22 -0
- data/doc/classes/TestStringUtilBase.src/M000007.html +25 -0
- data/doc/classes/TestStringUtilBase.src/M000008.html +34 -0
- data/doc/classes/Uri.html +158 -0
- data/doc/classes/Uri.src/M000001.html +18 -0
- data/doc/classes/Uri.src/M000002.html +18 -0
- data/doc/created.rid +1 -0
- data/doc/files/example/batch_sample_rb.html +134 -0
- data/doc/files/example/os_rb.html +109 -0
- data/doc/files/example/string_util_rb.html +109 -0
- data/doc/files/lib/keystone/base_rb.html +101 -0
- data/doc/files/lib/keystone/batch/base_rb.html +108 -0
- data/doc/files/lib/keystone/batch_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext/array_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext/blank_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext/dir_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext/object_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext/tempfile_rb.html +108 -0
- data/doc/files/lib/keystone/core_ext/uri_rb.html +101 -0
- data/doc/files/lib/keystone/core_ext_rb.html +113 -0
- data/doc/files/lib/keystone/mail/send_rb.html +115 -0
- data/doc/files/lib/keystone/mail_rb.html +101 -0
- data/doc/files/lib/keystone/os/abstract_os_rb.html +101 -0
- data/doc/files/lib/keystone/os/centos_rb.html +101 -0
- data/doc/files/lib/keystone/os/darwin_rb.html +101 -0
- data/doc/files/lib/keystone/os/linux_rb.html +101 -0
- data/doc/files/lib/keystone/os/osx_rb.html +101 -0
- data/doc/files/lib/keystone/os/unix_rb.html +101 -0
- data/doc/files/lib/keystone/os_rb.html +108 -0
- data/doc/files/lib/keystone/string_util_rb.html +101 -0
- data/doc/files/lib/keystone_rb.html +116 -0
- data/doc/files/test/test_core_ext_rb.html +110 -0
- data/doc/files/test/test_string_util_rb.html +112 -0
- data/doc/files/vendor/flag_set_maker_rb.html +108 -0
- data/doc/files/vendor/moji_rb.html +118 -0
- data/doc/fr_class_index.html +52 -0
- data/doc/fr_file_index.html +54 -0
- data/doc/fr_method_index.html +89 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/example/batch_sample.rb +24 -0
- data/example/os.rb +4 -0
- data/example/sendmail.rb +21 -0
- data/example/string_util.rb +15 -0
- data/keystone.gemspec +209 -0
- data/lib/keystone.rb +25 -0
- data/lib/keystone/base.rb +75 -0
- data/lib/keystone/batch.rb +5 -0
- data/lib/keystone/batch/base.rb +217 -0
- data/lib/keystone/core_ext.rb +18 -0
- data/lib/keystone/core_ext/array.rb +29 -0
- data/lib/keystone/core_ext/blank.rb +44 -0
- data/lib/keystone/core_ext/dir.rb +16 -0
- data/lib/keystone/core_ext/ipaddr.rb +18 -0
- data/lib/keystone/core_ext/object.rb +34 -0
- data/lib/keystone/core_ext/tempfile.rb +14 -0
- data/lib/keystone/core_ext/uri.rb +14 -0
- data/lib/keystone/mail.rb +8 -0
- data/lib/keystone/mail/address.rb +92 -0
- data/lib/keystone/mail/content_type.rb +60 -0
- data/lib/keystone/mail/message.rb +102 -0
- data/lib/keystone/mail/message_factory.rb +18 -0
- data/lib/keystone/mail/message_iso2022jp.rb +126 -0
- data/lib/keystone/mail/message_sjis.rb +23 -0
- data/lib/keystone/mail/receive.rb +320 -0
- data/lib/keystone/mail/send.rb +83 -0
- data/lib/keystone/os.rb +26 -0
- data/lib/keystone/os/abstract_os.rb +36 -0
- data/lib/keystone/os/centos.rb +6 -0
- data/lib/keystone/os/darwin.rb +9 -0
- data/lib/keystone/os/linux.rb +15 -0
- data/lib/keystone/os/osx.rb +18 -0
- data/lib/keystone/os/unix.rb +43 -0
- data/lib/keystone/string_util.rb +85 -0
- data/test/test_core_ext.rb +15 -0
- data/test/test_string_util.rb +60 -0
- data/util/README +1 -0
- data/util/bin/command_broadcast.rb +137 -0
- data/util/bin/disk_size_check.rb +54 -0
- data/util/bin/notice +93 -0
- data/util/bin/ve2tar.rb +80 -0
- data/vendor/flag_set_maker.rb +121 -0
- data/vendor/moji.rb +502 -0
- metadata +236 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Keystone
|
|
2
|
+
module CoreExt
|
|
3
|
+
require 'keystone/core_ext/blank'
|
|
4
|
+
require 'keystone/core_ext/uri'
|
|
5
|
+
require 'keystone/core_ext/tempfile'
|
|
6
|
+
require 'keystone/core_ext/dir'
|
|
7
|
+
require 'keystone/core_ext/ipaddr'
|
|
8
|
+
require 'keystone/core_ext/object'
|
|
9
|
+
require 'keystone/core_ext/array'
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
class Array
|
|
2
|
+
#
|
|
3
|
+
# TODO
|
|
4
|
+
# active_supportに同様のメソッドが無いかどうかの確認
|
|
5
|
+
#
|
|
6
|
+
def split_by(num)
|
|
7
|
+
return [] if self.size < 1
|
|
8
|
+
ret = [[]]
|
|
9
|
+
counter = 0
|
|
10
|
+
self.each do |val|
|
|
11
|
+
(counter = 0;ret << []) if counter >= num
|
|
12
|
+
ret[-1] << val
|
|
13
|
+
counter += 1
|
|
14
|
+
end
|
|
15
|
+
return ret
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
if RUBY_VERSION < '1.8.7'
|
|
19
|
+
def sample(count=1)
|
|
20
|
+
if count == 1
|
|
21
|
+
return at( rand( size ) )
|
|
22
|
+
elsif count < 1
|
|
23
|
+
return nil
|
|
24
|
+
else
|
|
25
|
+
return sort_by{rand}[0..count-1]
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
class Object
|
|
2
|
+
# copy from activesupport
|
|
3
|
+
def blank?
|
|
4
|
+
respond_to?(:empty?) ? empty? : !self
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class NilClass #:nodoc:
|
|
9
|
+
def blank?
|
|
10
|
+
true
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class FalseClass #:nodoc:
|
|
15
|
+
def blank?
|
|
16
|
+
true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class TrueClass #:nodoc:
|
|
21
|
+
def blank?
|
|
22
|
+
false
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class Array #:nodoc:
|
|
27
|
+
alias_method :blank?, :empty?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class Hash #:nodoc:
|
|
31
|
+
alias_method :blank?, :empty?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class String #:nodoc:
|
|
35
|
+
def blank?
|
|
36
|
+
self !~ /\S/
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class Numeric #:nodoc:
|
|
41
|
+
def blank?
|
|
42
|
+
false
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class Dir
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# TODO
|
|
5
|
+
# replace FileUtils.mkdir_p
|
|
6
|
+
def self.mkdir_r(dirPath)
|
|
7
|
+
folders = dirPath.split('/')
|
|
8
|
+
folderToCreate = ''
|
|
9
|
+
folders.each do |folder|
|
|
10
|
+
folderToCreate += folder + '/'
|
|
11
|
+
if !File.directory?(folderToCreate)
|
|
12
|
+
Dir.mkdir(folderToCreate)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'ipaddr'
|
|
2
|
+
|
|
3
|
+
class IPAddr
|
|
4
|
+
def to_a
|
|
5
|
+
begin_addr = (@addr & @mask_addr)
|
|
6
|
+
case @family
|
|
7
|
+
when Socket::AF_INET
|
|
8
|
+
end_addr = (@addr | (IN4MASK ^ @mask_addr))
|
|
9
|
+
when Socket::AF_INET6
|
|
10
|
+
end_addr = (@addr | (IN6MASK ^ @mask_addr))
|
|
11
|
+
else
|
|
12
|
+
raise "unsupported address family"
|
|
13
|
+
end
|
|
14
|
+
ret = []
|
|
15
|
+
begin_addr.upto(end_addr){|addr| ret << IPAddr.new(addr,Socket::AF_INET)}
|
|
16
|
+
return ret
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
class Object
|
|
2
|
+
# http://www.yohasebe.com/pages/trans-seeing-metaclasses-clearly/
|
|
3
|
+
def metaclass
|
|
4
|
+
class << self
|
|
5
|
+
self
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# http://www.yohasebe.com/pages/trans-seeing-metaclasses-clearly/
|
|
10
|
+
def meta_eval(&blk)
|
|
11
|
+
metaclass.instance_eval(&blk)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# http://www.yohasebe.com/pages/trans-seeing-metaclasses-clearly/
|
|
15
|
+
def meta_def(name, &blk)
|
|
16
|
+
meta_eval { define_method name, &blk }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# http://www.yohasebe.com/pages/trans-seeing-metaclasses-clearly/
|
|
20
|
+
def class_def(name, &blk)
|
|
21
|
+
class_eval { define_method name, &blk }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# 1.8.7 エミュレート
|
|
25
|
+
# TODO version 指定
|
|
26
|
+
def tap
|
|
27
|
+
yield(self)
|
|
28
|
+
self
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def tapp
|
|
32
|
+
self.tap{|obj| p obj}
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'tempfile'
|
|
2
|
+
|
|
3
|
+
class Tempfile
|
|
4
|
+
def self.open_with_block(name = nil, dir = nil)
|
|
5
|
+
name ||= (0..8).map{rand(36).to_s(36)}.join
|
|
6
|
+
args = dir ? [name, dir] : [name]
|
|
7
|
+
tmp = Tempfile.open *args
|
|
8
|
+
begin
|
|
9
|
+
yield tmp
|
|
10
|
+
ensure
|
|
11
|
+
tmp.close true
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
class Uri
|
|
2
|
+
#
|
|
3
|
+
def self.escape_raw(st)
|
|
4
|
+
st.gsub(/([^a-zA-Z0-9_\-\.~])/) { "%#{$1.unpack('H*')[0].scan(/../).join('%').upcase }" }
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
#
|
|
8
|
+
# usage
|
|
9
|
+
# @search_tag = Uri.unescape_raw(params[:tag]).toutf8
|
|
10
|
+
#
|
|
11
|
+
def self.unescape_raw(st)
|
|
12
|
+
st.tr('+',' ').gsub(/%([A-Fa-f0-9][A-Fa-f0-9])/) { [$1.hex].pack('C') }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
module Keystone::Mail
|
|
2
|
+
autoload :Message, 'keystone/mail/message'
|
|
3
|
+
autoload :MessageIso2022jp, 'keystone/mail/message_iso2022jp'
|
|
4
|
+
autoload :MessageSjis, 'keystone/mail/message_sjis'
|
|
5
|
+
autoload :Receive, 'keystone/mail/receive'
|
|
6
|
+
autoload :MessageFactory, 'keystone/mail/message_factory'
|
|
7
|
+
autoload :Send, 'keystone/mail/send'
|
|
8
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
require 'net/smtp'
|
|
2
|
+
|
|
3
|
+
if __FILE__ ==$0
|
|
4
|
+
$: << '../..'
|
|
5
|
+
require 'keystone'
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
module Keystone
|
|
9
|
+
module Mail
|
|
10
|
+
class Address
|
|
11
|
+
attr_accessor :name,:address
|
|
12
|
+
|
|
13
|
+
def initialize(name,address)
|
|
14
|
+
@name = name
|
|
15
|
+
@address = address
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def KmMailAddress::get_addresses(line)
|
|
19
|
+
ret = []
|
|
20
|
+
addrs = line.to_s.split(',')
|
|
21
|
+
addrs.each{|item|
|
|
22
|
+
addr,name = parse_mail_address(item)
|
|
23
|
+
ret.push(KmMailAddress.new(name,addr))
|
|
24
|
+
}
|
|
25
|
+
return ret
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def KmMailAddress::parse_mail_address(line)
|
|
29
|
+
# =?ISO-2022-JP?B?GyRCODZFRCVGJTklSBsoQg==?= <harada@kanamei.co.jp>
|
|
30
|
+
# test@mail-ko2.kanamei.co.jp
|
|
31
|
+
# <orz@softbank.ne.jp>
|
|
32
|
+
# "=?ISO-2022-JP?B?GyRCNjZLXBsoQg==?=" <hashimoto@kanamei.co.jp>
|
|
33
|
+
|
|
34
|
+
#=?ISO-2022-JP?B?GyRCODZFRCQ5JDIhPCE8ITwhPCE8ITwhPCE8ITwhPCE8ITwhPBsoQg==?=
|
|
35
|
+
#=?ISO-2022-JP?B?GyRCITwhPCE8ITwhPCE8ITwhPCE8ITwhPCE8ITwhPCE8ITwhPCE8GyhC?=
|
|
36
|
+
#=?ISO-2022-JP?B?GyRCITwhPCE8ITwhPCE8ITwhPCE8ITwhPCE8ITwhPCE8ITwhPCE8GyhC?=
|
|
37
|
+
#=?ISO-2022-JP?B?GyRCITwhPCE8ITwhPCE8ITwkSiQsJCRGfEtcOGxMPhsoQkZ1Y2sbJEIlRhsoQg==?=
|
|
38
|
+
#=?ISO-2022-JP?B?GyRCJTklSBsoQg==?= <harada@kanamei.co.jp>,
|
|
39
|
+
#test@mail-ko2.kanamei.co.jp
|
|
40
|
+
|
|
41
|
+
#"=?ISO-2022-JP?B?GyRCJEokLCE8ITwhPCE8ITwhPCE8GyhC?= =?ISO-2022-JP?B?GyRCITwhPCE8ITwhPCE8ITwhPCE8ITwbKEI=?= =?ISO-2022-JP?B?GyRCITwkJEw+QTAlRiU5JUgkJiQyGyhC?= =?ISO-2022-JP?B?GyRCITwhPCE8ITwhPCRKJHMkLiRkJE0bKEI=?=" <test@mail-ko2.kanamei.co.jp>
|
|
42
|
+
#"=?UTF-8?B?44Gq44GM44O844O844O844O844O844O844O844O844O8?==?UTF-8?B?44O844O844O844O844O844O844O844O844O844O844O8?==?UTF-8?B?44O844O844O844O844O844O844O844O844O844O844O8?==?UTF-8?B?44O844O844O844O844O844O844O844O844O844O844O8?==?UTF-8?B?44O844O844O844O844O844O844O844O844O844O844O8?==?UTF-8?B?44O844O844O844O844O844GE44GC44Gm5YWI?=
|
|
43
|
+
|
|
44
|
+
name,address = ""
|
|
45
|
+
KmClassBase::debug "line=#{line}"
|
|
46
|
+
|
|
47
|
+
if /"(.*)"\s*<(.*)>/ =~ line
|
|
48
|
+
# umaku dekinkatta
|
|
49
|
+
name = $1.strip
|
|
50
|
+
address = $2.strip
|
|
51
|
+
KmClassBase::debug "name=|#{name}|"
|
|
52
|
+
elsif /(.*)\s*<(.*)>/ =~ line
|
|
53
|
+
name = $1.strip
|
|
54
|
+
address = $2.strip
|
|
55
|
+
KmClassBase::debug "name=|#{name}|"
|
|
56
|
+
KmClassBase::debug "address=|#{address}|"
|
|
57
|
+
else
|
|
58
|
+
address = line.strip
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# if /^=\?ISO-2022-JP.*/i =~ name ||
|
|
62
|
+
# if /^=\?UTF-8/i =~ name
|
|
63
|
+
if /^(?:(=\?ISO-2022-JP\?B\?)|(=\?UTF-8\?B\?))/i =~ name
|
|
64
|
+
KmClassBase::debug "hit!!"
|
|
65
|
+
begin
|
|
66
|
+
KmClassBase::debug "hit #{$1}"
|
|
67
|
+
name = KmMailAddress::convert(name)
|
|
68
|
+
rescue => e
|
|
69
|
+
KmClassBase::warn e.to_s
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
KmClassBase::debug "name_end=|#{name}|"
|
|
74
|
+
KmClassBase::debug "address_end=|#{address}|"
|
|
75
|
+
return address,name
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# TODO 場所考える(今二個ある)
|
|
79
|
+
def KmMailAddress::convert(data)
|
|
80
|
+
return Kconv.toutf8(data)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def self.create_reverse_mail_address(mail_addr)
|
|
84
|
+
puts mail_addr
|
|
85
|
+
m = mail_addr.dup.strip
|
|
86
|
+
puts "|#{m}|"
|
|
87
|
+
ar = m.split("@")
|
|
88
|
+
return ar[1].split(".").reverse.join(".") +"@"+ ar[0]
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require 'net/smtp'
|
|
2
|
+
|
|
3
|
+
if __FILE__ ==$0
|
|
4
|
+
$: << '../..'
|
|
5
|
+
require 'keystone'
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
module Keystone
|
|
9
|
+
module Mail
|
|
10
|
+
class ContentType
|
|
11
|
+
attr_accessor :content_type,:charset,:boundary
|
|
12
|
+
def initialize(st)
|
|
13
|
+
if /text\/plain/i =~ st
|
|
14
|
+
@content_type = :text_plain
|
|
15
|
+
if /charset="?iso-2022-jp"?/i =~ st
|
|
16
|
+
@charset = :iso_2022_jp
|
|
17
|
+
elsif /charset="?utf-8"?/i =~ st
|
|
18
|
+
@charset = :utf_8
|
|
19
|
+
end
|
|
20
|
+
elsif /multipart\/mixed/i =~ st
|
|
21
|
+
@content_type = :multipart_mixed
|
|
22
|
+
@boundary = get_boundary(st)
|
|
23
|
+
elsif /multipart\/related/i =~ st
|
|
24
|
+
@content_type = :multipart_related
|
|
25
|
+
@boundary = get_boundary(st)
|
|
26
|
+
elsif /multipart\/alternative/i =~ st
|
|
27
|
+
@content_type = :multipart_alternative
|
|
28
|
+
@boundary = get_boundary(st)
|
|
29
|
+
elsif /text\/html/i =~ st
|
|
30
|
+
@content_type = :text_html
|
|
31
|
+
if /charset="?iso-2022-jp"?/i =~ st
|
|
32
|
+
@charset = :iso_2022_jp
|
|
33
|
+
elsif /charset="?utf-8"?/i =~ st
|
|
34
|
+
@charset = :utf_8
|
|
35
|
+
end
|
|
36
|
+
else
|
|
37
|
+
if /image\/(?:jpeg|jpg)/i =~ st
|
|
38
|
+
@content_type = :image_jpeg
|
|
39
|
+
elsif /image\/png/i =~ st
|
|
40
|
+
@content_type = :image_png
|
|
41
|
+
elsif /image\/gif/i =~ st
|
|
42
|
+
@content_type = :image_gif
|
|
43
|
+
else
|
|
44
|
+
throw "this image does not support[#{st}]"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def get_boundary(st)
|
|
50
|
+
# TODO modify regular expression
|
|
51
|
+
if /boundary="(.*)"/i =~ st
|
|
52
|
+
return $1
|
|
53
|
+
elsif /boundary=(.*)/i =~ st
|
|
54
|
+
return $1
|
|
55
|
+
end
|
|
56
|
+
return nil
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require 'kconv'
|
|
2
|
+
|
|
3
|
+
module Keystone
|
|
4
|
+
module Mail
|
|
5
|
+
class Message
|
|
6
|
+
attr_accessor :subject, :body, :mail_to, :mail_from, :mail_from_text
|
|
7
|
+
|
|
8
|
+
#
|
|
9
|
+
# 普通なことをしたいならTMailを使いましょう
|
|
10
|
+
#
|
|
11
|
+
def initialize(opt={})
|
|
12
|
+
@subject, @body, @mail_from_text = "", "", nil
|
|
13
|
+
set_option(opt)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def to_src
|
|
17
|
+
header = ""
|
|
18
|
+
header += "Date: #{time2str(Time.now)}\n"
|
|
19
|
+
header += create_mailfrom_header
|
|
20
|
+
header += create_mailto_header
|
|
21
|
+
header += create_subject_header
|
|
22
|
+
header += "\n"
|
|
23
|
+
header += encode_body
|
|
24
|
+
return header
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def set_option(opt)
|
|
28
|
+
@subject = opt[:subject] if opt.key?(:subject)
|
|
29
|
+
@body = opt[:body] if opt.key?(:body)
|
|
30
|
+
@body = opt[:mail_to] if opt.key?(:mail_to)
|
|
31
|
+
@body = opt[:mail_from] if opt.key?(:mail_from)
|
|
32
|
+
@mail_from_text = opt[:mail_from_text] if opt.key?(:mail_from_text)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
# from tmail
|
|
38
|
+
WDAY = %w( Sun Mon Tue Wed Thu Fri Sat KeystoneBUG )
|
|
39
|
+
MONTH = %w( TMailBUG Jan Feb Mar Apr May Jun
|
|
40
|
+
Jul Aug Sep Oct Nov Dec KeystoneBUG )
|
|
41
|
+
def time2str( tm )
|
|
42
|
+
# [ruby-list:7928]
|
|
43
|
+
gmt = Time.at(tm.to_i)
|
|
44
|
+
gmt.gmtime
|
|
45
|
+
offset = tm.to_i - Time.local(*gmt.to_a[0,6].reverse).to_i
|
|
46
|
+
|
|
47
|
+
# DO NOT USE strftime: setlocale() breaks it
|
|
48
|
+
return sprintf('%s, %s %s %d %02d:%02d:%02d %+.2d%.2d',
|
|
49
|
+
WDAY[tm.wday], tm.mday, MONTH[tm.month],
|
|
50
|
+
tm.year, tm.hour, tm.min, tm.sec,
|
|
51
|
+
*(offset / 60).divmod(60))
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def create_mailfrom_header
|
|
55
|
+
if @mail_from_text.blank?
|
|
56
|
+
return "From: #{@mail_from}\n"
|
|
57
|
+
else
|
|
58
|
+
return to_mail_header("From", @mail_from_text).chomp + "<#{@mail_from}>\n"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def create_subject_header
|
|
63
|
+
to_mail_header("Subject",@subject)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def create_mailto_header
|
|
67
|
+
if @mail_to.kind_of?(Array)
|
|
68
|
+
return "To: #{@mail_to.join(',')}\n"
|
|
69
|
+
else
|
|
70
|
+
return "To: #{@mail_to.to_s}\n"
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def encode_mime
|
|
75
|
+
raise "mime_encode must be implemented!!"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def encode_body
|
|
79
|
+
raise "encoded_body must be implemented!!"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def mime_header_string
|
|
83
|
+
raise "mime_header_string must be implemented!!"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
def to_mail_header(header_name, plain_text)
|
|
89
|
+
ret = ""
|
|
90
|
+
str = plain_text.clone
|
|
91
|
+
str.gsub!(/(\r|\n)/,"")
|
|
92
|
+
str.split(//).split_by(10).each do |ar|
|
|
93
|
+
st = encode_mime(ar.join(''))
|
|
94
|
+
st = st.split(//,1).pack('m')
|
|
95
|
+
st = st.chomp
|
|
96
|
+
ret += " #{mime_header_string}#{st}?=\n"
|
|
97
|
+
end
|
|
98
|
+
return "#{header_name}:"+ret
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|