force_encoding according to the charset in mail, this solve encoding problem when not using ‘utf-8’ charset.

This commit is contained in:
Herb Jiang 2014-01-17 10:24:32 +08:00
parent 653d66ff70
commit 5fa464e10b
3 changed files with 21 additions and 4 deletions

View File

@ -57,21 +57,27 @@ module Email
if @message.multipart?
@message.parts.each do |p|
if p.content_type =~ /text\/plain/
@body = p.body.to_s
@body = p.charset ? p.body.decoded.force_encoding(p.charset).encode("UTF-8").to_s : p.body.to_s
return @body
elsif p.content_type =~ /text\/html/
html = p.body.to_s
html = p.charset ? p.body.decoded.force_encoding(p.charset).encode("UTF-8").to_s : p.body.to_s
end
end
end
html = @message.body.to_s if @message.content_type =~ /text\/html/
if @message.content_type =~ /text\/html/
if defined? @message.charset
html = @message.body.decoded.force_encoding(@message.charset).encode("UTF-8").to_s
else
html = @message.body.to_s
end
end
if html.present?
@body = scrub_html(html)
return @body
end
@body = @message.body.to_s.strip
@body = @message.charset ? @message.body.decoded.force_encoding(@message.charset).encode("UTF-8").to_s.strip : @message.body.to_s
# Certain trigger phrases that means we didn't parse correctly
@body = nil if @body =~ /Content\-Type\:/ ||

View File

@ -73,6 +73,17 @@ stripped from my reply?")
end
end
describe "It supports a non UTF-8 reply" do
let(:big5) { File.read("#{Rails.root}/spec/fixtures/emails/big5.eml") }
let(:receiver) { Email::Receiver.new(big5) }
it "processes correctly" do
I18n.expects(:t).with('user_notifications.previous_discussion').returns('媽!我上電視了!')
receiver.process
expect(receiver.body).to eq("媽!我上電視了!")
end
end
describe "via" do
let(:wrote) { File.read("#{Rails.root}/spec/fixtures/emails/via_line.eml") }
let(:receiver) { Email::Receiver.new(wrote) }

BIN
spec/fixtures/emails/big5.eml vendored Normal file

Binary file not shown.