I keep getting the following error when sending a simple e-mail via ActionMailer in Rails:
NoMethodError: undefined method `encode!' for "Hello":String
This is triggered whenever the following is run:
def hello_world_email() mail( :from => "me", :to => "you, :subject => "Hello World" ) end
From researching this, it looks like it's caused by the differences between Ruby 1.8.7 and 1.9.*, which has built-in character encoding support.
Is there any way of getting ActionMailer to work with Ruby 1.8.7 and avoid this issue? (I can upgrade Ruby on my machine, but I can't do the same for everyone else working on the project). Given that the whole of Rails 3.0.9 (of which ActionMailer is a part) is meant to work with Ruby 1.8.7, I keep thinking that there must be a way...
Note: My exact version of Ruby is
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0] (pre-installed on OSX).
You may have an issue with using Ruby 1.8 and having a constant Encoding defined by a gem. For example we found an issue with a class that was including REXML at a global scope.
The line in question in the library was:
value.encode!(charset) if defined?(Encoding) && charset
This is checking for a global constant called Encoding. (Which could be defined in any gem at global scope.) Our problem was actually the include which then made REXML::Encoding available everywhere as Encoding. You could try grepping or acking your codebase for "module Encoding" or "class Encoding".
Hope this helps.
The stack trace below defines the problem.
NoMethodError: undefined method `encode!' for "Generate":String mail (2.2.19) lib/mail/fields/unstructured_field.rb:169:in `encode' mail (2.2.19) lib/mail/fields/unstructured_field.rb:138:in `fold' mail (2.2.19) lib/mail/fields/unstructured_field.rb:108:in `wrapped_value' mail (2.2.19) lib/mail/fields/unstructured_field.rb:70:in `do_encode' mail (2.2.19) lib/mail/fields/unstructured_field.rb:52:in `encoded' mail (2.2.19) lib/mail/field.rb:123:in `send' mail (2.2.19) lib/mail/field.rb:123:in `method_missing' mail (2.2.19) lib/mail/header.rb:190:in `encoded' mail (2.2.19) lib/mail/header.rb:189:in `each' mail (2.2.19) lib/mail/header.rb:189:in `encoded' mail (2.2.19) lib/mail/message.rb:1708:in `encoded' actionmailer (3.0.10) lib/action_mailer/base.rb:445:in `set_payload_for_mail' actionmailer (3.0.10) lib/action_mailer/base.rb:425:in `deliver_mail' activesupport (3.0.10) lib/active_support/notifications.rb:52:in `instrument' activesupport (3.0.10) lib/active_support/notifications/instrumenter.rb:21:in `instrument' activesupport (3.0.10) lib/active_support/notifications.rb:52:in `instrument' actionmailer (3.0.10) lib/action_mailer/base.rb:424:in `deliver_mail' mail (2.2.19) lib/mail/message.rb:230:in `deliver'