actionmailer 2.3.5 → 2.3.6

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 (81) hide show
  1. data/CHANGELOG +8 -0
  2. data/MIT-LICENSE +1 -1
  3. data/Rakefile +1 -1
  4. data/lib/action_mailer.rb +1 -1
  5. data/lib/action_mailer/base.rb +2 -2
  6. data/lib/action_mailer/quoting.rb +1 -0
  7. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail.rb +1 -0
  8. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/Makefile +18 -0
  9. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/address.rb +4 -38
  10. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/attachments.rb +65 -0
  11. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/base64.rb +0 -0
  12. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/compat.rb +0 -0
  13. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/config.rb +0 -0
  14. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/core_extensions.rb +0 -0
  15. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/encode.rb +9 -0
  16. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/header.rb +4 -2
  17. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/index.rb +0 -0
  18. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/interface.rb +33 -1
  19. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/loader.rb +0 -0
  20. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/mail.rb +1 -1
  21. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/mailbox.rb +3 -2
  22. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/main.rb +0 -0
  23. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/mbox.rb +0 -0
  24. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/net.rb +3 -1
  25. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/obsolete.rb +0 -0
  26. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/parser.rb +1060 -0
  27. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/parser.y +416 -0
  28. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/port.rb +0 -0
  29. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/quoting.rb +47 -1
  30. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/require_arch.rb +0 -0
  31. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/scanner.rb +0 -0
  32. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/scanner_r.rb +2 -1
  33. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/stringio.rb +0 -0
  34. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/utils.rb +50 -25
  35. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/COPYING +504 -0
  36. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/README +12 -0
  37. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet.rb +67 -0
  38. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/big5freq.rb +927 -0
  39. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/big5prober.rb +42 -0
  40. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/chardistribution.rb +238 -0
  41. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/charsetgroupprober.rb +112 -0
  42. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/charsetprober.rb +75 -0
  43. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/codingstatemachine.rb +64 -0
  44. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/constants.rb +42 -0
  45. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/escprober.rb +89 -0
  46. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/escsm.rb +244 -0
  47. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/eucjpprober.rb +88 -0
  48. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/euckrfreq.rb +596 -0
  49. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/euckrprober.rb +42 -0
  50. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/euctwfreq.rb +430 -0
  51. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/euctwprober.rb +42 -0
  52. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/gb2312freq.rb +474 -0
  53. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/gb2312prober.rb +42 -0
  54. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/hebrewprober.rb +289 -0
  55. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/jisfreq.rb +570 -0
  56. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/jpcntx.rb +229 -0
  57. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langbulgarianmodel.rb +229 -0
  58. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langcyrillicmodel.rb +330 -0
  59. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langgreekmodel.rb +227 -0
  60. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langhebrewmodel.rb +202 -0
  61. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langhungarianmodel.rb +226 -0
  62. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langthaimodel.rb +201 -0
  63. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/latin1prober.rb +147 -0
  64. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/mbcharsetprober.rb +89 -0
  65. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/mbcsgroupprober.rb +45 -0
  66. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/mbcssm.rb +542 -0
  67. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/sbcharsetprober.rb +124 -0
  68. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/sbcsgroupprober.rb +56 -0
  69. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/sjisprober.rb +88 -0
  70. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/universaldetector.rb +168 -0
  71. data/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/utf8prober.rb +87 -0
  72. data/lib/action_mailer/vendor/{tmail-1.2.3 → tmail-1.2.7}/tmail/version.rb +1 -1
  73. data/lib/action_mailer/vendor/tmail.rb +2 -2
  74. data/lib/action_mailer/version.rb +1 -1
  75. data/test/abstract_unit.rb +1 -1
  76. data/test/fixtures/helpers/example_helper.rb +1 -1
  77. data/test/mail_service_test.rb +66 -2
  78. data/test/quoting_test.rb +10 -4
  79. metadata +87 -37
  80. data/lib/action_mailer/vendor/tmail-1.2.3/tmail/attachments.rb +0 -46
  81. data/lib/action_mailer/vendor/tmail-1.2.3/tmail/parser.rb +0 -1478
@@ -0,0 +1,416 @@
1
+ #
2
+ # parser.y
3
+ #
4
+ # Copyright (c) 1998-2007 Minero Aoki
5
+ #
6
+ # This program is free software.
7
+ # You can distribute/modify this program under the terms of
8
+ # the GNU Lesser General Public License version 2.1.
9
+ #
10
+
11
+ class TMail::Parser
12
+
13
+ options no_result_var
14
+
15
+ rule
16
+
17
+ content : DATETIME datetime { val[1] }
18
+ | RECEIVED received { val[1] }
19
+ | MADDRESS addrs_TOP { val[1] }
20
+ | RETPATH retpath { val[1] }
21
+ | KEYWORDS keys { val[1] }
22
+ | ENCRYPTED enc { val[1] }
23
+ | MIMEVERSION version { val[1] }
24
+ | CTYPE ctype { val[1] }
25
+ | CENCODING cencode { val[1] }
26
+ | CDISPOSITION cdisp { val[1] }
27
+ | ADDRESS addr_TOP { val[1] }
28
+ | MAILBOX mbox { val[1] }
29
+
30
+ datetime : day DIGIT ATOM DIGIT hour zone
31
+ # 0 1 2 3 4 5
32
+ # date month year
33
+ {
34
+ t = Time.gm(val[3].to_i, val[2], val[1].to_i, 0, 0, 0)
35
+ (t + val[4] - val[5]).localtime
36
+ }
37
+
38
+ day : /* none */
39
+ | ATOM ','
40
+
41
+ hour : DIGIT ':' DIGIT
42
+ {
43
+ (val[0].to_i * 60 * 60) +
44
+ (val[2].to_i * 60)
45
+ }
46
+ | DIGIT ':' DIGIT ':' DIGIT
47
+ {
48
+ (val[0].to_i * 60 * 60) +
49
+ (val[2].to_i * 60) +
50
+ (val[4].to_i)
51
+ }
52
+
53
+ zone : ATOM
54
+ {
55
+ timezone_string_to_unixtime(val[0])
56
+ }
57
+
58
+ received : from by via with id for received_datetime
59
+ {
60
+ val
61
+ }
62
+
63
+ from : /* none */
64
+ | FROM received_domain
65
+ {
66
+ val[1]
67
+ }
68
+
69
+ by : /* none */
70
+ | BY received_domain
71
+ {
72
+ val[1]
73
+ }
74
+
75
+ received_domain
76
+ : domain
77
+ {
78
+ join_domain(val[0])
79
+ }
80
+ | domain '@' domain
81
+ {
82
+ join_domain(val[2])
83
+ }
84
+ | domain DOMLIT
85
+ {
86
+ join_domain(val[0])
87
+ }
88
+
89
+ via : /* none */
90
+ | VIA ATOM
91
+ {
92
+ val[1]
93
+ }
94
+
95
+ with : /* none */
96
+ {
97
+ []
98
+ }
99
+ | with WITH ATOM
100
+ {
101
+ val[0].push val[2]
102
+ val[0]
103
+ }
104
+
105
+ id : /* none */
106
+ | ID msgid
107
+ {
108
+ val[1]
109
+ }
110
+ | ID ATOM
111
+ {
112
+ val[1]
113
+ }
114
+
115
+ for : /* none */
116
+ | FOR received_addrspec
117
+ {
118
+ val[1]
119
+ }
120
+
121
+ received_addrspec
122
+ : routeaddr
123
+ {
124
+ val[0].spec
125
+ }
126
+ | spec
127
+ {
128
+ val[0].spec
129
+ }
130
+
131
+ received_datetime
132
+ : /* none */
133
+ | ';' datetime
134
+ {
135
+ val[1]
136
+ }
137
+
138
+ addrs_TOP : addrs
139
+ | group_bare
140
+ | addrs commas group_bare
141
+
142
+ addr_TOP : mbox
143
+ | group
144
+ | group_bare
145
+
146
+ retpath : addrs_TOP
147
+ | '<' '>' { [ Address.new(nil, nil) ] }
148
+
149
+ addrs : addr
150
+ {
151
+ val
152
+ }
153
+ | addrs commas addr
154
+ {
155
+ val[0].push val[2]
156
+ val[0]
157
+ }
158
+
159
+ addr : mbox
160
+ | group
161
+
162
+ mboxes : mbox
163
+ {
164
+ val
165
+ }
166
+ | mboxes commas mbox
167
+ {
168
+ val[0].push val[2]
169
+ val[0]
170
+ }
171
+
172
+ mbox : spec
173
+ | routeaddr
174
+ | addr_phrase routeaddr
175
+ {
176
+ val[1].phrase = Decoder.decode(val[0])
177
+ val[1]
178
+ }
179
+
180
+ group : group_bare ';'
181
+
182
+ group_bare: addr_phrase ':' mboxes
183
+ {
184
+ AddressGroup.new(val[0], val[2])
185
+ }
186
+ | addr_phrase ':' { AddressGroup.new(val[0], []) }
187
+
188
+ addr_phrase
189
+ : local_head { val[0].join('.') }
190
+ | addr_phrase local_head { val[0] << ' ' << val[1].join('.') }
191
+
192
+ routeaddr : '<' routes spec '>'
193
+ {
194
+ val[2].routes.replace val[1]
195
+ val[2]
196
+ }
197
+ | '<' spec '>'
198
+ {
199
+ val[1]
200
+ }
201
+
202
+ routes : at_domains ':'
203
+
204
+ at_domains: '@' domain { [ val[1].join('.') ] }
205
+ | at_domains ',' '@' domain { val[0].push val[3].join('.'); val[0] }
206
+
207
+ spec : local '@' domain { Address.new( val[0], val[2] ) }
208
+ | local { Address.new( val[0], nil ) }
209
+
210
+ local: local_head
211
+ | local_head '.' { val[0].push ''; val[0] }
212
+
213
+ local_head: word
214
+ { val }
215
+ | local_head dots word
216
+ {
217
+ val[1].times do
218
+ val[0].push ''
219
+ end
220
+ val[0].push val[2]
221
+ val[0]
222
+ }
223
+
224
+ domain : domword
225
+ { val }
226
+ | domain dots domword
227
+ {
228
+ val[1].times do
229
+ val[0].push ''
230
+ end
231
+ val[0].push val[2]
232
+ val[0]
233
+ }
234
+
235
+ dots : '.' { 0 }
236
+ | dots '.' { val[0] + 1 }
237
+
238
+ word : atom
239
+ | QUOTED
240
+ | DIGIT
241
+
242
+ domword : atom
243
+ | DOMLIT
244
+ | DIGIT
245
+
246
+ commas : ','
247
+ | commas ','
248
+
249
+ msgid : '<' spec '>'
250
+ {
251
+ val[1] = val[1].spec
252
+ val.join('')
253
+ }
254
+
255
+ keys : phrase { val }
256
+ | keys ',' phrase { val[0].push val[2]; val[0] }
257
+
258
+ phrase : word
259
+ | phrase word { val[0] << ' ' << val[1] }
260
+
261
+ enc : word
262
+ {
263
+ val.push nil
264
+ val
265
+ }
266
+ | word word
267
+ {
268
+ val
269
+ }
270
+
271
+ version : DIGIT '.' DIGIT
272
+ {
273
+ [ val[0].to_i, val[2].to_i ]
274
+ }
275
+
276
+ ctype : TOKEN '/' TOKEN params opt_semicolon
277
+ {
278
+ [ val[0].downcase, val[2].downcase, decode_params(val[3]) ]
279
+ }
280
+ | TOKEN params opt_semicolon
281
+ {
282
+ [ val[0].downcase, nil, decode_params(val[1]) ]
283
+ }
284
+
285
+ params : /* none */
286
+ {
287
+ {}
288
+ }
289
+ | params ';' TOKEN '=' QUOTED
290
+ {
291
+ val[0][ val[2].downcase ] = ('"' + val[4].to_s + '"')
292
+ val[0]
293
+ }
294
+ | params ';' TOKEN '=' TOKEN
295
+ {
296
+ val[0][ val[2].downcase ] = val[4]
297
+ val[0]
298
+ }
299
+
300
+ cencode : TOKEN
301
+ {
302
+ val[0].downcase
303
+ }
304
+
305
+ cdisp : TOKEN params opt_semicolon
306
+ {
307
+ [ val[0].downcase, decode_params(val[1]) ]
308
+ }
309
+
310
+ opt_semicolon
311
+ :
312
+ | ';'
313
+
314
+ atom : ATOM
315
+ | FROM
316
+ | BY
317
+ | VIA
318
+ | WITH
319
+ | ID
320
+ | FOR
321
+
322
+ end
323
+
324
+
325
+ ---- header
326
+ #
327
+ # parser.rb
328
+ #
329
+ # Copyright (c) 1998-2007 Minero Aoki
330
+ #
331
+ # This program is free software.
332
+ # You can distribute/modify this program under the terms of
333
+ # the GNU Lesser General Public License version 2.1.
334
+ #
335
+
336
+ require 'tmail/scanner'
337
+ require 'tmail/utils'
338
+
339
+ ---- inner
340
+
341
+ include TextUtils
342
+
343
+ def self.parse( ident, str, cmt = nil )
344
+ str = special_quote_address(str) if ident.to_s =~ /M?ADDRESS/
345
+ new.parse(ident, str, cmt)
346
+ end
347
+
348
+ def self.special_quote_address(str) #:nodoc:
349
+ # Takes a string which is an address and adds quotation marks to special
350
+ # edge case methods that the RACC parser can not handle.
351
+ #
352
+ # Right now just handles two edge cases:
353
+ #
354
+ # Full stop as the last character of the display name:
355
+ # Mikel L. <mikel@me.com>
356
+ # Returns:
357
+ # "Mikel L." <mikel@me.com>
358
+ #
359
+ # Unquoted @ symbol in the display name:
360
+ # mikel@me.com <mikel@me.com>
361
+ # Returns:
362
+ # "mikel@me.com" <mikel@me.com>
363
+ #
364
+ # Any other address not matching these patterns just gets returned as is.
365
+ case
366
+ # This handles the missing "" in an older version of Apple Mail.app
367
+ # around the display name when the display name contains a '@'
368
+ # like 'mikel@me.com <mikel@me.com>'
369
+ # Just quotes it to: '"mikel@me.com" <mikel@me.com>'
370
+ when str =~ /\A([^"].+@.+[^"])\s(<.*?>)\Z/
371
+ return "\"#{$1}\" #{$2}"
372
+ # This handles cases where 'Mikel A. <mikel@me.com>' which is a trailing
373
+ # full stop before the address section. Just quotes it to
374
+ # '"Mikel A." <mikel@me.com>'
375
+ when str =~ /\A(.*?\.)\s(<.*?>)\s*\Z/
376
+ return "\"#{$1}\" #{$2}"
377
+ else
378
+ str
379
+ end
380
+ end
381
+
382
+ MAILP_DEBUG = false
383
+
384
+ def initialize
385
+ self.debug = MAILP_DEBUG
386
+ end
387
+
388
+ def debug=( flag )
389
+ @yydebug = flag && Racc_debug_parser
390
+ @scanner_debug = flag
391
+ end
392
+
393
+ def debug
394
+ @yydebug
395
+ end
396
+
397
+ def parse( ident, str, comments = nil )
398
+ @scanner = Scanner.new(str, ident, comments)
399
+ @scanner.debug = @scanner_debug
400
+ @first = [ident, ident]
401
+ result = yyparse(self, :parse_in)
402
+ comments.map! {|c| to_kcode(c) } if comments
403
+ result
404
+ end
405
+
406
+ private
407
+
408
+ def parse_in( &block )
409
+ yield @first
410
+ @scanner.scan(&block)
411
+ end
412
+
413
+ def on_error( t, val, vstack )
414
+ raise TMail::SyntaxError, "parse error on token #{racc_token2str t}"
415
+ end
416
+
@@ -10,7 +10,7 @@ module TMail
10
10
  end
11
11
 
12
12
  def unquoted_body(to_charset = 'utf-8')
13
- from_charset = sub_header("content-type", "charset")
13
+ from_charset = charset
14
14
  case (content_transfer_encoding || "7bit").downcase
15
15
  when "quoted-printable"
16
16
  # the default charset is set to iso-8859-1 instead of 'us-ascii'.
@@ -56,10 +56,29 @@ module TMail
56
56
  end
57
57
  end
58
58
 
59
+ class Attachment
60
+
61
+ include TextUtils
62
+
63
+ def quoted?(string)
64
+ !!((string =~ /.+'\w\w'.+/) || (string =~ /=\?.+\?.\?.+\?=/))
65
+ end
66
+
67
+ # Only unquote if quoted
68
+ def original_filename(to_charset = 'utf-8')
69
+ if quoted?(quoted_filename)
70
+ Unquoter.unquote_and_convert_to(quoted_filename, to_charset).chomp
71
+ else
72
+ quoted_filename
73
+ end
74
+ end
75
+ end
76
+
59
77
  class Unquoter
60
78
  class << self
61
79
  def unquote_and_convert_to(text, to_charset, from_charset = "iso-8859-1", preserve_underscores=false)
62
80
  return "" if text.nil?
81
+ text.gsub!(/\?=(\s*)=\?/, '?==?') # Remove whitespaces between 'encoded-word's
63
82
  text.gsub(/(.*?)(?:(?:=\?(.*?)\?(.)\?(.*?)\?=)|$)/) do
64
83
  before = $1
65
84
  from_charset = $2
@@ -82,6 +101,29 @@ module TMail
82
101
  end
83
102
  end
84
103
 
104
+ def convert_to_with_fallback_on_iso_8859_1(text, to, from)
105
+ return text if to == 'utf-8' and text.isutf8
106
+
107
+ if from.blank? and !text.is_binary_data?
108
+ from = CharDet.detect(text)['encoding']
109
+
110
+ # Chardet ususally detects iso-8859-2 (aka windows-1250), but the text is
111
+ # iso-8859-1 (aka windows-1252 and Latin1). http://en.wikipedia.org/wiki/ISO/IEC_8859-2
112
+ # This can cause unwanted characters, like ŕ instead of à.
113
+ # (I know, could be a very bad decision...)
114
+ from = 'iso-8859-1' if from =~ /iso-8859-2/i
115
+ end
116
+
117
+ begin
118
+ convert_to_without_fallback_on_iso_8859_1(text, to, from)
119
+ rescue Iconv::InvalidCharacter
120
+ unless from == 'iso-8859-1'
121
+ from = 'iso-8859-1'
122
+ retry
123
+ end
124
+ end
125
+ end
126
+
85
127
  def unquote_quoted_printable_and_convert_to(text, to, from, preserve_underscores=false)
86
128
  text = text.gsub(/_/, " ") unless preserve_underscores
87
129
  text = text.gsub(/\r\n|\r/, "\n") # normalize newlines
@@ -113,6 +155,10 @@ module TMail
113
155
  text
114
156
  end
115
157
  end
158
+
159
+ alias_method :convert_to_without_fallback_on_iso_8859_1, :convert_to
160
+ alias_method :convert_to, :convert_to_with_fallback_on_iso_8859_1
161
+
116
162
  end
117
163
  end
118
164
  end