Monkey patch mail to handle character encodings on ruby 1.8
This commit is contained in:
parent
507882a576
commit
d405637b05
3 changed files with 69 additions and 5 deletions
3
Gemfile
3
Gemfile
|
@ -19,6 +19,9 @@ gem 'open_id_authentication', '>= 1.1.0'
|
||||||
gem 'validates_email_format_of', '>= 1.5.1'
|
gem 'validates_email_format_of', '>= 1.5.1'
|
||||||
gem 'composite_primary_keys', '>= 4.1.2'
|
gem 'composite_primary_keys', '>= 4.1.2'
|
||||||
|
|
||||||
|
# Character conversion support for ruby 1.8
|
||||||
|
gem 'iconv', :platforms => :ruby_18
|
||||||
|
|
||||||
# Load libxml support for XML parsing and generation
|
# Load libxml support for XML parsing and generation
|
||||||
gem 'libxml-ruby', '>= 2.0.5', :require => 'libxml'
|
gem 'libxml-ruby', '>= 2.0.5', :require => 'libxml'
|
||||||
|
|
||||||
|
|
12
Gemfile.lock
12
Gemfile.lock
|
@ -46,13 +46,14 @@ GEM
|
||||||
erubis (2.7.0)
|
erubis (2.7.0)
|
||||||
execjs (1.3.0)
|
execjs (1.3.0)
|
||||||
multi_json (~> 1.0)
|
multi_json (~> 1.0)
|
||||||
faraday (0.7.5)
|
faraday (0.7.6)
|
||||||
addressable (~> 2.2.6)
|
addressable (~> 2.2)
|
||||||
multipart-post (~> 1.1.3)
|
multipart-post (~> 1.1)
|
||||||
rack (>= 1.1.0, < 2)
|
rack (~> 1.1)
|
||||||
hike (1.2.1)
|
hike (1.2.1)
|
||||||
httpclient (2.2.4)
|
httpclient (2.2.4)
|
||||||
i18n (0.6.0)
|
i18n (0.6.0)
|
||||||
|
iconv (0.1)
|
||||||
jquery-rails (1.0.19)
|
jquery-rails (1.0.19)
|
||||||
railties (~> 3.0)
|
railties (~> 3.0)
|
||||||
thor (~> 0.14)
|
thor (~> 0.14)
|
||||||
|
@ -140,7 +141,7 @@ GEM
|
||||||
polyglot
|
polyglot
|
||||||
polyglot (>= 0.3.1)
|
polyglot (>= 0.3.1)
|
||||||
tzinfo (0.3.31)
|
tzinfo (0.3.31)
|
||||||
uglifier (1.2.2)
|
uglifier (1.2.3)
|
||||||
execjs (>= 0.3.0)
|
execjs (>= 0.3.0)
|
||||||
multi_json (>= 1.0.2)
|
multi_json (>= 1.0.2)
|
||||||
validates_email_format_of (1.5.3)
|
validates_email_format_of (1.5.3)
|
||||||
|
@ -154,6 +155,7 @@ DEPENDENCIES
|
||||||
composite_primary_keys (>= 4.1.2)
|
composite_primary_keys (>= 4.1.2)
|
||||||
dynamic_form
|
dynamic_form
|
||||||
httpclient
|
httpclient
|
||||||
|
iconv
|
||||||
jquery-rails
|
jquery-rails
|
||||||
libxml-ruby (>= 2.0.5)
|
libxml-ruby (>= 2.0.5)
|
||||||
memcache-client
|
memcache-client
|
||||||
|
|
59
config/initializers/mail.rb
Normal file
59
config/initializers/mail.rb
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
module Mail
|
||||||
|
class Ruby18
|
||||||
|
def Ruby18.b_value_decode(str)
|
||||||
|
match = str.match(/\=\?(.+)?\?[Bb]\?(.+)?\?\=/m)
|
||||||
|
if match
|
||||||
|
encoding = match[1]
|
||||||
|
str = Ruby18.decode_base64(match[2])
|
||||||
|
require 'iconv'
|
||||||
|
str = Iconv.conv("UTF-8//TRANSLIT//IGNORE", encoding, str)
|
||||||
|
end
|
||||||
|
str
|
||||||
|
end
|
||||||
|
|
||||||
|
def Ruby18.q_value_decode(str)
|
||||||
|
match = str.match(/\=\?(.+)?\?[Qq]\?(.+)?\?\=/m)
|
||||||
|
if match
|
||||||
|
encoding = match[1]
|
||||||
|
str = Encodings::QuotedPrintable.decode(match[2].gsub(/_/, '=20'))
|
||||||
|
require 'iconv'
|
||||||
|
str = Iconv.conv("UTF-8//TRANSLIT//IGNORE", encoding, str)
|
||||||
|
end
|
||||||
|
str
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Message
|
||||||
|
def decoded_with_text
|
||||||
|
if self.text?
|
||||||
|
decode_body_as_text
|
||||||
|
else
|
||||||
|
decoded_without_text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
alias_method_chain :decoded, :text
|
||||||
|
|
||||||
|
def text?
|
||||||
|
has_content_type? ? !!(main_type =~ /^text$/i) : false
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def decode_body_as_text
|
||||||
|
body_text = body.decoded
|
||||||
|
if charset
|
||||||
|
if RUBY_VERSION < '1.9'
|
||||||
|
require 'iconv'
|
||||||
|
return Iconv.conv("UTF-8//TRANSLIT//IGNORE", charset, body_text)
|
||||||
|
else
|
||||||
|
if encoding = Encoding.find(charset) rescue nil
|
||||||
|
body_text.force_encoding(encoding)
|
||||||
|
return body_text.encode(Encoding::UTF_8)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
body_text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Add table
Reference in a new issue