]> git.cworth.org Git - sup/commitdiff
mime-encode utf8 addressess and subjects in outgoing mail
authorWilliam Morgan <wmorgan-sup@masanjin.net>
Wed, 20 May 2009 00:27:22 +0000 (20:27 -0400)
committerWilliam Morgan <wmorgan-sup@masanjin.net>
Wed, 20 May 2009 00:38:36 +0000 (20:38 -0400)
Based heavily on a patch from Helge Titlestad <helgedt@tihlde.org>.

lib/sup/modes/edit-message-mode.rb

index bbf956bcb1d340e8863f145cf38527bb63faa749..d423d91a185d99e0adfee072412efba8f0e00d2a 100644 (file)
@@ -2,6 +2,7 @@ require 'tempfile'
 require 'socket' # just for gethostname!
 require 'pathname'
 require 'rmail'
+require 'jcode' # for RE_UTF8
 
 module Redwood
 
@@ -170,6 +171,29 @@ EOS
 
 protected
 
+  def mime_encode string
+    string = [string].pack('M') # basic quoted-printable
+    string.gsub!(/=\n/,'')      # .. remove trailing newline
+    string.gsub!(/_/,'=96')     # .. encode underscores
+    string.gsub!(/\?/,'=3F')    # .. encode question marks
+    string.gsub!(/ /,'_')       # .. translate space to underscores
+    "=?utf-8?q?#{string}?="
+  end
+
+  def mime_encode_subject string
+    return string unless string.match(String::RE_UTF8)
+    mime_encode string
+  end
+
+  RE_ADDRESS = /(.+)( <.*@.*>)/
+
+  # Encode "bælammet mitt <user@example.com>" into
+  # "=?utf-8?q?b=C3=A6lammet_mitt?= <user@example.com>
+  def mime_encode_address string
+    return string unless string.match(String::RE_UTF8)
+    string.sub(RE_ADDRESS) { |match| mime_encode($1) + $2 }
+  end
+
   def move_cursor_left
     if curpos < @selectors.length
       @selectors[curpos].roll_left
@@ -335,14 +359,16 @@ protected
       m.header[k] = 
         case v
         when String
-          v
+          k.match(/subject/i) ? mime_encode_subject(v) : mime_encode_address(v)
         when Array
-          v.join ", "
+          v.map { |v| mime_encode_address v }.join ", "
         end
     end
+
     m.header["Date"] = date.rfc2822
     m.header["Message-Id"] = @message_id
     m.header["User-Agent"] = "Sup/#{Redwood::VERSION}"
+    m.header["Content-Transfer-Encoding"] = '8bit'
     m
   end