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.
Files changed (170) hide show
  1. data/.gitignore +3 -0
  2. data/README +3 -0
  3. data/Rakefile +26 -0
  4. data/VERSION +1 -0
  5. data/doc/classes/Dir.html +139 -0
  6. data/doc/classes/Dir.src/M000003.html +25 -0
  7. data/doc/classes/FlagSetMaker.html +138 -0
  8. data/doc/classes/FlagSetMaker.src/M000018.html +18 -0
  9. data/doc/classes/FlagSetMaker/FlagSet.html +186 -0
  10. data/doc/classes/FlagSetMaker/FlagSet.src/M000019.html +24 -0
  11. data/doc/classes/FlagSetMaker/FlagSet.src/M000020.html +26 -0
  12. data/doc/classes/FlagSetMaker/FlagSet.src/M000021.html +18 -0
  13. data/doc/classes/FlagSetMaker/FlagSet.src/M000022.html +18 -0
  14. data/doc/classes/FlagSetMaker/Flags.html +304 -0
  15. data/doc/classes/FlagSetMaker/Flags.src/M000023.html +19 -0
  16. data/doc/classes/FlagSetMaker/Flags.src/M000024.html +18 -0
  17. data/doc/classes/FlagSetMaker/Flags.src/M000025.html +18 -0
  18. data/doc/classes/FlagSetMaker/Flags.src/M000026.html +18 -0
  19. data/doc/classes/FlagSetMaker/Flags.src/M000027.html +18 -0
  20. data/doc/classes/FlagSetMaker/Flags.src/M000029.html +18 -0
  21. data/doc/classes/FlagSetMaker/Flags.src/M000030.html +18 -0
  22. data/doc/classes/FlagSetMaker/Flags.src/M000031.html +18 -0
  23. data/doc/classes/FlagSetMaker/Flags.src/M000032.html +18 -0
  24. data/doc/classes/FlagSetMaker/Flags.src/M000033.html +18 -0
  25. data/doc/classes/Hoge.html +113 -0
  26. data/doc/classes/Keystone.html +174 -0
  27. data/doc/classes/Keystone/Base.html +191 -0
  28. data/doc/classes/Keystone/Base.src/M000054.html +22 -0
  29. data/doc/classes/Keystone/Base.src/M000055.html +18 -0
  30. data/doc/classes/Keystone/Base.src/M000056.html +25 -0
  31. data/doc/classes/Keystone/Base.src/M000057.html +18 -0
  32. data/doc/classes/Keystone/Base.src/M000058.html +20 -0
  33. data/doc/classes/Keystone/Batch.html +115 -0
  34. data/doc/classes/Keystone/Batch/Base.html +208 -0
  35. data/doc/classes/Keystone/Batch/Base.src/M000052.html +54 -0
  36. data/doc/classes/Keystone/Batch/Base.src/M000053.html +30 -0
  37. data/doc/classes/Keystone/CoreExt.html +105 -0
  38. data/doc/classes/Keystone/Mail.html +115 -0
  39. data/doc/classes/Keystone/Mail/Send.html +171 -0
  40. data/doc/classes/Keystone/Mail/Send.src/M000034.html +18 -0
  41. data/doc/classes/Keystone/Mail/Send.src/M000035.html +42 -0
  42. data/doc/classes/Keystone/Mail/Send.src/M000036.html +18 -0
  43. data/doc/classes/Keystone/Os.html +184 -0
  44. data/doc/classes/Keystone/Os.src/M000037.html +18 -0
  45. data/doc/classes/Keystone/Os.src/M000038.html +27 -0
  46. data/doc/classes/Keystone/Os/AbstractOs.html +227 -0
  47. data/doc/classes/Keystone/Os/AbstractOs.src/M000046.html +17 -0
  48. data/doc/classes/Keystone/Os/AbstractOs.src/M000047.html +17 -0
  49. data/doc/classes/Keystone/Os/AbstractOs.src/M000048.html +17 -0
  50. data/doc/classes/Keystone/Os/AbstractOs.src/M000049.html +17 -0
  51. data/doc/classes/Keystone/Os/AbstractOs.src/M000050.html +17 -0
  52. data/doc/classes/Keystone/Os/AbstractOs.src/M000051.html +25 -0
  53. data/doc/classes/Keystone/Os/Centos.html +113 -0
  54. data/doc/classes/Keystone/Os/Darwin.html +139 -0
  55. data/doc/classes/Keystone/Os/Darwin.src/M000039.html +18 -0
  56. data/doc/classes/Keystone/Os/Linux.html +139 -0
  57. data/doc/classes/Keystone/Os/Linux.src/M000045.html +26 -0
  58. data/doc/classes/Keystone/Os/Osx.html +113 -0
  59. data/doc/classes/Keystone/Os/Unix.html +199 -0
  60. data/doc/classes/Keystone/Os/Unix.src/M000040.html +27 -0
  61. data/doc/classes/Keystone/Os/Unix.src/M000041.html +18 -0
  62. data/doc/classes/Keystone/Os/Unix.src/M000042.html +18 -0
  63. data/doc/classes/Keystone/Os/Unix.src/M000043.html +18 -0
  64. data/doc/classes/Keystone/Os/Unix.src/M000044.html +18 -0
  65. data/doc/classes/Keystone/Rails.html +105 -0
  66. data/doc/classes/Keystone/StringUtil.html +226 -0
  67. data/doc/classes/Keystone/StringUtil.src/M000059.html +43 -0
  68. data/doc/classes/Keystone/StringUtil.src/M000060.html +25 -0
  69. data/doc/classes/Keystone/StringUtil.src/M000061.html +24 -0
  70. data/doc/classes/Keystone/StringUtil.src/M000062.html +18 -0
  71. data/doc/classes/Keystone/StringUtil.src/M000063.html +21 -0
  72. data/doc/classes/Object.html +240 -0
  73. data/doc/classes/Object.src/M000012.html +18 -0
  74. data/doc/classes/Object.src/M000013.html +20 -0
  75. data/doc/classes/Object.src/M000014.html +18 -0
  76. data/doc/classes/Object.src/M000015.html +18 -0
  77. data/doc/classes/Object.src/M000016.html +18 -0
  78. data/doc/classes/Object.src/M000017.html +19 -0
  79. data/doc/classes/Tempfile.html +139 -0
  80. data/doc/classes/Tempfile.src/M000011.html +25 -0
  81. data/doc/classes/TestCoreExt.html +152 -0
  82. data/doc/classes/TestCoreExt.src/M000009.html +17 -0
  83. data/doc/classes/TestCoreExt.src/M000010.html +21 -0
  84. data/doc/classes/TestStringUtilBase.html +197 -0
  85. data/doc/classes/TestStringUtilBase.src/M000004.html +17 -0
  86. data/doc/classes/TestStringUtilBase.src/M000005.html +23 -0
  87. data/doc/classes/TestStringUtilBase.src/M000006.html +22 -0
  88. data/doc/classes/TestStringUtilBase.src/M000007.html +25 -0
  89. data/doc/classes/TestStringUtilBase.src/M000008.html +34 -0
  90. data/doc/classes/Uri.html +158 -0
  91. data/doc/classes/Uri.src/M000001.html +18 -0
  92. data/doc/classes/Uri.src/M000002.html +18 -0
  93. data/doc/created.rid +1 -0
  94. data/doc/files/example/batch_sample_rb.html +134 -0
  95. data/doc/files/example/os_rb.html +109 -0
  96. data/doc/files/example/string_util_rb.html +109 -0
  97. data/doc/files/lib/keystone/base_rb.html +101 -0
  98. data/doc/files/lib/keystone/batch/base_rb.html +108 -0
  99. data/doc/files/lib/keystone/batch_rb.html +101 -0
  100. data/doc/files/lib/keystone/core_ext/array_rb.html +101 -0
  101. data/doc/files/lib/keystone/core_ext/blank_rb.html +101 -0
  102. data/doc/files/lib/keystone/core_ext/dir_rb.html +101 -0
  103. data/doc/files/lib/keystone/core_ext/object_rb.html +101 -0
  104. data/doc/files/lib/keystone/core_ext/tempfile_rb.html +108 -0
  105. data/doc/files/lib/keystone/core_ext/uri_rb.html +101 -0
  106. data/doc/files/lib/keystone/core_ext_rb.html +113 -0
  107. data/doc/files/lib/keystone/mail/send_rb.html +115 -0
  108. data/doc/files/lib/keystone/mail_rb.html +101 -0
  109. data/doc/files/lib/keystone/os/abstract_os_rb.html +101 -0
  110. data/doc/files/lib/keystone/os/centos_rb.html +101 -0
  111. data/doc/files/lib/keystone/os/darwin_rb.html +101 -0
  112. data/doc/files/lib/keystone/os/linux_rb.html +101 -0
  113. data/doc/files/lib/keystone/os/osx_rb.html +101 -0
  114. data/doc/files/lib/keystone/os/unix_rb.html +101 -0
  115. data/doc/files/lib/keystone/os_rb.html +108 -0
  116. data/doc/files/lib/keystone/string_util_rb.html +101 -0
  117. data/doc/files/lib/keystone_rb.html +116 -0
  118. data/doc/files/test/test_core_ext_rb.html +110 -0
  119. data/doc/files/test/test_string_util_rb.html +112 -0
  120. data/doc/files/vendor/flag_set_maker_rb.html +108 -0
  121. data/doc/files/vendor/moji_rb.html +118 -0
  122. data/doc/fr_class_index.html +52 -0
  123. data/doc/fr_file_index.html +54 -0
  124. data/doc/fr_method_index.html +89 -0
  125. data/doc/index.html +24 -0
  126. data/doc/rdoc-style.css +208 -0
  127. data/example/batch_sample.rb +24 -0
  128. data/example/os.rb +4 -0
  129. data/example/sendmail.rb +21 -0
  130. data/example/string_util.rb +15 -0
  131. data/keystone.gemspec +209 -0
  132. data/lib/keystone.rb +25 -0
  133. data/lib/keystone/base.rb +75 -0
  134. data/lib/keystone/batch.rb +5 -0
  135. data/lib/keystone/batch/base.rb +217 -0
  136. data/lib/keystone/core_ext.rb +18 -0
  137. data/lib/keystone/core_ext/array.rb +29 -0
  138. data/lib/keystone/core_ext/blank.rb +44 -0
  139. data/lib/keystone/core_ext/dir.rb +16 -0
  140. data/lib/keystone/core_ext/ipaddr.rb +18 -0
  141. data/lib/keystone/core_ext/object.rb +34 -0
  142. data/lib/keystone/core_ext/tempfile.rb +14 -0
  143. data/lib/keystone/core_ext/uri.rb +14 -0
  144. data/lib/keystone/mail.rb +8 -0
  145. data/lib/keystone/mail/address.rb +92 -0
  146. data/lib/keystone/mail/content_type.rb +60 -0
  147. data/lib/keystone/mail/message.rb +102 -0
  148. data/lib/keystone/mail/message_factory.rb +18 -0
  149. data/lib/keystone/mail/message_iso2022jp.rb +126 -0
  150. data/lib/keystone/mail/message_sjis.rb +23 -0
  151. data/lib/keystone/mail/receive.rb +320 -0
  152. data/lib/keystone/mail/send.rb +83 -0
  153. data/lib/keystone/os.rb +26 -0
  154. data/lib/keystone/os/abstract_os.rb +36 -0
  155. data/lib/keystone/os/centos.rb +6 -0
  156. data/lib/keystone/os/darwin.rb +9 -0
  157. data/lib/keystone/os/linux.rb +15 -0
  158. data/lib/keystone/os/osx.rb +18 -0
  159. data/lib/keystone/os/unix.rb +43 -0
  160. data/lib/keystone/string_util.rb +85 -0
  161. data/test/test_core_ext.rb +15 -0
  162. data/test/test_string_util.rb +60 -0
  163. data/util/README +1 -0
  164. data/util/bin/command_broadcast.rb +137 -0
  165. data/util/bin/disk_size_check.rb +54 -0
  166. data/util/bin/notice +93 -0
  167. data/util/bin/ve2tar.rb +80 -0
  168. data/vendor/flag_set_maker.rb +121 -0
  169. data/vendor/moji.rb +502 -0
  170. 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