jpmobile 4.0.0 → 4.0.1
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.
- checksums.yaml +4 -4
- data/jpmobile.gemspec +2 -1
- data/lib/jpmobile/filter.rb +95 -37
- data/lib/jpmobile/mail.rb +45 -42
- data/lib/jpmobile/mailer.rb +0 -1
- data/lib/jpmobile/trans_sid.rb +3 -1
- data/lib/jpmobile/version.rb +1 -1
- data/spec/unit/email-fixtures/pc-mail-attached-without-subject.eml +45 -0
- data/spec/unit/receive_mail_spec.rb +18 -3
- metadata +23 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 154aabed283366bd8c6fba6825b99d62e96cf78c
|
4
|
+
data.tar.gz: b62fa66625f4f710930f00fa3ff20bd2997ed8a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3fa80365078d094087533cf1b1b70d1aa84f3f0336bbf98c7e5ca6ce18d607b35d277b103ac9ea8f3782dfd44f77d17bff4ec8d1dfad2e14a3ae1d575bfaa969
|
7
|
+
data.tar.gz: 09c776d1b5e90bcaaf563dee8c2b87b6b1f275df76d31b116292d5521e84899d019fb30a1d30c2557330618ebf5daebcc2f1dad709b2e967d1bbfa168a58af50
|
data/jpmobile.gemspec
CHANGED
@@ -16,12 +16,13 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
17
|
gem.require_paths = ["lib"]
|
18
18
|
|
19
|
-
gem.add_development_dependency 'rails'
|
19
|
+
gem.add_development_dependency 'rails', '~> 4.0.0'
|
20
20
|
gem.add_development_dependency 'rspec'
|
21
21
|
gem.add_development_dependency 'rspec-rails'
|
22
22
|
gem.add_development_dependency 'webrat'
|
23
23
|
gem.add_development_dependency 'geokit'
|
24
24
|
gem.add_development_dependency 'sqlite3-ruby'
|
25
|
+
gem.add_development_dependency 'nokogiri', '1.6.2.1'
|
25
26
|
gem.add_development_dependency 'hpricot'
|
26
27
|
gem.add_development_dependency 'git'
|
27
28
|
end
|
data/lib/jpmobile/filter.rb
CHANGED
@@ -2,12 +2,10 @@
|
|
2
2
|
# = 半角変換フィルター
|
3
3
|
# thanks to masuidrive <masuidrive (at) masuidrive.jp>
|
4
4
|
|
5
|
-
|
5
|
+
ActiveSupport.on_load(:action_controller) do
|
6
6
|
def self.hankaku_filter(options={})
|
7
|
-
|
8
|
-
|
9
|
-
before_filter lambda {|controller| Jpmobile::HankakuFilter.before(controller, options)}
|
10
|
-
after_filter lambda {|controller| Jpmobile::HankakuFilter.after(controller, options)}
|
7
|
+
before_action Jpmobile::HankakuFilter.new(options)
|
8
|
+
after_action Jpmobile::HankakuFilter.new(options)
|
11
9
|
end
|
12
10
|
|
13
11
|
def self.mobile_filter(options={})
|
@@ -18,43 +16,99 @@ class ActionController::Base #:nodoc:
|
|
18
16
|
end
|
19
17
|
|
20
18
|
module Jpmobile
|
21
|
-
|
22
|
-
|
19
|
+
class HankakuFilter
|
20
|
+
cattr_accessor(:zen_to_han_table) do
|
21
|
+
{
|
22
|
+
"ガ" => "ガ", "ギ" => "ギ", "グ" => "グ", "ゲ" => "ゲ", "ゴ" => "ゴ",
|
23
|
+
"ザ" => "ザ", "ジ" => "ジ", "ズ" => "ズ", "ゼ" => "ゼ", "ゾ" => "ゾ",
|
24
|
+
"ダ" => "ダ", "ヂ" => "ヂ", "ヅ" => "ヅ", "デ" => "デ", "ド" => "ド",
|
25
|
+
"バ" => "バ", "ビ" => "ビ", "ブ" => "ブ", "ベ" => "ベ", "ボ" => "ボ",
|
26
|
+
"パ" => "パ", "ピ" => "ピ", "プ" => "プ", "ペ" => "ペ", "ポ" => "ポ",
|
27
|
+
"ヴ" => "ヴ",
|
28
|
+
"ア" => "ア", "イ" => "イ", "ウ" => "ウ", "エ" => "エ", "オ" => "オ",
|
29
|
+
"カ" => "カ", "キ" => "キ", "ク" => "ク", "ケ" => "ケ", "コ" => "コ",
|
30
|
+
"サ" => "サ", "シ" => "シ", "ス" => "ス", "セ" => "セ", "ソ" => "ソ",
|
31
|
+
"タ" => "タ", "チ" => "チ", "ツ" => "ツ", "テ" => "テ", "ト" => "ト",
|
32
|
+
"ナ" => "ナ", "ニ" => "ニ", "ヌ" => "ヌ", "ネ" => "ネ", "ノ" => "ノ",
|
33
|
+
"ハ" => "ハ", "ヒ" => "ヒ", "フ" => "フ", "ヘ" => "ヘ", "ホ" => "ホ",
|
34
|
+
"マ" => "マ", "ミ" => "ミ", "ム" => "ム", "メ" => "メ", "モ" => "モ",
|
35
|
+
"ヤ" => "ヤ", "ユ" => "ユ", "ヨ" => "ヨ",
|
36
|
+
"ラ" => "ラ", "リ" => "リ", "ル" => "ル", "レ" => "レ", "ロ" => "ロ",
|
37
|
+
"ワ" => "ワ", "ヲ" => "ヲ", "ン" => "ン",
|
38
|
+
"ャ" => "ャ", "ュ" => "ュ", "ョ" => "ョ",
|
39
|
+
"ァ" => "ァ", "ィ" => "ィ", "ゥ" => "ゥ", "ェ" => "ェ", "ォ" => "ォ",
|
40
|
+
"ッ" => "ッ",
|
41
|
+
"゛" => "゙", "゜" => "゚", "ー" => "ー", "。" => "。",
|
42
|
+
"「" => "「", "」" => "」",
|
43
|
+
"、" => "、", "・" => "・", "!" => "!", "?" => "?",
|
44
|
+
}
|
45
|
+
end
|
23
46
|
|
24
|
-
|
25
|
-
|
26
|
-
|
47
|
+
class << self
|
48
|
+
def hankaku_format(str)
|
49
|
+
replace_chars(str, zen_to_han_table)
|
50
|
+
end
|
51
|
+
|
52
|
+
def zenkaku_format(str)
|
53
|
+
replace_chars(str, han_to_zen_table)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def replace_chars(str, table)
|
59
|
+
@regexp_cache ||= {}
|
60
|
+
str.gsub(@regexp_cache[table.object_id] ||= Regexp.union(table.keys), table)
|
61
|
+
end
|
62
|
+
|
63
|
+
def han_to_zen_table
|
64
|
+
@han_to_zen_table ||= zen_to_han_table.invert
|
65
|
+
end
|
27
66
|
end
|
28
|
-
|
29
|
-
|
30
|
-
|
67
|
+
|
68
|
+
def initialize(options = {})
|
69
|
+
@options = {
|
70
|
+
:input => false,
|
71
|
+
}.merge(options)
|
72
|
+
|
73
|
+
@controller = nil
|
31
74
|
end
|
32
75
|
|
33
|
-
def before(controller
|
34
|
-
|
35
|
-
|
36
|
-
|
76
|
+
def before(controller)
|
77
|
+
@controller = controller
|
78
|
+
if apply_incoming?
|
79
|
+
Util.deep_apply(@controller.params) do |value|
|
80
|
+
value = to_internal(value)
|
37
81
|
end
|
38
82
|
end
|
39
83
|
end
|
84
|
+
|
40
85
|
# 内部コードから外部コードに変換
|
41
|
-
def after(controller
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
controller.response.body = to_external(controller.response.body, options)
|
86
|
+
def after(controller)
|
87
|
+
@controller = controller
|
88
|
+
if apply_outgoing? and @controller.response.body.is_a?(String)
|
89
|
+
@controller.response.body = to_external(@controller.response.body)
|
47
90
|
end
|
48
91
|
end
|
49
92
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
93
|
+
private
|
94
|
+
|
95
|
+
# 入出力フィルタの適用条件
|
96
|
+
def apply_incoming?
|
97
|
+
@controller.request.mobile?
|
54
98
|
end
|
55
|
-
|
56
|
-
|
57
|
-
|
99
|
+
|
100
|
+
def apply_outgoing?
|
101
|
+
@controller.request.mobile? and
|
102
|
+
[nil, "text/html", "application/xhtml+xml"].include?(@controller.response.content_type)
|
103
|
+
end
|
104
|
+
|
105
|
+
def to_internal(str)
|
106
|
+
filter(:zenkaku, str)
|
107
|
+
end
|
108
|
+
|
109
|
+
def to_external(str)
|
110
|
+
unless @options[:input]
|
111
|
+
filter(:hankaku, str)
|
58
112
|
else
|
59
113
|
encoding = (str =~ /^\s*<[^Hh>]*html/) and str.respond_to?(:encoding)
|
60
114
|
nokogiri_klass =
|
@@ -68,12 +122,12 @@ module Jpmobile
|
|
68
122
|
doc = convert_text_content(doc)
|
69
123
|
|
70
124
|
html = doc.to_html.gsub("\xc2\xa0"," ")
|
71
|
-
html = html.gsub(/charset=[a-z0-9\-]+/i, "charset=#{
|
125
|
+
html = html.gsub(/charset=[a-z0-9\-]+/i, "charset=#{default_charset}") if default_charset
|
72
126
|
html
|
73
127
|
end
|
74
128
|
end
|
75
129
|
|
76
|
-
def filter(
|
130
|
+
def filter(method, str)
|
77
131
|
str = str.clone
|
78
132
|
|
79
133
|
# 一度UTF-8に変換
|
@@ -83,9 +137,7 @@ module Jpmobile
|
|
83
137
|
str.force_encoding("UTF-8")
|
84
138
|
end
|
85
139
|
|
86
|
-
|
87
|
-
str.gsub!(int, to[i])
|
88
|
-
end
|
140
|
+
str = self.class.send("#{method}_format", str)
|
89
141
|
|
90
142
|
# 元に戻す
|
91
143
|
if before_encoding
|
@@ -101,11 +153,11 @@ module Jpmobile
|
|
101
153
|
if element.kind_of?(Nokogiri::XML::Text)
|
102
154
|
unless element.parent.node_name == "textarea"
|
103
155
|
# textarea 以外のテキストなら content を変換
|
104
|
-
element.content = filter(element.content
|
156
|
+
element.content = filter(:hankaku, element.content)
|
105
157
|
end
|
106
158
|
elsif element.node_name == "input" and ["submit", "reset", "button"].include?(element["type"])
|
107
159
|
# テキスト以外でもボタンの value は変換
|
108
|
-
element["value"] = filter(element["value"]
|
160
|
+
element["value"] = filter(:hankaku, element["value"])
|
109
161
|
elsif element.children.any?
|
110
162
|
# 子要素があれば再帰的に変換
|
111
163
|
element = convert_text_content(element)
|
@@ -114,5 +166,11 @@ module Jpmobile
|
|
114
166
|
|
115
167
|
document
|
116
168
|
end
|
169
|
+
|
170
|
+
def default_charset
|
171
|
+
if @controller.request.mobile?
|
172
|
+
@controller.request.mobile.default_charset
|
173
|
+
end
|
174
|
+
end
|
117
175
|
end
|
118
176
|
end
|
data/lib/jpmobile/mail.rb
CHANGED
@@ -29,12 +29,6 @@ module Mail
|
|
29
29
|
def mobile=(m)
|
30
30
|
if @mobile = m
|
31
31
|
@charset = m.mail_charset(@charset)
|
32
|
-
|
33
|
-
if self.body
|
34
|
-
self.body.content_type_with_jpmobile = self.content_type
|
35
|
-
self.body.charset = @charset
|
36
|
-
self.body.mobile = m
|
37
|
-
end
|
38
32
|
end
|
39
33
|
end
|
40
34
|
|
@@ -47,7 +41,6 @@ module Mail
|
|
47
41
|
|
48
42
|
ready_to_send!
|
49
43
|
|
50
|
-
self.body.charset = @charset
|
51
44
|
self.body.mobile = @mobile
|
52
45
|
self.header['Content-Transfer-Encoding'].value = @mobile.content_transfer_encoding(self.header)
|
53
46
|
if @mobile.decorated?
|
@@ -84,6 +77,18 @@ module Mail
|
|
84
77
|
self.body = body_part
|
85
78
|
end
|
86
79
|
|
80
|
+
def init_with_hash_with_jpmobile(hash)
|
81
|
+
if hash[:body_raw]
|
82
|
+
@mobile = hash[:mobile]
|
83
|
+
init_with_string(hash[:body_raw])
|
84
|
+
else
|
85
|
+
init_with_hash_without_jpmobile(hash)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
alias_method :init_with_hash_without_jpmobile, :init_with_hash
|
90
|
+
alias_method :init_with_hash, :init_with_hash_with_jpmobile
|
91
|
+
|
87
92
|
def init_with_string(string)
|
88
93
|
# convert to ASCII-8BIT for ascii incompatible encodings
|
89
94
|
s = Jpmobile::Util.ascii_8bit(string)
|
@@ -97,7 +102,6 @@ module Mail
|
|
97
102
|
process_body_raw_without_jpmobile
|
98
103
|
|
99
104
|
if @mobile
|
100
|
-
@body.charset = @charset
|
101
105
|
@body.mobile = @mobile
|
102
106
|
@body.content_type_with_jpmobile = self.content_type
|
103
107
|
|
@@ -121,6 +125,11 @@ module Mail
|
|
121
125
|
@raw_source = value.to_crlf
|
122
126
|
end
|
123
127
|
|
128
|
+
def separate_parts_with_jpmobile
|
129
|
+
@body.mobile = @mobile
|
130
|
+
separate_parts_without_jpmobile
|
131
|
+
end
|
132
|
+
|
124
133
|
alias_method :encoded_without_jpmobile, :encoded
|
125
134
|
alias_method :encoded, :encoded_with_jpmobile
|
126
135
|
|
@@ -130,6 +139,9 @@ module Mail
|
|
130
139
|
alias_method :process_body_raw_without_jpmobile, :process_body_raw
|
131
140
|
alias_method :process_body_raw, :process_body_raw_with_jpmobile
|
132
141
|
|
142
|
+
alias_method :separate_parts_without_jpmobile, :separate_parts
|
143
|
+
alias_method :separate_parts, :separate_parts_with_jpmobile
|
144
|
+
|
133
145
|
# -- docomo
|
134
146
|
# multipart/mixed
|
135
147
|
# |- multipart/related
|
@@ -230,34 +242,23 @@ module Mail
|
|
230
242
|
# override charset
|
231
243
|
if self.header[:content_type]
|
232
244
|
content_type_charset = Jpmobile::Util.extract_charset(self.header[:content_type].value)
|
245
|
+
@charset = content_type_charset
|
233
246
|
unless content_type_charset.blank?
|
234
|
-
@charset = content_type_charset
|
235
247
|
self.header[:content_type].parameters[:charset] = @charset
|
236
248
|
@mobile_main_type = self.header[:content_type].main_type
|
237
249
|
end
|
238
|
-
|
239
|
-
if !Jpmobile::Email.convertable?(self.header[:content_type].value) and content_type_charset.blank?
|
240
|
-
@charset = ''
|
241
|
-
end
|
242
250
|
end
|
243
251
|
|
244
252
|
# convert header(s)
|
245
253
|
if self.header[:subject]
|
246
254
|
subject_charset = Jpmobile::Util.extract_charset(self.header[:subject].value)
|
247
|
-
|
248
|
-
# override subject encoding if @charset is blank
|
249
|
-
@charset = subject_charset if !subject_charset.blank? # and @charset.blank?
|
250
255
|
self.header[:subject].charset = subject_charset unless subject_charset.blank?
|
251
256
|
|
252
257
|
if @mobile
|
253
258
|
subject_value = Encodings.value_decode(self.header[:subject].value)
|
254
259
|
subject_converting_encoding = Jpmobile::Util.detect_encoding(subject_value)
|
255
260
|
v = @mobile.to_mail_internal(subject_value, subject_converting_encoding)
|
256
|
-
|
257
|
-
self.header[:subject].value = Jpmobile::Util.force_encode(v, @charset, Jpmobile::Util::UTF8)
|
258
|
-
else
|
259
|
-
self.header[:subject].value = Jpmobile::Util.force_encode(v, @mobile.mail_charset(@charset), Jpmobile::Util::UTF8)
|
260
|
-
end
|
261
|
+
self.header[:subject].value = Jpmobile::Util.force_encode(v, @mobile.mail_charset(subject_charset), Jpmobile::Util::UTF8)
|
261
262
|
end
|
262
263
|
end
|
263
264
|
|
@@ -322,25 +323,18 @@ module Mail
|
|
322
323
|
# convert encoding
|
323
324
|
def encoded_with_jpmobile(transfer_encoding = '8bit')
|
324
325
|
if @mobile and !multipart?
|
325
|
-
|
326
|
-
|
327
|
-
elsif Jpmobile::Util.ascii_8bit?(@raw_source)
|
326
|
+
case transfer_encoding
|
327
|
+
when /base64/
|
328
328
|
_raw_source = if transfer_encoding == encoding
|
329
|
-
@raw_source
|
329
|
+
@raw_source.dup
|
330
330
|
else
|
331
|
-
|
332
|
-
enc.encode(@raw_source)
|
331
|
+
get_best_encoding(transfer_encoding).encode(@raw_source)
|
333
332
|
end
|
334
|
-
Jpmobile::Util.
|
333
|
+
Jpmobile::Util.set_encoding(_raw_source, @mobile.mail_charset(@charset))
|
334
|
+
when /quoted-printable/
|
335
|
+
Jpmobile::Util.set_encoding([@mobile.to_mail_body(@raw_source)].pack("M").gsub(/\n/, "\r\n"), @mobile.mail_charset(@charset))
|
335
336
|
else
|
336
|
-
|
337
|
-
when /quoted-printable/
|
338
|
-
# [str].pack("M").gsub(/\n/, "\r\n")
|
339
|
-
Jpmobile::Util.force_encode([@mobile.to_mail_body(Jpmobile::Util.force_encode(@raw_source, @charset, Jpmobile::Util::UTF8))].pack("M").gsub(/\n/, "\r\n"), Jpmobile::Util::BINARY, @charset)
|
340
|
-
# @mobile.to_mail_body(Jpmobile::Util.force_encode(@raw_source, @charset, Jpmobile::Util::UTF8))
|
341
|
-
else
|
342
|
-
@mobile.to_mail_body(Jpmobile::Util.force_encode(@raw_source, @charset, Jpmobile::Util::UTF8))
|
343
|
-
end
|
337
|
+
@mobile.to_mail_body(Jpmobile::Util.force_encode(@raw_source, nil, Jpmobile::Util::UTF8))
|
344
338
|
end
|
345
339
|
else
|
346
340
|
encoded_without_jpmobile(transfer_encoding)
|
@@ -366,9 +360,7 @@ module Mail
|
|
366
360
|
|
367
361
|
if self.multipart? and @mobile
|
368
362
|
self.parts.each do |part|
|
369
|
-
part.charset = @mobile.mail_charset(part.charset)
|
370
363
|
part.mobile = @mobile
|
371
|
-
part.body.charset = part.charset
|
372
364
|
part.body.mobile = @mobile
|
373
365
|
end
|
374
366
|
end
|
@@ -382,7 +374,7 @@ module Mail
|
|
382
374
|
|
383
375
|
def preamble_with_jpmobile
|
384
376
|
if @mobile
|
385
|
-
Jpmobile::Util.encode(@preamble, @charset)
|
377
|
+
Jpmobile::Util.encode(@preamble, @mobile.mail_charset(@charset))
|
386
378
|
else
|
387
379
|
preamble_without_jpmobile
|
388
380
|
end
|
@@ -390,7 +382,7 @@ module Mail
|
|
390
382
|
|
391
383
|
def epilogue_with_jpmobile
|
392
384
|
if @mobile
|
393
|
-
Jpmobile::Util.encode(@epilogue, @charset)
|
385
|
+
Jpmobile::Util.encode(@epilogue, @mobile.mail_charset(@charset))
|
394
386
|
else
|
395
387
|
epilogue_without_jpmobile
|
396
388
|
end
|
@@ -398,7 +390,7 @@ module Mail
|
|
398
390
|
|
399
391
|
def crlf_boundary_with_jpmobile
|
400
392
|
if @mobile
|
401
|
-
Jpmobile::Util.encode(crlf_boundary_without_jpmobile, @charset)
|
393
|
+
Jpmobile::Util.encode(crlf_boundary_without_jpmobile, @mobile.mail_charset(@charset))
|
402
394
|
else
|
403
395
|
crlf_boundary_without_jpmobile
|
404
396
|
end
|
@@ -406,7 +398,7 @@ module Mail
|
|
406
398
|
|
407
399
|
def end_boundary_with_jpmobile
|
408
400
|
if @mobile
|
409
|
-
Jpmobile::Util.encode(end_boundary_without_jpmobile, @charset)
|
401
|
+
Jpmobile::Util.encode(end_boundary_without_jpmobile, @mobile.mail_charset(@charset))
|
410
402
|
else
|
411
403
|
end_boundary_without_jpmobile
|
412
404
|
end
|
@@ -435,6 +427,17 @@ module Mail
|
|
435
427
|
|
436
428
|
alias_method :epilogue_without_jpmobile, :epilogue
|
437
429
|
alias_method :epilogue, :epilogue_with_jpmobile
|
430
|
+
|
431
|
+
def split!(boundary)
|
432
|
+
self.boundary = boundary
|
433
|
+
parts = raw_source.split(/(?:\A|\r\n)--#{Regexp.escape(boundary)}(?=(?:--)?\s*$)/)
|
434
|
+
# Make the preamble equal to the preamble (if any)
|
435
|
+
self.preamble = parts[0].to_s.strip
|
436
|
+
# Make the epilogue equal to the epilogue (if any)
|
437
|
+
self.epilogue = parts[-1].to_s.sub('--', '').strip
|
438
|
+
parts[1...-1].to_a.each { |part| @parts << Mail::Part.new(:body_raw => part, :mobile => @mobile) }
|
439
|
+
self
|
440
|
+
end
|
438
441
|
end
|
439
442
|
|
440
443
|
class UnstructuredField
|
data/lib/jpmobile/mailer.rb
CHANGED
data/lib/jpmobile/trans_sid.rb
CHANGED
@@ -130,8 +130,10 @@ module Jpmobile::TransSid #:nodoc:
|
|
130
130
|
key
|
131
131
|
end
|
132
132
|
# session_idを返す
|
133
|
+
# rack 1.4 (rails3) request.session_options[:id]
|
134
|
+
# rack 1.5 (rails4) request.session.id
|
133
135
|
def jpmobile_session_id
|
134
|
-
request.session_options[:id]
|
136
|
+
request.session_options[:id] || request.session.id
|
135
137
|
end
|
136
138
|
# session_idを埋め込むためのhidden fieldを出力する。
|
137
139
|
def sid_hidden_field_tag
|
data/lib/jpmobile/version.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
X-Account-Key: account2
|
2
|
+
X-UIDL: UID44724-1271041990
|
3
|
+
X-Mozilla-Status: 0001
|
4
|
+
X-Mozilla-Status2: 10000000
|
5
|
+
X-Mozilla-Keys:
|
6
|
+
Return-Path: <info@jp.mobile>
|
7
|
+
X-Original-To: info+to@jp.mobile
|
8
|
+
Delivered-To: info+to@jp.mobile
|
9
|
+
Received: from localhost (localhost [127.0.0.1])
|
10
|
+
by mx1.jp.mobile (Postfix) with ESMTP id 916D982D3C
|
11
|
+
for <info+to@jp.mobile>; Mon, 17 Jan 2011 16:43:00 +0900 (JST)
|
12
|
+
Received: from mx1.jp.mobile ([127.0.0.1])
|
13
|
+
by localhost (mx1.jp.mobile [127.0.0.1]) (amavisd-new, port 10024)
|
14
|
+
with ESMTP id 4c+D+lqN6aOJ for <info+to@jp.mobile>;
|
15
|
+
Mon, 17 Jan 2011 16:43:00 +0900 (JST)
|
16
|
+
Received: by mx1.jp.mobile (Postfix, from userid 58)
|
17
|
+
id 68BFD82D33; Mon, 17 Jan 2011 16:43:00 +0900 (JST)
|
18
|
+
Message-ID: <4D33F300.8050702@jpmobile.jp>
|
19
|
+
Date: Mon, 17 Jan 2011 16:42:56 +0900
|
20
|
+
From: Shin-ichiro OGAWA <info@jpmobile.jp>
|
21
|
+
User-Agent: Mozilla-Thunderbird 2.0.0.24 (X11/20100329)
|
22
|
+
MIME-Version: 1.0
|
23
|
+
To: info+to@jp.mobile
|
24
|
+
Subject:
|
25
|
+
Content-Type: multipart/mixed;
|
26
|
+
boundary="------------010605060509040104050402"
|
27
|
+
|
28
|
+
This is a multi-part message in MIME format.
|
29
|
+
--------------010605060509040104050402
|
30
|
+
Content-Type: text/plain; charset=ISO-2022-JP
|
31
|
+
Content-Transfer-Encoding: 7bit
|
32
|
+
|
33
|
+
$BK\J8$G$9(B
|
34
|
+
|
35
|
+
|
36
|
+
--------------010605060509040104050402
|
37
|
+
Content-Transfer-Encoding: base64
|
38
|
+
Content-Type: image/gif;
|
39
|
+
name="Transparent.gif"
|
40
|
+
Content-Disposition: attachment;
|
41
|
+
filename="Transparent.gif"
|
42
|
+
|
43
|
+
R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
|
44
|
+
--------------010605060509040104050402--
|
45
|
+
|
@@ -67,6 +67,21 @@ describe "Jpmobile::Mail#receive" do
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
+
describe "PC mail without subject" do
|
71
|
+
before(:each) do
|
72
|
+
@mail = Mail.new(open(File.join(File.expand_path(File.dirname(__FILE__)), "email-fixtures/pc-mail-attached-without-subject.eml")).read)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "body should be parsed correctly" do
|
76
|
+
@mail.body.parts.size.should == 2
|
77
|
+
@mail.body.parts.first.body.to_s.should == "本文です\n\n"
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should encode correctly" do
|
81
|
+
ascii_8bit(@mail.to_s).should match(/GODlhAQABAIAAAAAAAP/)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
70
85
|
describe "Docomo" do
|
71
86
|
before(:each) do
|
72
87
|
@mail = Mail.new(open(File.join(File.expand_path(File.dirname(__FILE__)), "../../test/rails/overrides/spec/fixtures/mobile_mailer/docomo-gmail-sjis.eml")).read)
|
@@ -258,7 +273,7 @@ describe "Jpmobile::Mail#receive" do
|
|
258
273
|
|
259
274
|
it 'should be encoded correctly' do
|
260
275
|
@mail = Mail.new(open(File.join(File.expand_path(File.dirname(__FILE__)), "email-fixtures/iphone-message.eml")).read)
|
261
|
-
@mail.encoded
|
276
|
+
@mail.encoded.should match(Regexp.escape("%[\e$B1`;yL>\e(B]%\e$B$N\e(B%[\e$BJ]8n<TL>\e(B]%"))
|
262
277
|
end
|
263
278
|
end
|
264
279
|
|
@@ -271,14 +286,14 @@ describe "Jpmobile::Mail#receive" do
|
|
271
286
|
|
272
287
|
it 'should be encoded correctly' do
|
273
288
|
@mail = Mail.new(open(File.join(File.expand_path(File.dirname(__FILE__)), "email-fixtures/iphone-mail3.eml")).read)
|
274
|
-
@mail.encoded
|
289
|
+
@mail.encoded.should match(/BK\\J82~9T\$J\$7!2#5#1#2J8;z!2/)
|
275
290
|
end
|
276
291
|
end
|
277
292
|
|
278
293
|
it 'should not raise when parsing attached email' do
|
279
294
|
lambda {
|
280
295
|
@mail = Mail.new(open(File.join(File.expand_path(File.dirname(__FILE__)), "email-fixtures/au-attached.eml")).read)
|
281
|
-
@mail.encoded
|
296
|
+
@mail.encoded.should match('/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPQAA')
|
282
297
|
}.should_not raise_error
|
283
298
|
end
|
284
299
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jpmobile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shin-ichiro OGAWA
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-11-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ~>
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: 4.0.0
|
21
21
|
type: :development
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ~>
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
27
|
+
version: 4.0.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rspec
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,6 +95,20 @@ dependencies:
|
|
95
95
|
- - '>='
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: nokogiri
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - '='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 1.6.2.1
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 1.6.2.1
|
98
112
|
- !ruby/object:Gem::Dependency
|
99
113
|
name: hpricot
|
100
114
|
requirement: !ruby/object:Gem::Requirement
|
@@ -228,6 +242,7 @@ files:
|
|
228
242
|
- spec/unit/email-fixtures/docomo-jis.eml
|
229
243
|
- spec/unit/email-fixtures/iphone-mail3.eml
|
230
244
|
- spec/unit/email-fixtures/iphone-message.eml
|
245
|
+
- spec/unit/email-fixtures/pc-mail-attached-without-subject.eml
|
231
246
|
- spec/unit/email-fixtures/pc-mail-multi.eml
|
232
247
|
- spec/unit/email-fixtures/pc-mail-single.eml
|
233
248
|
- spec/unit/email-fixtures/photo.jpg
|
@@ -400,7 +415,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
400
415
|
version: '0'
|
401
416
|
requirements: []
|
402
417
|
rubyforge_project:
|
403
|
-
rubygems_version: 2.0.
|
418
|
+
rubygems_version: 2.0.14
|
404
419
|
signing_key:
|
405
420
|
specification_version: 4
|
406
421
|
summary: A Rails plugin for mobile devices in Japan
|
@@ -434,6 +449,7 @@ test_files:
|
|
434
449
|
- spec/unit/email-fixtures/docomo-jis.eml
|
435
450
|
- spec/unit/email-fixtures/iphone-mail3.eml
|
436
451
|
- spec/unit/email-fixtures/iphone-message.eml
|
452
|
+
- spec/unit/email-fixtures/pc-mail-attached-without-subject.eml
|
437
453
|
- spec/unit/email-fixtures/pc-mail-multi.eml
|
438
454
|
- spec/unit/email-fixtures/pc-mail-single.eml
|
439
455
|
- spec/unit/email-fixtures/photo.jpg
|