tmail 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. data/CHANGES +50 -5
  2. data/MANIFEST +188 -0
  3. data/NOTES +1 -1
  4. data/README +10 -4
  5. data/Rakefile +1 -10
  6. data/lib/tmail.rb +1 -0
  7. data/lib/tmail/Makefile +0 -1
  8. data/lib/tmail/address.rb +190 -17
  9. data/lib/tmail/attachments.rb +1 -1
  10. data/lib/tmail/base64.rb +4 -10
  11. data/lib/tmail/compat.rb +8 -6
  12. data/lib/tmail/config.rb +2 -6
  13. data/lib/tmail/core_extensions.rb +14 -18
  14. data/lib/tmail/encode.rb +47 -12
  15. data/lib/tmail/header.rb +7 -10
  16. data/lib/tmail/index.rb +2 -1
  17. data/lib/tmail/interface.rb +14 -12
  18. data/lib/tmail/loader.rb +2 -0
  19. data/lib/tmail/mail.rb +83 -24
  20. data/lib/tmail/mailbox.rb +70 -10
  21. data/lib/tmail/main.rb +2 -0
  22. data/lib/tmail/mbox.rb +2 -0
  23. data/lib/tmail/net.rb +16 -15
  24. data/lib/tmail/obsolete.rb +7 -12
  25. data/lib/tmail/parser.rb +1 -0
  26. data/lib/tmail/require_arch.rb +2 -0
  27. data/lib/tmail/scanner.rb +2 -1
  28. data/lib/tmail/scanner_r.rb +11 -10
  29. data/lib/tmail/utils.rb +83 -26
  30. data/lib/tmail/version.rb +3 -2
  31. data/log/BugTrackingLog.txt +1208 -0
  32. data/log/{ChangeLog.txt → Changelog-0.txt} +36 -0
  33. data/log/Changelog.txt +534 -0
  34. data/log/Testlog.txt +114 -0
  35. data/log/Todo.txt +0 -2
  36. data/meta/VERSION +1 -0
  37. data/meta/project.yaml +8 -5
  38. data/meta/unixname +1 -0
  39. data/setup.rb +1481 -0
  40. data/site/contributing/index.html +183 -0
  41. data/site/css/clean.css +27 -0
  42. data/site/css/layout.css +31 -0
  43. data/site/css/style.css +60 -0
  44. data/site/download/index.html +61 -0
  45. data/site/img/envelope.jpg +0 -0
  46. data/site/img/mailman.gif +0 -0
  47. data/site/img/stamp-sm.jpg +0 -0
  48. data/site/img/stamp.jpg +0 -0
  49. data/site/img/stampborder.jpg +0 -0
  50. data/site/img/tfire.jpg +0 -0
  51. data/site/img/tmail.png +0 -0
  52. data/site/index.html +270 -0
  53. data/site/js/jquery.js +31 -0
  54. data/site/log/Changelog.xsl +33 -0
  55. data/site/log/changelog.xml +1677 -0
  56. data/site/outdated/BUGS +3 -0
  57. data/site/outdated/DEPENDS +1 -0
  58. data/site/outdated/Incompatibilities +89 -0
  59. data/site/outdated/Incompatibilities.ja +102 -0
  60. data/site/outdated/NEWS +9 -0
  61. data/site/outdated/README.ja +73 -0
  62. data/site/outdated/doc.ja/address.html +275 -0
  63. data/site/outdated/doc.ja/basics.html +405 -0
  64. data/site/outdated/doc.ja/config.html +49 -0
  65. data/site/outdated/doc.ja/details.html +146 -0
  66. data/site/outdated/doc.ja/index.html +39 -0
  67. data/site/outdated/doc.ja/mail.html +793 -0
  68. data/site/outdated/doc.ja/mailbox.html +265 -0
  69. data/site/outdated/doc.ja/port.html +95 -0
  70. data/site/outdated/doc.ja/tmail.html +58 -0
  71. data/site/outdated/doc.ja/usage.html +202 -0
  72. data/site/outdated/rdd/address.rrd.m +229 -0
  73. data/site/outdated/rdd/basics.rd.m +275 -0
  74. data/site/outdated/rdd/config.rrd.m +26 -0
  75. data/site/outdated/rdd/details.rd.m +117 -0
  76. data/site/outdated/rdd/index.rhtml.m +54 -0
  77. data/site/outdated/rdd/mail.rrd.m +701 -0
  78. data/site/outdated/rdd/mailbox.rrd.m +228 -0
  79. data/site/outdated/rdd/port.rrd.m +69 -0
  80. data/site/outdated/rdd/tmail.rrd.m +33 -0
  81. data/site/outdated/rdd/usage.rd.m +247 -0
  82. data/site/quickstart/index.html +69 -0
  83. data/site/quickstart/quickstart.html +52 -0
  84. data/site/quickstart/usage.html +193 -0
  85. data/site/reference/address.html +247 -0
  86. data/site/reference/config.html +30 -0
  87. data/site/reference/index.html +101 -0
  88. data/site/reference/mail.html +726 -0
  89. data/site/reference/mailbox.html +245 -0
  90. data/site/reference/port.html +75 -0
  91. data/site/reference/tmail.html +35 -0
  92. data/test/fixtures/mailbox +405 -4
  93. data/test/fixtures/raw_email_multiple_from +30 -0
  94. data/test/kcode.rb +2 -2
  95. data/test/temp_test_one.rb +46 -0
  96. data/test/test_address.rb +77 -38
  97. data/test/test_encode.rb +0 -2
  98. data/test/test_header.rb +47 -24
  99. data/test/test_mail.rb +52 -9
  100. data/test/test_mbox.rb +28 -0
  101. data/test/test_port.rb +33 -27
  102. data/test/test_quote.rb +35 -8
  103. data/work/script/make +26 -0
  104. data/work/script/rdoc +39 -0
  105. data/{script → work/script}/setup +0 -0
  106. data/work/script/test +30 -0
  107. metadata +249 -184
  108. data/log/History.txt +0 -40
  109. data/meta/config.yaml +0 -8
  110. data/meta/icli.yaml +0 -16
  111. data/meta/tmail.roll +0 -3
  112. data/script/changelog +0 -19
  113. data/script/clobber/distclean +0 -8
  114. data/script/clobber/package +0 -10
  115. data/script/compile +0 -32
  116. data/script/pack/gem +0 -93
  117. data/script/pack/tgz +0 -41
  118. data/script/pack/zip +0 -41
  119. data/script/prepare +0 -15
  120. data/script/publish +0 -51
  121. data/script/rdoc +0 -42
  122. data/script/release +0 -10
  123. data/script/stamp +0 -33
  124. data/script/stats +0 -138
  125. data/script/tag +0 -25
  126. data/script/test +0 -36
@@ -1,6 +1,6 @@
1
1
  =begin rdoc
2
2
 
3
- = Attachment handling class
3
+ = Attachment handling file
4
4
 
5
5
  =end
6
6
 
@@ -1,9 +1,4 @@
1
- # = TITLE:
2
- #
3
- # Base64
4
- #
5
- # = COPYRIGHT:
6
- #
1
+ #--
7
2
  # Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
8
3
  #
9
4
  # Permission is hereby granted, free of charge, to any person obtaining
@@ -27,10 +22,9 @@
27
22
  #
28
23
  # Note: Originally licensed under LGPL v2+. Using MIT license for Rails
29
24
  # with permission of Minero Aoki.
30
-
31
- #
25
+ #++
26
+ #:stopdoc:
32
27
  module TMail
33
-
34
28
  module Base64
35
29
 
36
30
  module_function
@@ -48,5 +42,5 @@ module TMail
48
42
  end
49
43
 
50
44
  end
51
-
52
45
  end
46
+ #:startdoc:
@@ -1,17 +1,18 @@
1
- unless Enumerable.method_defined?(:map)
2
- module Enumerable
1
+ #:stopdoc:
2
+ unless Enumerable.method_defined?(:map)
3
+ module Enumerable #:nodoc:
3
4
  alias map collect
4
5
  end
5
6
  end
6
7
 
7
8
  unless Enumerable.method_defined?(:select)
8
- module Enumerable
9
+ module Enumerable #:nodoc:
9
10
  alias select find_all
10
11
  end
11
12
  end
12
13
 
13
14
  unless Enumerable.method_defined?(:reject)
14
- module Enumerable
15
+ module Enumerable #:nodoc:
15
16
  def reject
16
17
  result = []
17
18
  each do |i|
@@ -23,7 +24,7 @@ unless Enumerable.method_defined?(:reject)
23
24
  end
24
25
 
25
26
  unless Enumerable.method_defined?(:sort_by)
26
- module Enumerable
27
+ module Enumerable #:nodoc:
27
28
  def sort_by
28
29
  map {|i| [yield(i), i] }.sort.map {|val, i| i }
29
30
  end
@@ -31,9 +32,10 @@ unless Enumerable.method_defined?(:sort_by)
31
32
  end
32
33
 
33
34
  unless File.respond_to?(:read)
34
- def File.read(fname)
35
+ def File.read(fname) #:nodoc:
35
36
  File.open(fname) {|f|
36
37
  return f.read
37
38
  }
38
39
  end
39
40
  end
41
+ #:startdoc:
@@ -1,8 +1,3 @@
1
- =begin rdoc
2
-
3
- = Configuration Class
4
-
5
- =end
6
1
  #--
7
2
  # Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
8
3
  #
@@ -28,7 +23,7 @@
28
23
  # Note: Originally licensed under LGPL v2+. Using MIT license for Rails
29
24
  # with permission of Minero Aoki.
30
25
  #++
31
-
26
+ #:stopdoc:
32
27
  module TMail
33
28
 
34
29
  class Config
@@ -69,3 +64,4 @@ module TMail
69
64
  end
70
65
 
71
66
  end
67
+ #:startdoc:
@@ -1,14 +1,9 @@
1
- =begin rdoc
2
-
3
- = Ruby on Rails Core Extensions
4
-
5
- provides .blank?
6
-
7
- =end
8
- unless Object.respond_to?(:blank?) #:nodoc:
9
- # Check first to see if we are in a Rails environment, no need to
10
- # define these methods if we are
1
+ #:stopdoc:
2
+ unless Object.respond_to?(:blank?)
11
3
  class Object
4
+ # Check first to see if we are in a Rails environment, no need to
5
+ # define these methods if we are
6
+
12
7
  # An object is blank if it's nil, empty, or a whitespace string.
13
8
  # For example, "", " ", nil, [], and {} are blank.
14
9
  #
@@ -27,41 +22,42 @@ unless Object.respond_to?(:blank?) #:nodoc:
27
22
  end
28
23
  end
29
24
 
30
- class NilClass #:nodoc:
25
+ class NilClass
31
26
  def blank?
32
27
  true
33
28
  end
34
29
  end
35
30
 
36
- class FalseClass #:nodoc:
31
+ class FalseClass
37
32
  def blank?
38
33
  true
39
34
  end
40
35
  end
41
36
 
42
- class TrueClass #:nodoc:
37
+ class TrueClass
43
38
  def blank?
44
39
  false
45
40
  end
46
41
  end
47
42
 
48
- class Array #:nodoc:
43
+ class Array
49
44
  alias_method :blank?, :empty?
50
45
  end
51
46
 
52
- class Hash #:nodoc:
47
+ class Hash
53
48
  alias_method :blank?, :empty?
54
49
  end
55
50
 
56
- class String #:nodoc:
51
+ class String
57
52
  def blank?
58
53
  empty? || strip.empty?
59
54
  end
60
55
  end
61
56
 
62
- class Numeric #:nodoc:
57
+ class Numeric
63
58
  def blank?
64
59
  false
65
60
  end
66
61
  end
67
- end
62
+ end
63
+ #:startdoc:
@@ -1,7 +1,4 @@
1
- # = TITLE:
2
- #
3
- # Text Encoding class
4
- #
1
+ #--
5
2
  # = COPYRIGHT:
6
3
  #
7
4
  # Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
@@ -27,14 +24,22 @@
27
24
  #
28
25
  # Note: Originally licensed under LGPL v2+. Using MIT license for Rails
29
26
  # with permission of Minero Aoki.
30
-
27
+ #++
28
+ #:stopdoc:
31
29
  require 'nkf'
32
30
  require 'tmail/base64'
33
31
  require 'tmail/stringio'
34
32
  require 'tmail/utils'
33
+ #:startdoc:
35
34
 
36
35
 
37
36
  module TMail
37
+
38
+ #:stopdoc:
39
+ class << self
40
+ attr_accessor :KCODE
41
+ end
42
+ self.KCODE = 'NONE'
38
43
 
39
44
  module StrategyInterface
40
45
 
@@ -52,10 +57,34 @@ module TMail
52
57
  end
53
58
  module_function :create_dest
54
59
 
60
+ #:startdoc:
61
+ # Returns the TMail object encoded and ready to be sent via SMTP etc.
62
+ # You should call this before you are packaging up your email to
63
+ # correctly escape all the values that need escaping in the email, line
64
+ # wrap the email etc.
65
+ #
66
+ # It is also a good idea to call this before you marshal or serialize
67
+ # a TMail object.
68
+ #
69
+ # For Example:
70
+ #
71
+ # email = TMail::Load(my_email_file)
72
+ # email_to_send = email.encoded
55
73
  def encoded( eol = "\r\n", charset = 'j', dest = nil )
56
74
  accept_strategy Encoder, eol, charset, dest
57
75
  end
58
76
 
77
+ # Returns the TMail object decoded and ready to be used by you, your
78
+ # program etc.
79
+ #
80
+ # You should call this before you are packaging up your email to
81
+ # correctly escape all the values that need escaping in the email, line
82
+ # wrap the email etc.
83
+ #
84
+ # For Example:
85
+ #
86
+ # email = TMail::Load(my_email_file)
87
+ # email_to_send = email.encoded
59
88
  def decoded( eol = "\n", charset = 'e', dest = nil )
60
89
  # Turn the E-Mail into a string and return it with all
61
90
  # encoded characters decoded. alias for to_s
@@ -64,7 +93,7 @@ module TMail
64
93
 
65
94
  alias to_s decoded
66
95
 
67
- def accept_strategy( klass, eol, charset, dest = nil )
96
+ def accept_strategy( klass, eol, charset, dest = nil ) #:nodoc:
68
97
  dest ||= ''
69
98
  accept klass.new( create_dest(dest), charset, eol )
70
99
  dest
@@ -72,6 +101,7 @@ module TMail
72
101
 
73
102
  end
74
103
 
104
+ #:stopdoc:
75
105
 
76
106
  ###
77
107
  ### MIME B encoding decoder
@@ -90,8 +120,8 @@ module TMail
90
120
  }
91
121
 
92
122
  def self.decode( str, encoding = nil )
93
- encoding ||= (OUTPUT_ENCODING[$KCODE] || 'j')
94
- opt = '-m' + encoding
123
+ encoding ||= (OUTPUT_ENCODING[TMail.KCODE] || 'j')
124
+ opt = '-mS' + encoding
95
125
  str.gsub(ENCODED_WORDS) {|s| NKF.nkf(opt, s) }
96
126
  end
97
127
 
@@ -193,7 +223,7 @@ module TMail
193
223
 
194
224
  def initialize( dest = nil, encoding = nil, eol = "\r\n", limit = nil )
195
225
  @f = StrategyInterface.create_dest(dest)
196
- @opt = OPTIONS[$KCODE]
226
+ @opt = OPTIONS[TMail.KCODE]
197
227
  @eol = eol
198
228
  @folded = false
199
229
  @preserve_quotes = true
@@ -368,11 +398,16 @@ module TMail
368
398
  end
369
399
 
370
400
  def concat_A_S( types, strs )
401
+ if RUBY_VERSION < '1.9'
402
+ a = ?a; s = ?s
403
+ else
404
+ a = 'a'.ord; s = 's'.ord
405
+ end
371
406
  i = 0
372
407
  types.each_byte do |t|
373
408
  case t
374
- when ?a then add_text strs[i]
375
- when ?s then add_lwsp strs[i]
409
+ when a then add_text strs[i]
410
+ when s then add_lwsp strs[i]
376
411
  else
377
412
  raise "TMail FATAL: unknown flag: #{t.chr}"
378
413
  end
@@ -520,5 +555,5 @@ module TMail
520
555
  end
521
556
 
522
557
  end
523
-
558
+ #:startdoc:
524
559
  end # module TMail
@@ -1,11 +1,3 @@
1
- =begin rdoc
2
-
3
- = Header handling class
4
-
5
- =end
6
- # RFC #822 ftp://ftp.isi.edu/in-notes/rfc822.txt
7
- #
8
- #
9
1
  #--
10
2
  # Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
11
3
  #
@@ -38,9 +30,10 @@ require 'tmail/parser'
38
30
  require 'tmail/config'
39
31
  require 'tmail/utils'
40
32
 
41
-
33
+ #:startdoc:
42
34
  module TMail
43
35
 
36
+ # Provides methods to handle and manipulate headers in the email
44
37
  class HeaderField
45
38
 
46
39
  include TextUtils
@@ -214,7 +207,11 @@ module TMail
214
207
 
215
208
  def comments
216
209
  ensure_parsed
217
- @comments
210
+ if @comments[0]
211
+ [Decoder.decode(@comments[0])]
212
+ else
213
+ @comments
214
+ end
218
215
  end
219
216
 
220
217
  private
@@ -1,3 +1,4 @@
1
+ #:stopdoc:
1
2
  # This is here for Rolls.
2
3
  # Rolls uses this instead of lib/tmail.rb.
3
4
 
@@ -5,4 +6,4 @@ require 'tmail/version'
5
6
  require 'tmail/mail'
6
7
  require 'tmail/mailbox'
7
8
  require 'tmail/core_extensions'
8
-
9
+ #:startdoc:
@@ -966,31 +966,33 @@ module TMail
966
966
  end
967
967
  end
968
968
 
969
- # Destructively convert the Mail object's body into a Base64 encoded email
969
+ # Convert the Mail object's body into a Base64 encoded email
970
970
  # returning the modified Mail object
971
971
  def base64_encode!
972
972
  store 'Content-Transfer-Encoding', 'Base64'
973
- self.body = Base64.folding_encode(self.body)
973
+ self.body = base64_encode
974
974
  end
975
975
 
976
- # ==Depreciation warning
977
- # base64_encode will return the body encoded, not modify the message body in
978
- # future versions of TMail
979
- alias :base64_encode :base64_encode!
976
+ # Return the result of encoding the TMail::Mail object body
977
+ # without altering the current body
978
+ def base64_encode
979
+ Base64.folding_encode(self.body)
980
+ end
980
981
 
981
- # Destructively convert the Mail object's body into a Base64 decoded email
982
+ # Convert the Mail object's body into a Base64 decoded email
982
983
  # returning the modified Mail object
983
984
  def base64_decode!
984
985
  if /base64/i === self.transfer_encoding('')
985
986
  store 'Content-Transfer-Encoding', '8bit'
986
- self.body = Base64.decode(self.body, @config.strict_base64decode?)
987
+ self.body = base64_decode
987
988
  end
988
989
  end
989
990
 
990
- # ==Depreciation warning
991
- # base64_decode will return the body decoded, not modify the message body in
992
- # future versions of TMail
993
- alias :base64_decode :base64_decode!
991
+ # Returns the result of decoding the TMail::Mail object body
992
+ # without altering the current body
993
+ def base64_decode
994
+ Base64.decode(self.body, @config.strict_base64decode?)
995
+ end
994
996
 
995
997
  # Returns an array of each destination in the email message including to: cc: or bcc:
996
998
  #
@@ -1 +1,3 @@
1
+ #:stopdoc:
1
2
  require 'tmail/mailbox'
3
+ #:startdoc:
@@ -28,22 +28,7 @@
28
28
  # Note: Originally licensed under LGPL v2+. Using MIT license for Rails
29
29
  # with permission of Minero Aoki.
30
30
  #++
31
- # == TMail::Mail
32
- # === Class Methods
33
- #
34
- #
35
- #
36
- #
37
- #
38
- #
39
- #
40
- #
41
- #
42
- #
43
- #
44
- #
45
- #
46
- #
31
+
47
32
 
48
33
 
49
34
  require 'tmail/interface'
@@ -58,23 +43,89 @@ require 'socket'
58
43
 
59
44
  module TMail
60
45
 
46
+ # == Mail Class
47
+ #
48
+ # Accessing a TMail object done via the TMail::Mail class. As email can be fairly complex
49
+ # creatures, you will find a large amount of accessor and setter methods in this class!
50
+ #
51
+ # Most of the below methods handle the header, in fact, what TMail does best is handle the
52
+ # header of the email object. There are only a few methods that deal directly with the body
53
+ # of the email, such as base64_encode and base64_decode.
54
+ #
55
+ # === Using TMail inside your code
56
+ #
57
+ # The usual way is to install the gem (see the {README}[link:/README] on how to do this) and
58
+ # then put at the top of your class:
59
+ #
60
+ # require 'tmail'
61
+ #
62
+ # You can then create a new TMail object in your code with:
63
+ #
64
+ # @email = TMail::Mail.new
65
+ #
66
+ # Or if you have an email as a string, you can initialize a new TMail::Mail object and get it
67
+ # to parse that string for you like so:
68
+ #
69
+ # @email = TMail::Mail.parse(email_text)
70
+ #
71
+ # You can also read a single email off the disk, for example:
72
+ #
73
+ # @email = TMail::Mail.load('filename.txt')
74
+ #
75
+ # Also, you can read a mailbox (usual unix mbox format) and end up with an array of TMail
76
+ # objects by doing something like this:
77
+ #
78
+ # # Note, we pass true as the last variable to open the mailbox read only
79
+ # mailbox = TMail::UNIXMbox.new("mailbox", nil, true)
80
+ # @emails = []
81
+ # mailbox.each_port { |m| @emails << TMail::Mail.new(m) }
82
+ #
61
83
  class Mail
62
84
 
63
85
  class << self
86
+
87
+ # Opens an email that has been saved out as a file by itself.
88
+ #
89
+ # This function will read a file non-destructively and then parse
90
+ # the contents and return a TMail::Mail object.
91
+ #
92
+ # Does not handle multiple email mailboxes (like a unix mbox) for that
93
+ # use the TMail::UNIXMbox class.
94
+ #
95
+ # Example:
96
+ # mail = TMail::Mail.load('filename')
97
+ #
64
98
  def load( fname )
65
99
  new(FilePort.new(fname))
66
100
  end
67
101
 
68
102
  alias load_from load
69
103
  alias loadfrom load
70
-
104
+
105
+ # Parses an email from the supplied string and returns a TMail::Mail
106
+ # object.
107
+ #
108
+ # Example:
109
+ # require 'rubygems'; require 'tmail'
110
+ # email_string =<<HEREDOC
111
+ # To: mikel@lindsaar.net
112
+ # From: mikel@me.com
113
+ # Subject: This is a short Email
114
+ #
115
+ # Hello there Mikel!
116
+ #
117
+ # HEREDOC
118
+ # mail = TMail::Mail.parse(email_string)
119
+ # #=> #<TMail::Mail port=#<TMail::StringPort:id=0xa30ac0> bodyport=nil>
120
+ # mail.body
121
+ # #=> "Hello there Mikel!\n\n"
71
122
  def parse( str )
72
123
  new(StringPort.new(str))
73
124
  end
74
125
 
75
126
  end
76
127
 
77
- def initialize( port = nil, conf = DEFAULT_CONFIG )
128
+ def initialize( port = nil, conf = DEFAULT_CONFIG ) #:nodoc:
78
129
  @port = port || StringPort.new
79
130
  @config = Config.to_config(conf)
80
131
 
@@ -90,6 +141,12 @@ module TMail
90
141
  }
91
142
  end
92
143
 
144
+ # Provides access to the port this email is using to hold it's data
145
+ #
146
+ # Example:
147
+ # mail = TMail::Mail.parse(email_string)
148
+ # mail.port
149
+ # #=> #<TMail::StringPort:id=0xa2c952>
93
150
  attr_reader :port
94
151
 
95
152
  def inspect
@@ -395,10 +452,12 @@ module TMail
395
452
  end
396
453
 
397
454
  def quoted_body
398
- parse_body
399
- @body_port.ropen {|f|
400
- return f.read
401
- }
455
+ body_port.ropen {|f| return f.read }
456
+ end
457
+
458
+ def quoted_body= str
459
+ body_port.wopen { |f| f.write str }
460
+ str
402
461
  end
403
462
 
404
463
  def body=( str )
@@ -420,8 +479,8 @@ module TMail
420
479
  str
421
480
  end
422
481
 
423
- alias preamble body
424
- alias preamble= body=
482
+ alias preamble quoted_body
483
+ alias preamble= quoted_body=
425
484
 
426
485
  def epilogue
427
486
  parse_body