aboutsummaryrefslogtreecommitdiffstats
path: root/actionmailer/lib/action_mailer/quoting.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionmailer/lib/action_mailer/quoting.rb')
-rw-r--r--actionmailer/lib/action_mailer/quoting.rb102
1 files changed, 102 insertions, 0 deletions
diff --git a/actionmailer/lib/action_mailer/quoting.rb b/actionmailer/lib/action_mailer/quoting.rb
new file mode 100644
index 0000000000..28c456f25d
--- /dev/null
+++ b/actionmailer/lib/action_mailer/quoting.rb
@@ -0,0 +1,102 @@
+module ActionMailer
+ module Quoting
+
+ # Convert the given text into quoted printable format, with an instruction
+ # that the text be eventually interpreted in the given charset.
+ def quoted_printable(text, charset)
+ text = text.gsub( /[^a-z ]/i ) { "=%02x" % $&[0] }.gsub( / /, "_" )
+ "=?#{charset}?Q?#{text}?="
+ end
+
+ # A quick-and-dirty regexp for determining whether a string contains any
+ # characters that need escaping.
+ CHARS_NEEDING_QUOTING = /[\000-\011\013\014\016-\037\177-\377]/
+
+ # Quote the given text if it contains any "illegal" characters
+ def quote_if_necessary(text, charset)
+ (text =~ CHARS_NEEDING_QUOTING) ?
+ quoted_printable(text, charset) :
+ text
+ end
+
+ # Quote any of the given strings if they contain any "illegal" characters
+ def quote_any_if_necessary(charset, *args)
+ args.map { |v| quote_if_necessary(v, charset) }
+ end
+
+ # Quote the given address if it needs to be. The address may be a
+ # regular email address, or it can be a phrase followed by an address in
+ # brackets. The phrase is the only part that will be quoted, and only if
+ # it needs to be. This allows extended characters to be used in the
+ # "to", "from", "cc", and "bcc" headers.
+ def quote_address_if_necessary(address, charset)
+ if Array === address
+ address.map { |a| quote_address_if_necessary(a, charset) }
+ elsif address =~ /^(\S.*)\s+(<.*>)$/
+ address = $2
+ phrase = quote_if_necessary($1.gsub(/^['"](.*)['"]$/, '\1'), charset)
+ "\"#{phrase}\" #{address}"
+ else
+ address
+ end
+ end
+
+ # Quote any of the given addresses, if they need to be.
+ def quote_any_address_if_necessary(charset, *args)
+ args.map { |v| quote_address_if_necessary(v, charset) }
+ end
+
+ end
+end
+module ActionMailer
+ module Quoting
+
+ # Convert the given text into quoted printable format, with an instruction
+ # that the text be eventually interpreted in the given charset.
+ def quoted_printable(text, charset)
+ text = text.gsub( /[^a-z ]/i ) { "=%02x" % $&[0] }.gsub( / /, "_" )
+ "=?#{charset}?Q?#{text}?="
+ end
+
+ # A quick-and-dirty regexp for determining whether a string contains any
+ # characters that need escaping.
+ if !defined?(CHARS_NEEDING_QUOTING)
+ CHARS_NEEDING_QUOTING = /[\000-\011\013\014\016-\037\177-\377]/
+ end
+
+ # Quote the given text if it contains any "illegal" characters
+ def quote_if_necessary(text, charset)
+ (text =~ CHARS_NEEDING_QUOTING) ?
+ quoted_printable(text, charset) :
+ text
+ end
+
+ # Quote any of the given strings if they contain any "illegal" characters
+ def quote_any_if_necessary(charset, *args)
+ args.map { |v| quote_if_necessary(v, charset) }
+ end
+
+ # Quote the given address if it needs to be. The address may be a
+ # regular email address, or it can be a phrase followed by an address in
+ # brackets. The phrase is the only part that will be quoted, and only if
+ # it needs to be. This allows extended characters to be used in the
+ # "to", "from", "cc", and "bcc" headers.
+ def quote_address_if_necessary(address, charset)
+ if Array === address
+ address.map { |a| quote_address_if_necessary(a, charset) }
+ elsif address =~ /^(\S.*)\s+(<.*>)$/
+ address = $2
+ phrase = quote_if_necessary($1.gsub(/^['"](.*)['"]$/, '\1'), charset)
+ "\"#{phrase}\" #{address}"
+ else
+ address
+ end
+ end
+
+ # Quote any of the given addresses, if they need to be.
+ def quote_any_address_if_necessary(charset, *args)
+ args.map { |v| quote_address_if_necessary(v, charset) }
+ end
+
+ end
+end