mms2r 1.1.12 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. data/History.txt +32 -2
  2. data/Manifest.txt +41 -79
  3. data/README.txt +50 -51
  4. data/Rakefile +3 -2
  5. data/conf/aliases.yml +8 -0
  6. data/conf/message.alltel.com.yml +14 -0
  7. data/conf/messaging.nextel.com.yml +10 -0
  8. data/conf/mms.att.net.yml +9 -0
  9. data/conf/mms.dobson.net.yml +4 -0
  10. data/conf/mms.luxgsm.lu.yml +8 -0
  11. data/conf/mms.myhelio.com.yml +12 -0
  12. data/conf/mms.netcom.no.yml +4 -0
  13. data/conf/mms.o2online.de.yml +8 -0
  14. data/conf/mms.three.co.uk.yml +15 -0
  15. data/conf/mms2r_media.yml +6 -0
  16. data/conf/orangemms.net.yml +13 -0
  17. data/conf/pm.sprint.com.yml +10 -0
  18. data/conf/pxt.vodafone.net.nz.yml +5 -0
  19. data/conf/tmomail.net.yml +16 -0
  20. data/conf/vzwpix.com.yml +8 -0
  21. data/dev_tools/anonymizer.rb +20 -0
  22. data/lib/mms2r.rb +19 -45
  23. data/lib/mms2r/media.rb +288 -300
  24. data/lib/mms2r/media/sprint.rb +189 -0
  25. data/test/fixtures/att-text-01.mail +27 -0
  26. data/test/fixtures/helio-image-01.mail +8 -8
  27. data/test/fixtures/helio-message-01.mail +327 -0
  28. data/test/fixtures/luxgsm-image-01.mail +388 -0
  29. data/test/fixtures/netcom-image-01.mail +556 -0
  30. data/test/fixtures/o2-de-image-01.mail +314 -0
  31. data/test/fixtures/orange-uk-image-01.mail +71 -0
  32. data/test/fixtures/pxt-image-01.mail +118 -0
  33. data/test/fixtures/sprint-broken-image-01.mail +1 -1
  34. data/test/fixtures/sprint-image-01.mail +211 -195
  35. data/test/fixtures/sprint-purged-image-01.mail +1 -1
  36. data/test/fixtures/sprint-two-images-01.mail +231 -198
  37. data/test/fixtures/sprint-video-01.mail +210 -195
  38. data/test/fixtures/three-uk-image-01.mail +1202 -0
  39. data/test/test_helper.rb +39 -0
  40. data/test/{test_mms2r_alltel_media.rb → test_message_alltel_com.rb} +13 -17
  41. data/test/{test_mms2r_nextel_media.rb → test_messaging_nextel_com.rb} +12 -19
  42. data/test/{test_mms2r_sprint_pcs_media.rb → test_messaging_sprintpcs_com.rb} +9 -10
  43. data/test/test_mms2r_media.rb +474 -316
  44. data/test/test_mms_att_net.rb +92 -0
  45. data/test/test_mms_dobson_net.rb +41 -0
  46. data/test/test_mms_luxgsm_lu.rb +50 -0
  47. data/test/test_mms_myhelio_com.rb +60 -0
  48. data/test/test_mms_netcom_no.rb +52 -0
  49. data/test/test_mms_o2online_de.rb +53 -0
  50. data/test/test_mms_three_co_uk.rb +42 -0
  51. data/test/test_orangemms_net.rb +100 -0
  52. data/test/test_pm_sprint_com.rb +201 -0
  53. data/test/test_pxt_vodafone_net_nz.rb +37 -0
  54. data/test/{test_mms2r_t_mobile_media.rb → test_tmomail_net.rb} +8 -19
  55. data/test/{test_mms2r_verizon_media.rb → test_vzwpix_com.rb} +34 -27
  56. data/vendor/plugins/mms2r/lib/autotest/mms2r.rb +16 -11
  57. metadata +128 -157
  58. data/conf/mms2r_alltel_media_ignore.yml +0 -13
  59. data/conf/mms2r_att_media_subject.yml +0 -3
  60. data/conf/mms2r_cingular_me_media_subject.yml +0 -3
  61. data/conf/mms2r_cingular_me_media_transform.yml +0 -7
  62. data/conf/mms2r_dobson_media_ignore.yml +0 -4
  63. data/conf/mms2r_helio_media_ignore.yml +0 -6
  64. data/conf/mms2r_media_ignore.yml +0 -5
  65. data/conf/mms2r_media_subject.yml +0 -3
  66. data/conf/mms2r_my_cingular_media_subject.yml +0 -3
  67. data/conf/mms2r_nextel_media_ignore.yml +0 -11
  68. data/conf/mms2r_orange_france_media_ignore.yml +0 -6
  69. data/conf/mms2r_orange_poland_media_subject.yml +0 -3
  70. data/conf/mms2r_sprint_media_ignore.yml +0 -7
  71. data/conf/mms2r_sprint_media_subject.yml +0 -3
  72. data/conf/mms2r_t_mobile_media_ignore.yml +0 -16
  73. data/conf/mms2r_verizon_media_ignore.yml +0 -4
  74. data/conf/mms2r_verizon_media_transform.yml +0 -5
  75. data/lib/mms2r/alltel_media.rb +0 -10
  76. data/lib/mms2r/att_media.rb +0 -13
  77. data/lib/mms2r/cingular_me_media.rb +0 -23
  78. data/lib/mms2r/dobson_media.rb +0 -13
  79. data/lib/mms2r/helio_media.rb +0 -20
  80. data/lib/mms2r/m_mode_media.rb +0 -13
  81. data/lib/mms2r/my_cingular_media.rb +0 -15
  82. data/lib/mms2r/nextel_media.rb +0 -17
  83. data/lib/mms2r/orange_france_media.rb +0 -10
  84. data/lib/mms2r/orange_poland_media.rb +0 -10
  85. data/lib/mms2r/sprint_media.rb +0 -182
  86. data/lib/mms2r/sprint_pcs_media.rb +0 -16
  87. data/lib/mms2r/t_mobile_media.rb +0 -21
  88. data/lib/mms2r/verizon_media.rb +0 -19
  89. data/lib/mms2r/vtext_media.rb +0 -16
  90. data/lib/vendor/text/format.rb +0 -1466
  91. data/lib/vendor/tmail.rb +0 -3
  92. data/lib/vendor/tmail/address.rb +0 -242
  93. data/lib/vendor/tmail/attachments.rb +0 -39
  94. data/lib/vendor/tmail/base64.rb +0 -71
  95. data/lib/vendor/tmail/config.rb +0 -69
  96. data/lib/vendor/tmail/encode.rb +0 -467
  97. data/lib/vendor/tmail/facade.rb +0 -552
  98. data/lib/vendor/tmail/header.rb +0 -914
  99. data/lib/vendor/tmail/info.rb +0 -35
  100. data/lib/vendor/tmail/loader.rb +0 -1
  101. data/lib/vendor/tmail/mail.rb +0 -447
  102. data/lib/vendor/tmail/mailbox.rb +0 -433
  103. data/lib/vendor/tmail/mbox.rb +0 -1
  104. data/lib/vendor/tmail/net.rb +0 -280
  105. data/lib/vendor/tmail/obsolete.rb +0 -135
  106. data/lib/vendor/tmail/parser.rb +0 -1522
  107. data/lib/vendor/tmail/port.rb +0 -377
  108. data/lib/vendor/tmail/quoting.rb +0 -131
  109. data/lib/vendor/tmail/scanner.rb +0 -41
  110. data/lib/vendor/tmail/scanner_r.rb +0 -263
  111. data/lib/vendor/tmail/stringio.rb +0 -277
  112. data/lib/vendor/tmail/tmail.rb +0 -1
  113. data/lib/vendor/tmail/utils.rb +0 -238
  114. data/test/fixtures/broken_from_spam.mail +0 -80
  115. data/test/fixtures/hello_world_empty_text.mail +0 -7
  116. data/test/fixtures/hello_world_mail_multipart.mail +0 -24
  117. data/test/fixtures/hello_world_mail_plain_no_content_type.mail +0 -7
  118. data/test/fixtures/hello_world_mail_plain_with_content_type.mail +0 -8
  119. data/test/fixtures/simple-with-two-images-two-texts.mail +0 -49
  120. data/test/fixtures/simple_image.mail +0 -19
  121. data/test/fixtures/simple_multipart_alternative.mail +0 -42
  122. data/test/test_mms2r_att_media.rb +0 -54
  123. data/test/test_mms2r_cingular_me_media.rb +0 -51
  124. data/test/test_mms2r_dobson_media.rb +0 -46
  125. data/test/test_mms2r_helio_media.rb +0 -49
  126. data/test/test_mms2r_m_mode_media.rb +0 -36
  127. data/test/test_mms2r_my_cingular_media.rb +0 -31
  128. data/test/test_mms2r_orange_france_media.rb +0 -53
  129. data/test/test_mms2r_orange_poland_media.rb +0 -42
  130. data/test/test_mms2r_sprint_media.rb +0 -269
  131. data/test/test_mms2r_vtext_media.rb +0 -28
@@ -1,433 +0,0 @@
1
- #
2
- # mailbox.rb
3
- #
4
- #--
5
- # Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
6
- #
7
- # Permission is hereby granted, free of charge, to any person obtaining
8
- # a copy of this software and associated documentation files (the
9
- # "Software"), to deal in the Software without restriction, including
10
- # without limitation the rights to use, copy, modify, merge, publish,
11
- # distribute, sublicense, and/or sell copies of the Software, and to
12
- # permit persons to whom the Software is furnished to do so, subject to
13
- # the following conditions:
14
- #
15
- # The above copyright notice and this permission notice shall be
16
- # included in all copies or substantial portions of the Software.
17
- #
18
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
- #
26
- # Note: Originally licensed under LGPL v2+. Using MIT license for Rails
27
- # with permission of Minero Aoki.
28
- #++
29
-
30
- require 'tmail/port'
31
- require 'socket'
32
- require 'mutex_m'
33
-
34
-
35
- unless [].respond_to?(:sort_by)
36
- module Enumerable#:nodoc:
37
- def sort_by
38
- map {|i| [yield(i), i] }.sort {|a,b| a.first <=> b.first }.map {|i| i[1] }
39
- end
40
- end
41
- end
42
-
43
-
44
- module TMail
45
-
46
- class MhMailbox
47
-
48
- PORT_CLASS = MhPort
49
-
50
- def initialize( dir )
51
- edir = File.expand_path(dir)
52
- raise ArgumentError, "not directory: #{dir}"\
53
- unless FileTest.directory? edir
54
- @dirname = edir
55
- @last_file = nil
56
- @last_atime = nil
57
- end
58
-
59
- def directory
60
- @dirname
61
- end
62
-
63
- alias dirname directory
64
-
65
- attr_accessor :last_atime
66
-
67
- def inspect
68
- "#<#{self.class} #{@dirname}>"
69
- end
70
-
71
- def close
72
- end
73
-
74
- def new_port
75
- PORT_CLASS.new(next_file_name())
76
- end
77
-
78
- def each_port
79
- mail_files().each do |path|
80
- yield PORT_CLASS.new(path)
81
- end
82
- @last_atime = Time.now
83
- end
84
-
85
- alias each each_port
86
-
87
- def reverse_each_port
88
- mail_files().reverse_each do |path|
89
- yield PORT_CLASS.new(path)
90
- end
91
- @last_atime = Time.now
92
- end
93
-
94
- alias reverse_each reverse_each_port
95
-
96
- # old #each_mail returns Port
97
- #def each_mail
98
- # each_port do |port|
99
- # yield Mail.new(port)
100
- # end
101
- #end
102
-
103
- def each_new_port( mtime = nil, &block )
104
- mtime ||= @last_atime
105
- return each_port(&block) unless mtime
106
- return unless File.mtime(@dirname) >= mtime
107
-
108
- mail_files().each do |path|
109
- yield PORT_CLASS.new(path) if File.mtime(path) > mtime
110
- end
111
- @last_atime = Time.now
112
- end
113
-
114
- private
115
-
116
- def mail_files
117
- Dir.entries(@dirname)\
118
- .select {|s| /\A\d+\z/ === s }\
119
- .map {|s| s.to_i }\
120
- .sort\
121
- .map {|i| "#{@dirname}/#{i}" }\
122
- .select {|path| FileTest.file? path }
123
- end
124
-
125
- def next_file_name
126
- unless n = @last_file
127
- n = 0
128
- Dir.entries(@dirname)\
129
- .select {|s| /\A\d+\z/ === s }\
130
- .map {|s| s.to_i }.sort\
131
- .each do |i|
132
- next unless FileTest.file? "#{@dirname}/#{i}"
133
- n = i
134
- end
135
- end
136
- begin
137
- n += 1
138
- end while FileTest.exist? "#{@dirname}/#{n}"
139
- @last_file = n
140
-
141
- "#{@dirname}/#{n}"
142
- end
143
-
144
- end # MhMailbox
145
-
146
- MhLoader = MhMailbox
147
-
148
-
149
- class UNIXMbox
150
-
151
- def UNIXMbox.lock( fname )
152
- begin
153
- f = File.open(fname)
154
- f.flock File::LOCK_EX
155
- yield f
156
- ensure
157
- f.flock File::LOCK_UN
158
- f.close if f and not f.closed?
159
- end
160
- end
161
-
162
- class << self
163
- alias newobj new
164
- end
165
-
166
- def UNIXMbox.new( fname, tmpdir = nil, readonly = false )
167
- tmpdir = ENV['TEMP'] || ENV['TMP'] || '/tmp'
168
- newobj(fname, "#{tmpdir}/ruby_tmail_#{$$}_#{rand()}", readonly, false)
169
- end
170
-
171
- def UNIXMbox.static_new( fname, dir, readonly = false )
172
- newobj(fname, dir, readonly, true)
173
- end
174
-
175
- def initialize( fname, mhdir, readonly, static )
176
- @filename = fname
177
- @readonly = readonly
178
- @closed = false
179
-
180
- Dir.mkdir mhdir
181
- @real = MhMailbox.new(mhdir)
182
- @finalizer = UNIXMbox.mkfinal(@real, @filename, !@readonly, !static)
183
- ObjectSpace.define_finalizer self, @finalizer
184
- end
185
-
186
- def UNIXMbox.mkfinal( mh, mboxfile, writeback_p, cleanup_p )
187
- lambda {
188
- if writeback_p
189
- lock(mboxfile) {|f|
190
- mh.each_port do |port|
191
- f.puts create_from_line(port)
192
- port.ropen {|r|
193
- f.puts r.read
194
- }
195
- end
196
- }
197
- end
198
- if cleanup_p
199
- Dir.foreach(mh.dirname) do |fname|
200
- next if /\A\.\.?\z/ === fname
201
- File.unlink "#{mh.dirname}/#{fname}"
202
- end
203
- Dir.rmdir mh.dirname
204
- end
205
- }
206
- end
207
-
208
- # make _From line
209
- def UNIXMbox.create_from_line( port )
210
- sprintf 'From %s %s',
211
- fromaddr(), TextUtils.time2str(File.mtime(port.filename))
212
- end
213
-
214
- def UNIXMbox.fromaddr
215
- h = HeaderField.new_from_port(port, 'Return-Path') ||
216
- HeaderField.new_from_port(port, 'From') or return 'nobody'
217
- a = h.addrs[0] or return 'nobody'
218
- a.spec
219
- end
220
- private_class_method :fromaddr
221
-
222
- def close
223
- return if @closed
224
-
225
- ObjectSpace.undefine_finalizer self
226
- @finalizer.call
227
- @finalizer = nil
228
- @real = nil
229
- @closed = true
230
- @updated = nil
231
- end
232
-
233
- def each_port( &block )
234
- close_check
235
- update
236
- @real.each_port(&block)
237
- end
238
-
239
- alias each each_port
240
-
241
- def reverse_each_port( &block )
242
- close_check
243
- update
244
- @real.reverse_each_port(&block)
245
- end
246
-
247
- alias reverse_each reverse_each_port
248
-
249
- # old #each_mail returns Port
250
- #def each_mail( &block )
251
- # each_port do |port|
252
- # yield Mail.new(port)
253
- # end
254
- #end
255
-
256
- def each_new_port( mtime = nil )
257
- close_check
258
- update
259
- @real.each_new_port(mtime) {|p| yield p }
260
- end
261
-
262
- def new_port
263
- close_check
264
- @real.new_port
265
- end
266
-
267
- private
268
-
269
- def close_check
270
- @closed and raise ArgumentError, 'accessing already closed mbox'
271
- end
272
-
273
- def update
274
- return if FileTest.zero?(@filename)
275
- return if @updated and File.mtime(@filename) < @updated
276
- w = nil
277
- port = nil
278
- time = nil
279
- UNIXMbox.lock(@filename) {|f|
280
- begin
281
- f.each do |line|
282
- if /\AFrom / === line
283
- w.close if w
284
- File.utime time, time, port.filename if time
285
-
286
- port = @real.new_port
287
- w = port.wopen
288
- time = fromline2time(line)
289
- else
290
- w.print line if w
291
- end
292
- end
293
- ensure
294
- if w and not w.closed?
295
- w.close
296
- File.utime time, time, port.filename if time
297
- end
298
- end
299
- f.truncate(0) unless @readonly
300
- @updated = Time.now
301
- }
302
- end
303
-
304
- def fromline2time( line )
305
- m = /\AFrom \S+ \w+ (\w+) (\d+) (\d+):(\d+):(\d+) (\d+)/.match(line) \
306
- or return nil
307
- Time.local(m[6].to_i, m[1], m[2].to_i, m[3].to_i, m[4].to_i, m[5].to_i)
308
- end
309
-
310
- end # UNIXMbox
311
-
312
- MboxLoader = UNIXMbox
313
-
314
-
315
- class Maildir
316
-
317
- extend Mutex_m
318
-
319
- PORT_CLASS = MaildirPort
320
-
321
- @seq = 0
322
- def Maildir.unique_number
323
- synchronize {
324
- @seq += 1
325
- return @seq
326
- }
327
- end
328
-
329
- def initialize( dir = nil )
330
- @dirname = dir || ENV['MAILDIR']
331
- raise ArgumentError, "not directory: #{@dirname}"\
332
- unless FileTest.directory? @dirname
333
- @new = "#{@dirname}/new"
334
- @tmp = "#{@dirname}/tmp"
335
- @cur = "#{@dirname}/cur"
336
- end
337
-
338
- def directory
339
- @dirname
340
- end
341
-
342
- def inspect
343
- "#<#{self.class} #{@dirname}>"
344
- end
345
-
346
- def close
347
- end
348
-
349
- def each_port
350
- mail_files(@cur).each do |path|
351
- yield PORT_CLASS.new(path)
352
- end
353
- end
354
-
355
- alias each each_port
356
-
357
- def reverse_each_port
358
- mail_files(@cur).reverse_each do |path|
359
- yield PORT_CLASS.new(path)
360
- end
361
- end
362
-
363
- alias reverse_each reverse_each_port
364
-
365
- def new_port
366
- fname = nil
367
- tmpfname = nil
368
- newfname = nil
369
-
370
- begin
371
- fname = "#{Time.now.to_i}.#{$$}_#{Maildir.unique_number}.#{Socket.gethostname}"
372
-
373
- tmpfname = "#{@tmp}/#{fname}"
374
- newfname = "#{@new}/#{fname}"
375
- end while FileTest.exist? tmpfname
376
-
377
- if block_given?
378
- File.open(tmpfname, 'w') {|f| yield f }
379
- File.rename tmpfname, newfname
380
- PORT_CLASS.new(newfname)
381
- else
382
- File.open(tmpfname, 'w') {|f| f.write "\n\n" }
383
- PORT_CLASS.new(tmpfname)
384
- end
385
- end
386
-
387
- def each_new_port
388
- mail_files(@new).each do |path|
389
- dest = @cur + '/' + File.basename(path)
390
- File.rename path, dest
391
- yield PORT_CLASS.new(dest)
392
- end
393
-
394
- check_tmp
395
- end
396
-
397
- TOO_OLD = 60 * 60 * 36 # 36 hour
398
-
399
- def check_tmp
400
- old = Time.now.to_i - TOO_OLD
401
-
402
- each_filename(@tmp) do |full, fname|
403
- if FileTest.file? full and
404
- File.stat(full).mtime.to_i < old
405
- File.unlink full
406
- end
407
- end
408
- end
409
-
410
- private
411
-
412
- def mail_files( dir )
413
- Dir.entries(dir)\
414
- .select {|s| s[0] != ?. }\
415
- .sort_by {|s| s.slice(/\A\d+/).to_i }\
416
- .map {|s| "#{dir}/#{s}" }\
417
- .select {|path| FileTest.file? path }
418
- end
419
-
420
- def each_filename( dir )
421
- Dir.foreach(dir) do |fname|
422
- path = "#{dir}/#{fname}"
423
- if fname[0] != ?. and FileTest.file? path
424
- yield path, fname
425
- end
426
- end
427
- end
428
-
429
- end # Maildir
430
-
431
- MaildirLoader = Maildir
432
-
433
- end # module TMail
@@ -1 +0,0 @@
1
- require 'tmail/mailbox'
@@ -1,280 +0,0 @@
1
- #
2
- # net.rb
3
- #
4
- #--
5
- # Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
6
- #
7
- # Permission is hereby granted, free of charge, to any person obtaining
8
- # a copy of this software and associated documentation files (the
9
- # "Software"), to deal in the Software without restriction, including
10
- # without limitation the rights to use, copy, modify, merge, publish,
11
- # distribute, sublicense, and/or sell copies of the Software, and to
12
- # permit persons to whom the Software is furnished to do so, subject to
13
- # the following conditions:
14
- #
15
- # The above copyright notice and this permission notice shall be
16
- # included in all copies or substantial portions of the Software.
17
- #
18
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
- #
26
- # Note: Originally licensed under LGPL v2+. Using MIT license for Rails
27
- # with permission of Minero Aoki.
28
- #++
29
-
30
- require 'nkf'
31
-
32
-
33
- module TMail
34
-
35
- class Mail
36
-
37
- def send_to( smtp )
38
- do_send_to(smtp) do
39
- ready_to_send
40
- end
41
- end
42
-
43
- def send_text_to( smtp )
44
- do_send_to(smtp) do
45
- ready_to_send
46
- mime_encode
47
- end
48
- end
49
-
50
- def do_send_to( smtp )
51
- from = from_address or raise ArgumentError, 'no from address'
52
- (dests = destinations).empty? and raise ArgumentError, 'no receipient'
53
- yield
54
- send_to_0 smtp, from, dests
55
- end
56
- private :do_send_to
57
-
58
- def send_to_0( smtp, from, to )
59
- smtp.ready(from, to) do |f|
60
- encoded "\r\n", 'j', f, ''
61
- end
62
- end
63
-
64
- def ready_to_send
65
- delete_no_send_fields
66
- add_message_id
67
- add_date
68
- end
69
-
70
- NOSEND_FIELDS = %w(
71
- received
72
- bcc
73
- )
74
-
75
- def delete_no_send_fields
76
- NOSEND_FIELDS.each do |nm|
77
- delete nm
78
- end
79
- delete_if {|n,v| v.empty? }
80
- end
81
-
82
- def add_message_id( fqdn = nil )
83
- self.message_id = ::TMail::new_message_id(fqdn)
84
- end
85
-
86
- def add_date
87
- self.date = Time.now
88
- end
89
-
90
- def mime_encode
91
- if parts.empty?
92
- mime_encode_singlepart
93
- else
94
- mime_encode_multipart true
95
- end
96
- end
97
-
98
- def mime_encode_singlepart
99
- self.mime_version = '1.0'
100
- b = body
101
- if NKF.guess(b) != NKF::BINARY
102
- mime_encode_text b
103
- else
104
- mime_encode_binary b
105
- end
106
- end
107
-
108
- def mime_encode_text( body )
109
- self.body = NKF.nkf('-j -m0', body)
110
- self.set_content_type 'text', 'plain', {'charset' => 'iso-2022-jp'}
111
- self.encoding = '7bit'
112
- end
113
-
114
- def mime_encode_binary( body )
115
- self.body = [body].pack('m')
116
- self.set_content_type 'application', 'octet-stream'
117
- self.encoding = 'Base64'
118
- end
119
-
120
- def mime_encode_multipart( top = true )
121
- self.mime_version = '1.0' if top
122
- self.set_content_type 'multipart', 'mixed'
123
- e = encoding(nil)
124
- if e and not /\A(?:7bit|8bit|binary)\z/i === e
125
- raise ArgumentError,
126
- 'using C.T.Encoding with multipart mail is not permitted'
127
- end
128
- end
129
-
130
- def create_empty_mail
131
- self.class.new(StringPort.new(''), @config)
132
- end
133
-
134
- def create_reply
135
- setup_reply create_empty_mail()
136
- end
137
-
138
- def setup_reply( m )
139
- if tmp = reply_addresses(nil)
140
- m.to_addrs = tmp
141
- end
142
-
143
- mid = message_id(nil)
144
- tmp = references(nil) || []
145
- tmp.push mid if mid
146
- m.in_reply_to = [mid] if mid
147
- m.references = tmp unless tmp.empty?
148
- m.subject = 'Re: ' + subject('').sub(/\A(?:\s*re:)+/i, '')
149
-
150
- m
151
- end
152
-
153
- def create_forward
154
- setup_forward create_empty_mail()
155
- end
156
-
157
- def setup_forward( mail )
158
- m = Mail.new(StringPort.new(''))
159
- m.body = decoded
160
- m.set_content_type 'message', 'rfc822'
161
- m.encoding = encoding('7bit')
162
- mail.parts.push m
163
- end
164
-
165
- end
166
-
167
-
168
- class DeleteFields
169
-
170
- NOSEND_FIELDS = %w(
171
- received
172
- bcc
173
- )
174
-
175
- def initialize( nosend = nil, delempty = true )
176
- @no_send_fields = nosend || NOSEND_FIELDS.dup
177
- @delete_empty_fields = delempty
178
- end
179
-
180
- attr :no_send_fields
181
- attr :delete_empty_fields, true
182
-
183
- def exec( mail )
184
- @no_send_fields.each do |nm|
185
- delete nm
186
- end
187
- delete_if {|n,v| v.empty? } if @delete_empty_fields
188
- end
189
-
190
- end
191
-
192
-
193
- class AddMessageId
194
-
195
- def initialize( fqdn = nil )
196
- @fqdn = fqdn
197
- end
198
-
199
- attr :fqdn, true
200
-
201
- def exec( mail )
202
- mail.message_id = ::TMail::new_msgid(@fqdn)
203
- end
204
-
205
- end
206
-
207
-
208
- class AddDate
209
-
210
- def exec( mail )
211
- mail.date = Time.now
212
- end
213
-
214
- end
215
-
216
-
217
- class MimeEncodeAuto
218
-
219
- def initialize( s = nil, m = nil )
220
- @singlepart_composer = s || MimeEncodeSingle.new
221
- @multipart_composer = m || MimeEncodeMulti.new
222
- end
223
-
224
- attr :singlepart_composer
225
- attr :multipart_composer
226
-
227
- def exec( mail )
228
- if mail._builtin_multipart?
229
- then @multipart_composer
230
- else @singlepart_composer end.exec mail
231
- end
232
-
233
- end
234
-
235
-
236
- class MimeEncodeSingle
237
-
238
- def exec( mail )
239
- mail.mime_version = '1.0'
240
- b = mail.body
241
- if NKF.guess(b) != NKF::BINARY
242
- on_text b
243
- else
244
- on_binary b
245
- end
246
- end
247
-
248
- def on_text( body )
249
- mail.body = NKF.nkf('-j -m0', body)
250
- mail.set_content_type 'text', 'plain', {'charset' => 'iso-2022-jp'}
251
- mail.encoding = '7bit'
252
- end
253
-
254
- def on_binary( body )
255
- mail.body = [body].pack('m')
256
- mail.set_content_type 'application', 'octet-stream'
257
- mail.encoding = 'Base64'
258
- end
259
-
260
- end
261
-
262
-
263
- class MimeEncodeMulti
264
-
265
- def exec( mail, top = true )
266
- mail.mime_version = '1.0' if top
267
- mail.set_content_type 'multipart', 'mixed'
268
- e = encoding(nil)
269
- if e and not /\A(?:7bit|8bit|binary)\z/i === e
270
- raise ArgumentError,
271
- 'using C.T.Encoding with multipart mail is not permitted'
272
- end
273
- mail.parts.each do |m|
274
- exec m, false if m._builtin_multipart?
275
- end
276
- end
277
-
278
- end
279
-
280
- end # module TMail