emailengine-app 2.61.1 → 2.61.3

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 (136) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/data/google-crawlers.json +1 -1
  3. package/lib/account/account-state.js +248 -0
  4. package/lib/account.js +45 -193
  5. package/lib/api-routes/account-routes.js +1023 -0
  6. package/lib/api-routes/message-routes.js +1377 -0
  7. package/lib/consts.js +12 -2
  8. package/lib/email-client/base-client.js +282 -771
  9. package/lib/email-client/gmail/gmail-api.js +243 -0
  10. package/lib/email-client/gmail-client.js +145 -53
  11. package/lib/email-client/imap/mailbox.js +24 -698
  12. package/lib/email-client/imap/sync-operations.js +812 -0
  13. package/lib/email-client/imap-client.js +1 -1
  14. package/lib/email-client/message-builder.js +566 -0
  15. package/lib/email-client/notification-handler.js +314 -0
  16. package/lib/email-client/outlook/graph-api.js +326 -0
  17. package/lib/email-client/outlook-client.js +159 -113
  18. package/lib/email-client/smtp-pool-manager.js +196 -0
  19. package/lib/imapproxy/imap-server.js +3 -12
  20. package/lib/oauth/gmail.js +4 -4
  21. package/lib/oauth/mail-ru.js +30 -5
  22. package/lib/oauth/outlook.js +57 -3
  23. package/lib/oauth/pubsub/google.js +30 -11
  24. package/lib/oauth/scope-checker.js +202 -0
  25. package/lib/oauth2-apps.js +8 -4
  26. package/lib/redis-operations.js +484 -0
  27. package/lib/routes-ui.js +283 -2582
  28. package/lib/tools.js +4 -196
  29. package/lib/ui-routes/account-routes.js +1931 -0
  30. package/lib/ui-routes/admin-config-routes.js +1233 -0
  31. package/lib/ui-routes/admin-entities-routes.js +2367 -0
  32. package/lib/ui-routes/oauth-routes.js +992 -0
  33. package/lib/utils/network.js +237 -0
  34. package/package.json +10 -10
  35. package/sbom.json +1 -1
  36. package/static/js/app.js +5 -5
  37. package/static/licenses.html +79 -19
  38. package/translations/de.mo +0 -0
  39. package/translations/de.po +97 -86
  40. package/translations/en.mo +0 -0
  41. package/translations/en.po +80 -75
  42. package/translations/et.mo +0 -0
  43. package/translations/et.po +96 -86
  44. package/translations/fr.mo +0 -0
  45. package/translations/fr.po +97 -86
  46. package/translations/ja.mo +0 -0
  47. package/translations/ja.po +96 -86
  48. package/translations/messages.pot +105 -91
  49. package/translations/nl.mo +0 -0
  50. package/translations/nl.po +98 -86
  51. package/translations/pl.mo +0 -0
  52. package/translations/pl.po +96 -86
  53. package/views/account/security.hbs +4 -4
  54. package/views/accounts/account.hbs +13 -13
  55. package/views/accounts/register/imap-server.hbs +12 -12
  56. package/views/config/document-store/pre-processing/index.hbs +4 -2
  57. package/views/config/oauth/app.hbs +6 -7
  58. package/views/config/oauth/index.hbs +2 -2
  59. package/views/config/service.hbs +3 -4
  60. package/views/dashboard.hbs +5 -7
  61. package/views/error.hbs +22 -7
  62. package/views/gateways/gateway.hbs +2 -2
  63. package/views/partials/add_account_modal.hbs +7 -10
  64. package/views/partials/document_store_header.hbs +1 -1
  65. package/views/partials/editor_scope_info.hbs +0 -1
  66. package/views/partials/oauth_config_header.hbs +1 -1
  67. package/views/partials/side_menu.hbs +3 -3
  68. package/views/partials/webhook_form.hbs +2 -2
  69. package/views/templates/index.hbs +1 -1
  70. package/views/templates/template.hbs +8 -8
  71. package/views/tokens/index.hbs +6 -6
  72. package/views/tokens/new.hbs +1 -1
  73. package/views/webhooks/index.hbs +4 -4
  74. package/views/webhooks/webhook.hbs +7 -7
  75. package/workers/api.js +148 -2436
  76. package/workers/smtp.js +2 -1
  77. package/lib/imapproxy/imap-core/test/client.js +0 -46
  78. package/lib/imapproxy/imap-core/test/fixtures/append.eml +0 -1196
  79. package/lib/imapproxy/imap-core/test/fixtures/chunks.js +0 -44
  80. package/lib/imapproxy/imap-core/test/fixtures/fix1.eml +0 -6
  81. package/lib/imapproxy/imap-core/test/fixtures/fix2.eml +0 -599
  82. package/lib/imapproxy/imap-core/test/fixtures/fix3.eml +0 -32
  83. package/lib/imapproxy/imap-core/test/fixtures/fix4.eml +0 -6
  84. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.eml +0 -599
  85. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.js +0 -2740
  86. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.json +0 -1411
  87. package/lib/imapproxy/imap-core/test/fixtures/mimetree.js +0 -85
  88. package/lib/imapproxy/imap-core/test/fixtures/nodemailer.eml +0 -582
  89. package/lib/imapproxy/imap-core/test/fixtures/ryan_finnie_mime_torture.eml +0 -599
  90. package/lib/imapproxy/imap-core/test/fixtures/simple.eml +0 -42
  91. package/lib/imapproxy/imap-core/test/fixtures/simple.json +0 -164
  92. package/lib/imapproxy/imap-core/test/imap-compile-stream-test.js +0 -671
  93. package/lib/imapproxy/imap-core/test/imap-compiler-test.js +0 -272
  94. package/lib/imapproxy/imap-core/test/imap-indexer-test.js +0 -236
  95. package/lib/imapproxy/imap-core/test/imap-parser-test.js +0 -922
  96. package/lib/imapproxy/imap-core/test/memory-notifier.js +0 -129
  97. package/lib/imapproxy/imap-core/test/prepare.sh +0 -74
  98. package/lib/imapproxy/imap-core/test/protocol-test.js +0 -1756
  99. package/lib/imapproxy/imap-core/test/search-test.js +0 -1356
  100. package/lib/imapproxy/imap-core/test/test-client.js +0 -152
  101. package/lib/imapproxy/imap-core/test/test-server.js +0 -623
  102. package/lib/imapproxy/imap-core/test/tools-test.js +0 -22
  103. package/test/api-test.js +0 -899
  104. package/test/autoreply-test.js +0 -327
  105. package/test/bounce-test.js +0 -151
  106. package/test/complaint-test.js +0 -256
  107. package/test/fixtures/autoreply/LICENSE +0 -27
  108. package/test/fixtures/autoreply/rfc3834-01.eml +0 -23
  109. package/test/fixtures/autoreply/rfc3834-02.eml +0 -24
  110. package/test/fixtures/autoreply/rfc3834-03.eml +0 -26
  111. package/test/fixtures/autoreply/rfc3834-04.eml +0 -48
  112. package/test/fixtures/autoreply/rfc3834-05.eml +0 -19
  113. package/test/fixtures/autoreply/rfc3834-06.eml +0 -59
  114. package/test/fixtures/bounces/163.eml +0 -2521
  115. package/test/fixtures/bounces/fastmail.eml +0 -242
  116. package/test/fixtures/bounces/gmail.eml +0 -252
  117. package/test/fixtures/bounces/hotmail.eml +0 -655
  118. package/test/fixtures/bounces/mailru.eml +0 -121
  119. package/test/fixtures/bounces/outlook.eml +0 -1107
  120. package/test/fixtures/bounces/postfix.eml +0 -101
  121. package/test/fixtures/bounces/rambler.eml +0 -116
  122. package/test/fixtures/bounces/workmail.eml +0 -142
  123. package/test/fixtures/bounces/yahoo.eml +0 -139
  124. package/test/fixtures/bounces/zoho.eml +0 -83
  125. package/test/fixtures/bounces/zonemta.eml +0 -100
  126. package/test/fixtures/complaints/LICENSE +0 -27
  127. package/test/fixtures/complaints/amazonses.eml +0 -72
  128. package/test/fixtures/complaints/dmarc.eml +0 -59
  129. package/test/fixtures/complaints/hotmail.eml +0 -49
  130. package/test/fixtures/complaints/optout.eml +0 -40
  131. package/test/fixtures/complaints/standard-arf.eml +0 -68
  132. package/test/fixtures/complaints/yahoo.eml +0 -68
  133. package/test/oauth2-apps-test.js +0 -301
  134. package/test/sendonly-test.js +0 -160
  135. package/test/test-config.js +0 -34
  136. package/test/webhooks-server.js +0 -39
@@ -1,1411 +0,0 @@
1
- {
2
- "childNodes": [{
3
- "header": [
4
- "Content-Type: text/plain; CHARSET=US-ASCII",
5
- "Content-Transfer-Encoding: 8bit"
6
- ],
7
- "parsedHeader": {
8
- "content-transfer-encoding": "8bit",
9
- "content-type": {
10
- "value": "text/plain",
11
- "type": "text",
12
- "subtype": "plain",
13
- "params": {
14
- "charset": "US-ASCII"
15
- },
16
- "hasParams": true
17
- }
18
- },
19
- "body": "Welcome to Ryan Finnie's MIME torture test. This message was designed\r\nto introduce a couple of the newer features of MIME-aware MUAs, features\r\nthat have come around since the days of the original MIME torture test.\r\n\r\nJust to be clear, this message SUPPLEMENTS the original torture test,\r\nnot replaces it. The original test is still very much valid these days,\r\nand new MUAs should strive to first pass the original test, then this\r\none.\r\n\r\nBy the way, the message/rfc822 parts have Content-Descriptions\r\ncontaining Futurama quotes. Bonus points if the MUA display these\r\nsomewhere.\r\n\r\nHave fun!\r\n\r\nRyan Finnie\r\n",
20
- "multipart": false,
21
- "boundary": false,
22
- "lineCount": 17,
23
- "size": 617
24
- }, {
25
- "header": [
26
- "Content-Disposition: inline",
27
- "Content-Description: I'll be whatever I wanna do. --Fry",
28
- "Content-Type: message/rfc822"
29
- ],
30
- "parsedHeader": {
31
- "content-type": {
32
- "value": "message/rfc822",
33
- "type": "message",
34
- "subtype": "rfc822",
35
- "params": {}
36
- },
37
- "content-description": "I'll be whatever I wanna do. --Fry",
38
- "content-disposition": {
39
- "value": "inline",
40
- "type": "inline",
41
- "subtype": "",
42
- "params": {}
43
- }
44
- },
45
- "body": "Subject: plain jane message\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nMessage-Id: <1066973156.4264.42.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 22:25:56 -0700\r\nContent-Type: text/plain; CHARSET=US-ASCII\r\nContent-Transfer-Encoding: 8bit\r\n\r\nSubject: plain jane message\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: text/plain\r\nMessage-Id: <1066973156.4264.42.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 22:25:56 -0700\r\nContent-Transfer-Encoding: 7bit\r\n\r\nThis is a plain text/plain message. Nothing fancy here...",
46
- "multipart": false,
47
- "boundary": false,
48
- "message": {
49
- "header": [
50
- "Subject: plain jane message",
51
- "From: Ryan Finnie <rfinnie@domain.dom>",
52
- "To: bob@domain.dom",
53
- "Message-Id: <1066973156.4264.42.camel@localhost>",
54
- "Mime-Version: 1.0",
55
- "Date: 23 Oct 2003 22:25:56 -0700",
56
- "Content-Type: text/plain; CHARSET=US-ASCII",
57
- "Content-Transfer-Encoding: 8bit"
58
- ],
59
- "parsedHeader": {
60
- "content-transfer-encoding": "8bit",
61
- "content-type": {
62
- "value": "text/plain",
63
- "type": "text",
64
- "subtype": "plain",
65
- "params": {
66
- "charset": "US-ASCII"
67
- },
68
- "hasParams": true
69
- },
70
- "date": "23 Oct 2003 22:25:56 -0700",
71
- "mime-version": "1.0",
72
- "message-id": "<1066973156.4264.42.camel@localhost>",
73
- "to": [{
74
- "address": "bob@domain.dom",
75
- "name": ""
76
- }],
77
- "from": [{
78
- "address": "rfinnie@domain.dom",
79
- "name": "Ryan Finnie"
80
- }],
81
- "subject": "plain jane message"
82
- },
83
- "body": "Subject: plain jane message\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: text/plain\r\nMessage-Id: <1066973156.4264.42.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 22:25:56 -0700\r\nContent-Transfer-Encoding: 7bit\r\n\r\nThis is a plain text/plain message. Nothing fancy here...",
84
- "multipart": false,
85
- "boundary": false,
86
- "lineCount": 10,
87
- "size": 311
88
- },
89
- "lineCount": 19,
90
- "size": 582
91
- }, {
92
- "header": [
93
- "Content-Disposition: inline",
94
- "Content-Description: Would you kindly shut your noise-hole? --Bender",
95
- "Content-Type: message/rfc822"
96
- ],
97
- "parsedHeader": {
98
- "content-type": {
99
- "value": "message/rfc822",
100
- "type": "message",
101
- "subtype": "rfc822",
102
- "params": {}
103
- },
104
- "content-description": "Would you kindly shut your noise-hole? --Bender",
105
- "content-disposition": {
106
- "value": "inline",
107
- "type": "inline",
108
- "subtype": "",
109
- "params": {}
110
- }
111
- },
112
- "body": "Subject: messages inside messages inside...\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: multipart/mixed; boundary=\"=-9Brg7LoMERBrIDtMRose\"\r\nMessage-Id: <1066976111.4263.74.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 23:15:11 -0700\r\n\r\n\r\n--=-9Brg7LoMERBrIDtMRose\r\nContent-Type: text/plain; CHARSET=US-ASCII\r\nContent-Transfer-Encoding: 8bit\r\n\r\nWhile a message/rfc822 part inside another message/rfc822 part in a\r\nmessage isn't too strange, 200 iterations of that would be. The MUA\r\nshould have some sense when to stop looping through.\r\n\r\n--=-9Brg7LoMERBrIDtMRose\r\nContent-Disposition: inline\r\nContent-Description: At the risk of sounding negative, no. --Leela\r\nContent-Type: message/rfc822\r\n\r\nSubject: the original message\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: multipart/mixed; boundary=\"=-XFYecI7w+0shpolXq8bb\"\r\nMessage-Id: <1066975745.4263.70.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 23:09:05 -0700\r\n\r\n\r\n--=-XFYecI7w+0shpolXq8bb\r\nContent-Type: text/plain; CHARSET=US-ASCII\r\nContent-Transfer-Encoding: 8bit\r\n\r\nby this point, I should be the 3rd layer deep!\r\n\r\nI also have an attachment.\r\n\r\n--=-XFYecI7w+0shpolXq8bb\r\nContent-Disposition: attachment; filename=foo.gz\r\nContent-Transfer-Encoding: base64\r\nContent-Type: application/x-gzip; NAME=foo.gz\r\n\r\nH4sIAOHBmD8AA4vML1XPyVHISy1LLVJIy8xLUchNVeQCAHbe764WAAAA\r\n\r\n--=-XFYecI7w+0shpolXq8bb--\r\n\r\n--=-9Brg7LoMERBrIDtMRose--\r\n",
113
- "multipart": false,
114
- "boundary": false,
115
- "message": {
116
- "childNodes": [{
117
- "header": [
118
- "Content-Type: text/plain; CHARSET=US-ASCII",
119
- "Content-Transfer-Encoding: 8bit"
120
- ],
121
- "parsedHeader": {
122
- "content-transfer-encoding": "8bit",
123
- "content-type": {
124
- "value": "text/plain",
125
- "type": "text",
126
- "subtype": "plain",
127
- "params": {
128
- "charset": "US-ASCII"
129
- },
130
- "hasParams": true
131
- }
132
- },
133
- "body": "While a message/rfc822 part inside another message/rfc822 part in a\r\nmessage isn't too strange, 200 iterations of that would be. The MUA\r\nshould have some sense when to stop looping through.\r\n",
134
- "multipart": false,
135
- "boundary": false,
136
- "lineCount": 4,
137
- "size": 193
138
- }, {
139
- "header": [
140
- "Content-Disposition: inline",
141
- "Content-Description: At the risk of sounding negative, no. --Leela",
142
- "Content-Type: message/rfc822"
143
- ],
144
- "parsedHeader": {
145
- "content-type": {
146
- "value": "message/rfc822",
147
- "type": "message",
148
- "subtype": "rfc822",
149
- "params": {}
150
- },
151
- "content-description": "At the risk of sounding negative, no. --Leela",
152
- "content-disposition": {
153
- "value": "inline",
154
- "type": "inline",
155
- "subtype": "",
156
- "params": {}
157
- }
158
- },
159
- "body": "Subject: the original message\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: multipart/mixed; boundary=\"=-XFYecI7w+0shpolXq8bb\"\r\nMessage-Id: <1066975745.4263.70.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 23:09:05 -0700\r\n\r\n\r\n--=-XFYecI7w+0shpolXq8bb\r\nContent-Type: text/plain; CHARSET=US-ASCII\r\nContent-Transfer-Encoding: 8bit\r\n\r\nby this point, I should be the 3rd layer deep!\r\n\r\nI also have an attachment.\r\n\r\n--=-XFYecI7w+0shpolXq8bb\r\nContent-Disposition: attachment; filename=foo.gz\r\nContent-Transfer-Encoding: base64\r\nContent-Type: application/x-gzip; NAME=foo.gz\r\n\r\nH4sIAOHBmD8AA4vML1XPyVHISy1LLVJIy8xLUchNVeQCAHbe764WAAAA\r\n\r\n--=-XFYecI7w+0shpolXq8bb--\r\n",
160
- "multipart": false,
161
- "boundary": false,
162
- "message": {
163
- "childNodes": [{
164
- "header": [
165
- "Content-Type: text/plain; CHARSET=US-ASCII",
166
- "Content-Transfer-Encoding: 8bit"
167
- ],
168
- "parsedHeader": {
169
- "content-transfer-encoding": "8bit",
170
- "content-type": {
171
- "value": "text/plain",
172
- "type": "text",
173
- "subtype": "plain",
174
- "params": {
175
- "charset": "US-ASCII"
176
- },
177
- "hasParams": true
178
- }
179
- },
180
- "body": "by this point, I should be the 3rd layer deep!\r\n\r\nI also have an attachment.\r\n",
181
- "multipart": false,
182
- "boundary": false,
183
- "lineCount": 4,
184
- "size": 78
185
- }, {
186
- "header": [
187
- "Content-Disposition: attachment; filename=foo.gz",
188
- "Content-Transfer-Encoding: base64",
189
- "Content-Type: application/x-gzip; NAME=foo.gz"
190
- ],
191
- "parsedHeader": {
192
- "content-type": {
193
- "value": "application/x-gzip",
194
- "type": "application",
195
- "subtype": "x-gzip",
196
- "params": {
197
- "name": "foo.gz"
198
- },
199
- "hasParams": true
200
- },
201
- "content-transfer-encoding": "base64",
202
- "content-disposition": {
203
- "value": "attachment",
204
- "type": "attachment",
205
- "subtype": "",
206
- "params": {
207
- "filename": "foo.gz"
208
- },
209
- "hasParams": true
210
- }
211
- },
212
- "body": "H4sIAOHBmD8AA4vML1XPyVHISy1LLVJIy8xLUchNVeQCAHbe764WAAAA\r\n",
213
- "multipart": false,
214
- "boundary": false,
215
- "lineCount": 2,
216
- "size": 58
217
- }],
218
- "header": [
219
- "Subject: the original message",
220
- "From: Ryan Finnie <rfinnie@domain.dom>",
221
- "To: bob@domain.dom",
222
- "Content-Type: multipart/mixed; boundary=\"=-XFYecI7w+0shpolXq8bb\"",
223
- "Message-Id: <1066975745.4263.70.camel@localhost>",
224
- "Mime-Version: 1.0",
225
- "Date: 23 Oct 2003 23:09:05 -0700"
226
- ],
227
- "parsedHeader": {
228
- "date": "23 Oct 2003 23:09:05 -0700",
229
- "mime-version": "1.0",
230
- "message-id": "<1066975745.4263.70.camel@localhost>",
231
- "content-type": {
232
- "value": "multipart/mixed",
233
- "type": "multipart",
234
- "subtype": "mixed",
235
- "params": {
236
- "boundary": "=-XFYecI7w+0shpolXq8bb"
237
- },
238
- "hasParams": true
239
- },
240
- "to": [{
241
- "address": "bob@domain.dom",
242
- "name": ""
243
- }],
244
- "from": [{
245
- "address": "rfinnie@domain.dom",
246
- "name": "Ryan Finnie"
247
- }],
248
- "subject": "the original message"
249
- },
250
- "body": "\r\n",
251
- "multipart": "mixed",
252
- "boundary": "=-XFYecI7w+0shpolXq8bb",
253
- "lineCount": 2,
254
- "size": 2
255
- },
256
- "lineCount": 26,
257
- "size": 697
258
- }],
259
- "header": [
260
- "Subject: messages inside messages inside...",
261
- "From: Ryan Finnie <rfinnie@domain.dom>",
262
- "To: bob@domain.dom",
263
- "Content-Type: multipart/mixed; boundary=\"=-9Brg7LoMERBrIDtMRose\"",
264
- "Message-Id: <1066976111.4263.74.camel@localhost>",
265
- "Mime-Version: 1.0",
266
- "Date: 23 Oct 2003 23:15:11 -0700"
267
- ],
268
- "parsedHeader": {
269
- "date": "23 Oct 2003 23:15:11 -0700",
270
- "mime-version": "1.0",
271
- "message-id": "<1066976111.4263.74.camel@localhost>",
272
- "content-type": {
273
- "value": "multipart/mixed",
274
- "type": "multipart",
275
- "subtype": "mixed",
276
- "params": {
277
- "boundary": "=-9Brg7LoMERBrIDtMRose"
278
- },
279
- "hasParams": true
280
- },
281
- "to": [{
282
- "address": "bob@domain.dom",
283
- "name": ""
284
- }],
285
- "from": [{
286
- "address": "rfinnie@domain.dom",
287
- "name": "Ryan Finnie"
288
- }],
289
- "subject": "messages inside messages inside..."
290
- },
291
- "body": "\r\n",
292
- "multipart": "mixed",
293
- "boundary": "=-9Brg7LoMERBrIDtMRose",
294
- "lineCount": 2,
295
- "size": 2
296
- },
297
- "lineCount": 50,
298
- "size": 1460
299
- }, {
300
- "header": [
301
- "Content-Disposition: inline",
302
- "Content-Description: Dirt doesn't need luck! --Professor",
303
- "Content-Type: message/rfc822"
304
- ],
305
- "parsedHeader": {
306
- "content-type": {
307
- "value": "message/rfc822",
308
- "type": "message",
309
- "subtype": "rfc822",
310
- "params": {}
311
- },
312
- "content-description": "Dirt doesn't need luck! --Professor",
313
- "content-disposition": {
314
- "value": "inline",
315
- "type": "inline",
316
- "subtype": "",
317
- "params": {}
318
- }
319
- },
320
- "body": "Subject: this message JUST contains an attachment\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Disposition: attachment; filename=blah.gz\r\nContent-Transfer-Encoding: base64\r\nContent-Description: Attachment has identical content to above foo.gz\r\nMessage-Id: <1066974048.4264.62.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 22:40:49 -0700\r\nContent-Type: application/x-gzip; NAME=blah.gz\r\n\r\nSubjectthismessageJUSTcontainsanattachmentFromRyanFinnierfinniedomaindomTobo\r\nbdomaindomContentDispositionattachmentfilenameAblahgzContentTypeapplication/\r\nxgzipnameAblahgzContentTransferEncodingbase64ContentDescriptionAttachmenthas\r\nidenticalcontenttoabovefoogzMessageId1066974048426462camellocalhostMimeVersi\r\non10Date23Oct20032240490700H4sIAOHBmD8AA4vML1XPyVHISy1LLVJIy8xLUchNVeQCAHbe7\r\n64WA\r\n",
321
- "multipart": false,
322
- "boundary": false,
323
- "message": {
324
- "header": [
325
- "Subject: this message JUST contains an attachment",
326
- "From: Ryan Finnie <rfinnie@domain.dom>",
327
- "To: bob@domain.dom",
328
- "Content-Disposition: attachment; filename=blah.gz",
329
- "Content-Transfer-Encoding: base64",
330
- "Content-Description: Attachment has identical content to above foo.gz",
331
- "Message-Id: <1066974048.4264.62.camel@localhost>",
332
- "Mime-Version: 1.0",
333
- "Date: 23 Oct 2003 22:40:49 -0700",
334
- "Content-Type: application/x-gzip; NAME=blah.gz"
335
- ],
336
- "parsedHeader": {
337
- "content-type": {
338
- "value": "application/x-gzip",
339
- "type": "application",
340
- "subtype": "x-gzip",
341
- "params": {
342
- "name": "blah.gz"
343
- },
344
- "hasParams": true
345
- },
346
- "date": "23 Oct 2003 22:40:49 -0700",
347
- "mime-version": "1.0",
348
- "message-id": "<1066974048.4264.62.camel@localhost>",
349
- "content-description": "Attachment has identical content to above foo.gz",
350
- "content-transfer-encoding": "base64",
351
- "content-disposition": {
352
- "value": "attachment",
353
- "type": "attachment",
354
- "subtype": "",
355
- "params": {
356
- "filename": "blah.gz"
357
- },
358
- "hasParams": true
359
- },
360
- "to": [{
361
- "address": "bob@domain.dom",
362
- "name": ""
363
- }],
364
- "from": [{
365
- "address": "rfinnie@domain.dom",
366
- "name": "Ryan Finnie"
367
- }],
368
- "subject": "this message JUST contains an attachment"
369
- },
370
- "body": "SubjectthismessageJUSTcontainsanattachmentFromRyanFinnierfinniedomaindomTobo\r\nbdomaindomContentDispositionattachmentfilenameAblahgzContentTypeapplication/\r\nxgzipnameAblahgzContentTransferEncodingbase64ContentDescriptionAttachmenthas\r\nidenticalcontenttoabovefoogzMessageId1066974048426462camellocalhostMimeVersi\r\non10Date23Oct20032240490700H4sIAOHBmD8AA4vML1XPyVHISy1LLVJIy8xLUchNVeQCAHbe7\r\n64WA\r\n",
371
- "multipart": false,
372
- "boundary": false,
373
- "lineCount": 7,
374
- "size": 396
375
- },
376
- "lineCount": 18,
377
- "size": 817
378
- }, {
379
- "header": [
380
- "Content-Disposition: inline",
381
- "Content-Description: Hold still, I don't have good depth perception! --Leela",
382
- "Content-Type: message/rfc822"
383
- ],
384
- "parsedHeader": {
385
- "content-type": {
386
- "value": "message/rfc822",
387
- "type": "message",
388
- "subtype": "rfc822",
389
- "params": {}
390
- },
391
- "content-description": "Hold still, I don't have good depth perception! --Leela",
392
- "content-disposition": {
393
- "value": "inline",
394
- "type": "inline",
395
- "subtype": "",
396
- "params": {}
397
- }
398
- },
399
- "body": "Subject: Attachment filename vs. name\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: multipart/mixed; boundary=\"=-1066975756jd02\"\r\nMessage-Id: <1066975756.4263.70.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 23:09:16 -0700\r\n\r\n\r\n--=-1066975756jd02\r\nContent-Type: text/plain; CHARSET=US-ASCII\r\nContent-Transfer-Encoding: 8bit\r\n\r\nIn this message's attachment, the Content-Disposition has a\r\nfilename of blah1.gz, while the Content-Type has a name of\r\nblah2.gz. What should be done? Well, since this is an attachment\r\n(as indicated in the Content-Disposition), the MUA should\r\nsuggest a filename of blah1.gz. The MUA *COULD* find a way to\r\nrepresent the name of blah2.gz somewhere else, it's not needed.\r\n\r\n--=-1066975756jd02\r\nContent-Disposition: attachment; filename=blah1.gz\r\nContent-Transfer-Encoding: base64\r\nContent-Description: filename is blah1.gz, name is blah2.gz\r\nContent-Type: application/x-gzip; NAME=blah2.gz\r\n\r\nH4sIAOHBmD8AA4vML1XPyVHISy1LLVJIy8xLUchNVeQCAHbe764WAAAA\r\n\r\n--=-1066975756jd02--\r\n",
400
- "multipart": false,
401
- "boundary": false,
402
- "message": {
403
- "childNodes": [{
404
- "header": [
405
- "Content-Type: text/plain; CHARSET=US-ASCII",
406
- "Content-Transfer-Encoding: 8bit"
407
- ],
408
- "parsedHeader": {
409
- "content-transfer-encoding": "8bit",
410
- "content-type": {
411
- "value": "text/plain",
412
- "type": "text",
413
- "subtype": "plain",
414
- "params": {
415
- "charset": "US-ASCII"
416
- },
417
- "hasParams": true
418
- }
419
- },
420
- "body": "In this message's attachment, the Content-Disposition has a\r\nfilename of blah1.gz, while the Content-Type has a name of\r\nblah2.gz. What should be done? Well, since this is an attachment\r\n(as indicated in the Content-Disposition), the MUA should\r\nsuggest a filename of blah1.gz. The MUA *COULD* find a way to\r\nrepresent the name of blah2.gz somewhere else, it's not needed.\r\n",
421
- "multipart": false,
422
- "boundary": false,
423
- "lineCount": 7,
424
- "size": 377
425
- }, {
426
- "header": [
427
- "Content-Disposition: attachment; filename=blah1.gz",
428
- "Content-Transfer-Encoding: base64",
429
- "Content-Description: filename is blah1.gz, name is blah2.gz",
430
- "Content-Type: application/x-gzip; NAME=blah2.gz"
431
- ],
432
- "parsedHeader": {
433
- "content-type": {
434
- "value": "application/x-gzip",
435
- "type": "application",
436
- "subtype": "x-gzip",
437
- "params": {
438
- "name": "blah2.gz"
439
- },
440
- "hasParams": true
441
- },
442
- "content-description": "filename is blah1.gz, name is blah2.gz",
443
- "content-transfer-encoding": "base64",
444
- "content-disposition": {
445
- "value": "attachment",
446
- "type": "attachment",
447
- "subtype": "",
448
- "params": {
449
- "filename": "blah1.gz"
450
- },
451
- "hasParams": true
452
- }
453
- },
454
- "body": "H4sIAOHBmD8AA4vML1XPyVHISy1LLVJIy8xLUchNVeQCAHbe764WAAAA\r\n",
455
- "multipart": false,
456
- "boundary": false,
457
- "lineCount": 2,
458
- "size": 58
459
- }],
460
- "header": [
461
- "Subject: Attachment filename vs. name",
462
- "From: Ryan Finnie <rfinnie@domain.dom>",
463
- "To: bob@domain.dom",
464
- "Content-Type: multipart/mixed; boundary=\"=-1066975756jd02\"",
465
- "Message-Id: <1066975756.4263.70.camel@localhost>",
466
- "Mime-Version: 1.0",
467
- "Date: 23 Oct 2003 23:09:16 -0700"
468
- ],
469
- "parsedHeader": {
470
- "date": "23 Oct 2003 23:09:16 -0700",
471
- "mime-version": "1.0",
472
- "message-id": "<1066975756.4263.70.camel@localhost>",
473
- "content-type": {
474
- "value": "multipart/mixed",
475
- "type": "multipart",
476
- "subtype": "mixed",
477
- "params": {
478
- "boundary": "=-1066975756jd02"
479
- },
480
- "hasParams": true
481
- },
482
- "to": [{
483
- "address": "bob@domain.dom",
484
- "name": ""
485
- }],
486
- "from": [{
487
- "address": "rfinnie@domain.dom",
488
- "name": "Ryan Finnie"
489
- }],
490
- "subject": "Attachment filename vs. name"
491
- },
492
- "body": "\r\n",
493
- "multipart": "mixed",
494
- "boundary": "=-1066975756jd02",
495
- "lineCount": 2,
496
- "size": 2
497
- },
498
- "lineCount": 30,
499
- "size": 1045
500
- }, {
501
- "header": [
502
- "Content-Disposition: inline",
503
- "Content-Description: Hello little man. I WILL DESTROY YOU! --Moro",
504
- "Content-Type: message/rfc822"
505
- ],
506
- "parsedHeader": {
507
- "content-type": {
508
- "value": "message/rfc822",
509
- "type": "message",
510
- "subtype": "rfc822",
511
- "params": {}
512
- },
513
- "content-description": "Hello little man. I WILL DESTROY YOU! --Moro",
514
- "content-disposition": {
515
- "value": "inline",
516
- "type": "inline",
517
- "subtype": "",
518
- "params": {}
519
- }
520
- },
521
- "body": "Subject: No filename? No problem!\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: multipart/mixed; boundary=\"=-1066975756jd03\"\r\nMessage-Id: <1066975761.4263.70.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 23:09:21 -0700\r\n\r\n\r\n--=-1066975756jd03\r\nContent-Type: text/plain; CHARSET=US-ASCII\r\nContent-Transfer-Encoding: 8bit\r\n\r\nWhen searching for a suitable name to suggest for a filename,\r\nthe MUA should probably follow this order. First, look for\r\nContent-Disposition's filename attribute. If that is missing,\r\nlook for Content-Type's file attribute. If that is also missing,\r\nI would recomment taking the Content-Description, stripping off\r\nany characters that cannot be used in a filename, and suggesting\r\nthat.\r\n\r\nIf none of those fields are available, the MUA could just make\r\nup a random filename. SOMETHING is better than nothing.\r\n\r\n--=-1066975756jd03\r\nContent-Disposition: attachment\r\nContent-Transfer-Encoding: base64\r\nContent-Description: I'm getting sick of witty things to say\r\nContent-Type: application/x-gzip\r\n\r\nH4sIAOHBmD8AA4vML1XPyVHISy1LLVJIy8xLUchNVeQCAHbe764WAAAA\r\n\r\n--=-1066975756jd03--\r\n",
522
- "multipart": false,
523
- "boundary": false,
524
- "message": {
525
- "childNodes": [{
526
- "header": [
527
- "Content-Type: text/plain; CHARSET=US-ASCII",
528
- "Content-Transfer-Encoding: 8bit"
529
- ],
530
- "parsedHeader": {
531
- "content-transfer-encoding": "8bit",
532
- "content-type": {
533
- "value": "text/plain",
534
- "type": "text",
535
- "subtype": "plain",
536
- "params": {
537
- "charset": "US-ASCII"
538
- },
539
- "hasParams": true
540
- }
541
- },
542
- "body": "When searching for a suitable name to suggest for a filename,\r\nthe MUA should probably follow this order. First, look for\r\nContent-Disposition's filename attribute. If that is missing,\r\nlook for Content-Type's file attribute. If that is also missing,\r\nI would recomment taking the Content-Description, stripping off\r\nany characters that cannot be used in a filename, and suggesting\r\nthat.\r\n\r\nIf none of those fields are available, the MUA could just make\r\nup a random filename. SOMETHING is better than nothing.\r\n",
543
- "multipart": false,
544
- "boundary": false,
545
- "lineCount": 11,
546
- "size": 517
547
- }, {
548
- "header": [
549
- "Content-Disposition: attachment",
550
- "Content-Transfer-Encoding: base64",
551
- "Content-Description: I'm getting sick of witty things to say",
552
- "Content-Type: application/x-gzip"
553
- ],
554
- "parsedHeader": {
555
- "content-type": {
556
- "value": "application/x-gzip",
557
- "type": "application",
558
- "subtype": "x-gzip",
559
- "params": {}
560
- },
561
- "content-description": "I'm getting sick of witty things to say",
562
- "content-transfer-encoding": "base64",
563
- "content-disposition": {
564
- "value": "attachment",
565
- "type": "attachment",
566
- "subtype": "",
567
- "params": {}
568
- }
569
- },
570
- "body": "H4sIAOHBmD8AA4vML1XPyVHISy1LLVJIy8xLUchNVeQCAHbe764WAAAA\r\n",
571
- "multipart": false,
572
- "boundary": false,
573
- "lineCount": 2,
574
- "size": 58
575
- }],
576
- "header": [
577
- "Subject: No filename? No problem!",
578
- "From: Ryan Finnie <rfinnie@domain.dom>",
579
- "To: bob@domain.dom",
580
- "Content-Type: multipart/mixed; boundary=\"=-1066975756jd03\"",
581
- "Message-Id: <1066975761.4263.70.camel@localhost>",
582
- "Mime-Version: 1.0",
583
- "Date: 23 Oct 2003 23:09:21 -0700"
584
- ],
585
- "parsedHeader": {
586
- "date": "23 Oct 2003 23:09:21 -0700",
587
- "mime-version": "1.0",
588
- "message-id": "<1066975761.4263.70.camel@localhost>",
589
- "content-type": {
590
- "value": "multipart/mixed",
591
- "type": "multipart",
592
- "subtype": "mixed",
593
- "params": {
594
- "boundary": "=-1066975756jd03"
595
- },
596
- "hasParams": true
597
- },
598
- "to": [{
599
- "address": "bob@domain.dom",
600
- "name": ""
601
- }],
602
- "from": [{
603
- "address": "rfinnie@domain.dom",
604
- "name": "Ryan Finnie"
605
- }],
606
- "subject": "No filename? No problem!"
607
- },
608
- "body": "\r\n",
609
- "multipart": "mixed",
610
- "boundary": "=-1066975756jd03",
611
- "lineCount": 2,
612
- "size": 2
613
- },
614
- "lineCount": 34,
615
- "size": 1149
616
- }, {
617
- "header": [
618
- "Content-Disposition: inline",
619
- "Content-Description: Friends! Help! A guinea pig tricked me! --Zoidberg",
620
- "Content-Type: message/rfc822"
621
- ],
622
- "parsedHeader": {
623
- "content-type": {
624
- "value": "message/rfc822",
625
- "type": "message",
626
- "subtype": "rfc822",
627
- "params": {}
628
- },
629
- "content-description": "Friends! Help! A guinea pig tricked me! --Zoidberg",
630
- "content-disposition": {
631
- "value": "inline",
632
- "type": "inline",
633
- "subtype": "",
634
- "params": {}
635
- }
636
- },
637
- "body": "Subject: html and text, both inline\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: multipart/mixed; boundary=\"=-ZCKMfHzvHMyK1iBu4kff\"\r\nMessage-Id: <1066974044.4264.62.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 22:40:45 -0700\r\n\r\n\r\n--=-ZCKMfHzvHMyK1iBu4kff\r\nContent-Type: text/html; CHARSET=utf-8\r\nContent-Transfer-Encoding: 8bit\r\n\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\r\n<HTML>\r\n<HEAD>\r\n <META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; CHARSET=UTF-8\">\r\n <META NAME=\"GENERATOR\" CONTENT=\"GtkHTML/1.1.10\">\r\n</HEAD>\r\n<BODY>\r\n<FONT COLOR=\"#f8cc00\">This is the HTML part.</FONT><BR>\r\nIt should be displayed inline.\r\n</BODY>\r\n</HTML>\r\n\r\n--=-ZCKMfHzvHMyK1iBu4kff\r\nContent-Type: text/plain; CHARSET=US-ASCII\r\nContent-Transfer-Encoding: 8bit\r\n\r\nThis is the text part.\r\nIt should ALSO be displayed inline.\r\n\r\n--=-ZCKMfHzvHMyK1iBu4kff--\r\n",
638
- "multipart": false,
639
- "boundary": false,
640
- "message": {
641
- "childNodes": [{
642
- "header": [
643
- "Content-Type: text/html; CHARSET=utf-8",
644
- "Content-Transfer-Encoding: 8bit"
645
- ],
646
- "parsedHeader": {
647
- "content-transfer-encoding": "8bit",
648
- "content-type": {
649
- "value": "text/html",
650
- "type": "text",
651
- "subtype": "html",
652
- "params": {
653
- "charset": "utf-8"
654
- },
655
- "hasParams": true
656
- }
657
- },
658
- "body": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\r\n<HTML>\r\n<HEAD>\r\n <META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; CHARSET=UTF-8\">\r\n <META NAME=\"GENERATOR\" CONTENT=\"GtkHTML/1.1.10\">\r\n</HEAD>\r\n<BODY>\r\n<FONT COLOR=\"#f8cc00\">This is the HTML part.</FONT><BR>\r\nIt should be displayed inline.\r\n</BODY>\r\n</HTML>\r\n",
659
- "multipart": false,
660
- "boundary": false,
661
- "lineCount": 12,
662
- "size": 327
663
- }, {
664
- "header": [
665
- "Content-Type: text/plain; CHARSET=US-ASCII",
666
- "Content-Transfer-Encoding: 8bit"
667
- ],
668
- "parsedHeader": {
669
- "content-transfer-encoding": "8bit",
670
- "content-type": {
671
- "value": "text/plain",
672
- "type": "text",
673
- "subtype": "plain",
674
- "params": {
675
- "charset": "US-ASCII"
676
- },
677
- "hasParams": true
678
- }
679
- },
680
- "body": "This is the text part.\r\nIt should ALSO be displayed inline.\r\n",
681
- "multipart": false,
682
- "boundary": false,
683
- "lineCount": 3,
684
- "size": 61
685
- }],
686
- "header": [
687
- "Subject: html and text, both inline",
688
- "From: Ryan Finnie <rfinnie@domain.dom>",
689
- "To: bob@domain.dom",
690
- "Content-Type: multipart/mixed; boundary=\"=-ZCKMfHzvHMyK1iBu4kff\"",
691
- "Message-Id: <1066974044.4264.62.camel@localhost>",
692
- "Mime-Version: 1.0",
693
- "Date: 23 Oct 2003 22:40:45 -0700"
694
- ],
695
- "parsedHeader": {
696
- "date": "23 Oct 2003 22:40:45 -0700",
697
- "mime-version": "1.0",
698
- "message-id": "<1066974044.4264.62.camel@localhost>",
699
- "content-type": {
700
- "value": "multipart/mixed",
701
- "type": "multipart",
702
- "subtype": "mixed",
703
- "params": {
704
- "boundary": "=-ZCKMfHzvHMyK1iBu4kff"
705
- },
706
- "hasParams": true
707
- },
708
- "to": [{
709
- "address": "bob@domain.dom",
710
- "name": ""
711
- }],
712
- "from": [{
713
- "address": "rfinnie@domain.dom",
714
- "name": "Ryan Finnie"
715
- }],
716
- "subject": "html and text, both inline"
717
- },
718
- "body": "\r\n",
719
- "multipart": "mixed",
720
- "boundary": "=-ZCKMfHzvHMyK1iBu4kff",
721
- "lineCount": 2,
722
- "size": 2
723
- },
724
- "lineCount": 34,
725
- "size": 896
726
- }, {
727
- "header": [
728
- "Content-Disposition: inline",
729
- "Content-Description: Smeesh! --Amy",
730
- "Content-Type: message/rfc822"
731
- ],
732
- "parsedHeader": {
733
- "content-type": {
734
- "value": "message/rfc822",
735
- "type": "message",
736
- "subtype": "rfc822",
737
- "params": {}
738
- },
739
- "content-description": "Smeesh! --Amy",
740
- "content-disposition": {
741
- "value": "inline",
742
- "type": "inline",
743
- "subtype": "",
744
- "params": {}
745
- }
746
- },
747
- "body": "Subject: text and text, both inline\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: multipart/mixed; boundary=\"=-pNc4wtlOIxs8RcX7H/AK\"\r\nMessage-Id: <1066974089.4265.64.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 22:41:29 -0700\r\n\r\n\r\n--=-pNc4wtlOIxs8RcX7H/AK\r\nContent-Type: text/plain; CHARSET=US-ASCII\r\nContent-Transfer-Encoding: 8bit\r\n\r\nThis is the first text part.\r\nIt should be displayed inline.\r\n\r\n--=-pNc4wtlOIxs8RcX7H/AK\r\nContent-Type: text/plain; CHARSET=US-ASCII\r\nContent-Transfer-Encoding: 8bit\r\n\r\nThis is the second text part.\r\nIt should also be displayed inline.\r\n\r\n--=-pNc4wtlOIxs8RcX7H/AK--\r\n",
748
- "multipart": false,
749
- "boundary": false,
750
- "message": {
751
- "childNodes": [{
752
- "header": [
753
- "Content-Type: text/plain; CHARSET=US-ASCII",
754
- "Content-Transfer-Encoding: 8bit"
755
- ],
756
- "parsedHeader": {
757
- "content-transfer-encoding": "8bit",
758
- "content-type": {
759
- "value": "text/plain",
760
- "type": "text",
761
- "subtype": "plain",
762
- "params": {
763
- "charset": "US-ASCII"
764
- },
765
- "hasParams": true
766
- }
767
- },
768
- "body": "This is the first text part.\r\nIt should be displayed inline.\r\n",
769
- "multipart": false,
770
- "boundary": false,
771
- "lineCount": 3,
772
- "size": 62
773
- }, {
774
- "header": [
775
- "Content-Type: text/plain; CHARSET=US-ASCII",
776
- "Content-Transfer-Encoding: 8bit"
777
- ],
778
- "parsedHeader": {
779
- "content-transfer-encoding": "8bit",
780
- "content-type": {
781
- "value": "text/plain",
782
- "type": "text",
783
- "subtype": "plain",
784
- "params": {
785
- "charset": "US-ASCII"
786
- },
787
- "hasParams": true
788
- }
789
- },
790
- "body": "This is the second text part.\r\nIt should also be displayed inline.\r\n",
791
- "multipart": false,
792
- "boundary": false,
793
- "lineCount": 3,
794
- "size": 68
795
- }],
796
- "header": [
797
- "Subject: text and text, both inline",
798
- "From: Ryan Finnie <rfinnie@domain.dom>",
799
- "To: bob@domain.dom",
800
- "Content-Type: multipart/mixed; boundary=\"=-pNc4wtlOIxs8RcX7H/AK\"",
801
- "Message-Id: <1066974089.4265.64.camel@localhost>",
802
- "Mime-Version: 1.0",
803
- "Date: 23 Oct 2003 22:41:29 -0700"
804
- ],
805
- "parsedHeader": {
806
- "date": "23 Oct 2003 22:41:29 -0700",
807
- "mime-version": "1.0",
808
- "message-id": "<1066974089.4265.64.camel@localhost>",
809
- "content-type": {
810
- "value": "multipart/mixed",
811
- "type": "multipart",
812
- "subtype": "mixed",
813
- "params": {
814
- "boundary": "=-pNc4wtlOIxs8RcX7H/AK"
815
- },
816
- "hasParams": true
817
- },
818
- "to": [{
819
- "address": "bob@domain.dom",
820
- "name": ""
821
- }],
822
- "from": [{
823
- "address": "rfinnie@domain.dom",
824
- "name": "Ryan Finnie"
825
- }],
826
- "subject": "text and text, both inline"
827
- },
828
- "body": "\r\n",
829
- "multipart": "mixed",
830
- "boundary": "=-pNc4wtlOIxs8RcX7H/AK",
831
- "lineCount": 2,
832
- "size": 2
833
- },
834
- "lineCount": 25,
835
- "size": 642
836
- }, {
837
- "header": [
838
- "Content-Disposition: inline",
839
- "Content-Description: That's not a cigar. Uh... and it's not mine. --Hermes",
840
- "Content-Type: message/rfc822"
841
- ],
842
- "parsedHeader": {
843
- "content-type": {
844
- "value": "message/rfc822",
845
- "type": "message",
846
- "subtype": "rfc822",
847
- "params": {}
848
- },
849
- "content-description": "That's not a cigar. Uh... and it's not mine. --Hermes",
850
- "content-disposition": {
851
- "value": "inline",
852
- "type": "inline",
853
- "subtype": "",
854
- "params": {}
855
- }
856
- },
857
- "body": "Subject: HTML and... HTML?\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: multipart/mixed; boundary=\"=-zxh/IezwzZITiphpcbJZ\"\r\nMessage-Id: <1066973957.4263.59.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 22:39:17 -0700\r\n\r\n\r\n--=-zxh/IezwzZITiphpcbJZ\r\nContent-Type: text/html; CHARSET=utf-8\r\nContent-Transfer-Encoding: 8bit\r\n\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\r\n<HTML>\r\n<HEAD>\r\n <META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; CHARSET=UTF-8\">\r\n <META NAME=\"GENERATOR\" CONTENT=\"GtkHTML/1.1.10\">\r\n</HEAD>\r\n<BODY>\r\n<B>Bold!!!</B><BR>\r\n<BR>\r\nWhat do we have here... This message is an HTML message. Also attached\r\nis an HTML FILE. Both of these are in a multipart/mixed part.<BR>\r\n<BR>\r\nNow, the first HTML part (what you're reading now) should be displayed\r\nif the MUA is HTML-capable. If it is not, the MUA could possibly offer\r\nthis part up as an attachment to download, seeing as how no plaintext\r\npart is offered as an alternative.<BR>\r\n<BR>\r\nHowever, the second HTML part is listed with a disposition as\r\nattachment. Therefore, it should be offered as an attachment, not\r\ndisplayed inline.\r\n</BODY>\r\n</HTML>\r\n\r\n--=-zxh/IezwzZITiphpcbJZ\r\nContent-Disposition: attachment; filename=htmlfile.html\r\nContent-Type: text/html; NAME=htmlfile.html; CHARSET=UTF-8\r\nContent-Transfer-Encoding: 8bit\r\n\r\n<html>\r\n<head><title>This is an Attachment</title></head>\r\n<body>\r\n<p>The title says it all...</p>\r\n</body>\r\n</html>\r\n\r\n--=-zxh/IezwzZITiphpcbJZ--\r\n",
858
- "multipart": false,
859
- "boundary": false,
860
- "message": {
861
- "childNodes": [{
862
- "header": [
863
- "Content-Type: text/html; CHARSET=utf-8",
864
- "Content-Transfer-Encoding: 8bit"
865
- ],
866
- "parsedHeader": {
867
- "content-transfer-encoding": "8bit",
868
- "content-type": {
869
- "value": "text/html",
870
- "type": "text",
871
- "subtype": "html",
872
- "params": {
873
- "charset": "utf-8"
874
- },
875
- "hasParams": true
876
- }
877
- },
878
- "body": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\r\n<HTML>\r\n<HEAD>\r\n <META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; CHARSET=UTF-8\">\r\n <META NAME=\"GENERATOR\" CONTENT=\"GtkHTML/1.1.10\">\r\n</HEAD>\r\n<BODY>\r\n<B>Bold!!!</B><BR>\r\n<BR>\r\nWhat do we have here... This message is an HTML message. Also attached\r\nis an HTML FILE. Both of these are in a multipart/mixed part.<BR>\r\n<BR>\r\nNow, the first HTML part (what you're reading now) should be displayed\r\nif the MUA is HTML-capable. If it is not, the MUA could possibly offer\r\nthis part up as an attachment to download, seeing as how no plaintext\r\npart is offered as an alternative.<BR>\r\n<BR>\r\nHowever, the second HTML part is listed with a disposition as\r\nattachment. Therefore, it should be offered as an attachment, not\r\ndisplayed inline.\r\n</BODY>\r\n</HTML>\r\n",
879
- "multipart": false,
880
- "boundary": false,
881
- "lineCount": 23,
882
- "size": 824
883
- }, {
884
- "header": [
885
- "Content-Disposition: attachment; filename=htmlfile.html",
886
- "Content-Type: text/html; NAME=htmlfile.html; CHARSET=UTF-8",
887
- "Content-Transfer-Encoding: 8bit"
888
- ],
889
- "parsedHeader": {
890
- "content-transfer-encoding": "8bit",
891
- "content-type": {
892
- "value": "text/html",
893
- "type": "text",
894
- "subtype": "html",
895
- "params": {
896
- "name": "htmlfile.html",
897
- "charset": "UTF-8"
898
- },
899
- "hasParams": true
900
- },
901
- "content-disposition": {
902
- "value": "attachment",
903
- "type": "attachment",
904
- "subtype": "",
905
- "params": {
906
- "filename": "htmlfile.html"
907
- },
908
- "hasParams": true
909
- }
910
- },
911
- "body": "<html>\r\n<head><title>This is an Attachment</title></head>\r\n<body>\r\n<p>The title says it all...</p>\r\n</body>\r\n</html>\r\n",
912
- "multipart": false,
913
- "boundary": false,
914
- "lineCount": 7,
915
- "size": 118
916
- }],
917
- "header": [
918
- "Subject: HTML and... HTML?",
919
- "From: Ryan Finnie <rfinnie@domain.dom>",
920
- "To: bob@domain.dom",
921
- "Content-Type: multipart/mixed; boundary=\"=-zxh/IezwzZITiphpcbJZ\"",
922
- "Message-Id: <1066973957.4263.59.camel@localhost>",
923
- "Mime-Version: 1.0",
924
- "Date: 23 Oct 2003 22:39:17 -0700"
925
- ],
926
- "parsedHeader": {
927
- "date": "23 Oct 2003 22:39:17 -0700",
928
- "mime-version": "1.0",
929
- "message-id": "<1066973957.4263.59.camel@localhost>",
930
- "content-type": {
931
- "value": "multipart/mixed",
932
- "type": "multipart",
933
- "subtype": "mixed",
934
- "params": {
935
- "boundary": "=-zxh/IezwzZITiphpcbJZ"
936
- },
937
- "hasParams": true
938
- },
939
- "to": [{
940
- "address": "bob@domain.dom",
941
- "name": ""
942
- }],
943
- "from": [{
944
- "address": "rfinnie@domain.dom",
945
- "name": "Ryan Finnie"
946
- }],
947
- "subject": "HTML and... HTML?"
948
- },
949
- "body": "\r\n",
950
- "multipart": "mixed",
951
- "boundary": "=-zxh/IezwzZITiphpcbJZ",
952
- "lineCount": 2,
953
- "size": 2
954
- },
955
- "lineCount": 50,
956
- "size": 1515
957
- }, {
958
- "header": [
959
- "Content-Disposition: inline",
960
- "Content-Description: The spirit is willing, but the flesh is spongy, and\r\n bruised. --Zapp",
961
- "Content-Type: message/rfc822"
962
- ],
963
- "parsedHeader": {
964
- "content-type": {
965
- "value": "message/rfc822",
966
- "type": "message",
967
- "subtype": "rfc822",
968
- "params": {}
969
- },
970
- "content-description": "The spirit is willing, but the flesh is spongy, and bruised. --Zapp",
971
- "content-disposition": {
972
- "value": "inline",
973
- "type": "inline",
974
- "subtype": "",
975
- "params": {}
976
- }
977
- },
978
- "body": "Subject: smiley!\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: multipart/signed; micalg=pgp-sha1; protocol=\"application/pgp-signature\"; boundary=\"=-vH3FQO9a8icUn1ROCoAi\"\r\nMessage-Id: <1066972996.4264.39.camel@localhost>\r\nMime-Version: 1.0\r\nDate: 23 Oct 2003 22:23:16 -0700\r\n\r\n\r\n--=-vH3FQO9a8icUn1ROCoAi\r\nContent-Type: multipart/mixed; boundary=\"=-CgV5jm9HAY9VbUlAuneA\"\r\n\r\n\r\n--=-CgV5jm9HAY9VbUlAuneA\r\nContent-Type: multipart/related; type=\"multipart/alternative\";\r\n boundary=\"=-GpwozF9CQ7NdF+fd+vMG\"\r\n\r\n\r\n--=-GpwozF9CQ7NdF+fd+vMG\r\nContent-Type: multipart/alternative; boundary=\"=-dHujWM/Xizz57x/JOmDF\"\r\n\r\n\r\n--=-dHujWM/Xizz57x/JOmDF\r\nContent-Type: text/plain\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nIf this sentence is red, you are viewing the HTML part.\r\nWow, what a complicated message. This message is laid out as so:\r\n\r\nmultipart/signed\r\n| multipart/mixed\r\n| | mutipart/related\r\n| | | multipart/alternative\r\n| | | | text/plain\r\n| | | | text/html\r\n| | | image/png (smiley)\r\n| | image/gif (dot)\r\n| application/pgp-signature\r\n\r\n:)\r\n\r\nA smiley face should be embedded into the HTML part above (if you are\r\nviewing the HTML part), while the red square dot should be attached, not\r\ndisplayed inline. Additionally, this whole message is PGP signed.\r\n\r\nThis message introduces a few tricks that the MUA should cope with.=20\r\nFirst of all, the related / alternative combination doesn't make much\r\nsense. Here's the current setup in pseudo-code:\r\n\r\nrelationship between (alternative: HTML or text part) and PNG part\r\n\r\nWhy would the text part be related in anyway to the PNG? Instead, the\r\ncorrect and more logical way to do things would be:\r\n\r\nalternative: (relationship between HTML and PNG parts) or text part\r\n\r\nHowever, many MUAs compose a message using the first method, so this\r\nshould be taken care of when parsing the message.\r\n\r\nAdditionally, notice that the inline image has a disposition of\r\n\"attachment\". Despite this being in there, the smiley should be\r\nembedded inline in the HTML part, not offered as an attachment.=20\r\nConversely, the GIF image should be offered as an attachment, not\r\ndisplayed inline.\r\n\r\nIf the MUA is not PGP capable, at the very least it should recognize\r\nmultipart/signed the same as multipart/mixed, and offer the\r\napplication/pgp-signature part as an attachment.\r\n\r\n--=-dHujWM/Xizz57x/JOmDF\r\nContent-Type: text/html; charset=utf-8\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\r\n<HTML>\r\n<HEAD>\r\n <META HTTP-EQUIV=3D\"Content-Type\" CONTENT=3D\"text/html; CHARSET=3DUTF-8\">\r\n <META NAME=3D\"GENERATOR\" CONTENT=3D\"GtkHTML/1.1.10\">\r\n</HEAD>\r\n<BODY>\r\n<FONT COLOR=3D\"#f80000\">If this sentence is red, you are viewing the HTML p=\r\nart.</FONT><BR>\r\nWow, what a complicated message.  This message is laid out as so:<BR>\r\n<BR>\r\nmultipart/signed<BR>\r\n| multipart/mixed<BR>\r\n| | mutipart/related<BR>\r\n| | | multipart/alternative<BR>\r\n| | | | text/plain<BR>\r\n| | | | text/html<BR>\r\n| | | image/png (smiley)<BR>\r\n| | image/gif (dot)<BR>\r\n| application/pgp-signature<BR>\r\n<BR>\r\n<IMG SRC=3D\"cid:1066971953.4232.15.camel@localhost\" ALIGN=3D\"bottom\" ALT=3D=\r\n\":)\" BORDER=3D\"0\"><BR>\r\n<BR>\r\nA smiley face should be embedded into the HTML part above (if you are viewi=\r\nng the HTML part), while the red square dot should be attached, not display=\r\ned inline.  Additionally, this whole message is PGP signed.<BR>\r\n<BR>\r\nThis message introduces a few tricks that the MUA should cope with.  F=\r\nirst of all, the related / alternative combination doesn't make much sense.=\r\n  Here's the current setup in pseudo-code:<BR>\r\n<BR>\r\n<I>relationship between (alternative: HTML or text part) and PNG part</I><B=\r\nR>\r\n<BR>\r\nWhy would the text part be related in anyway to the PNG?  Instead, the=\r\n correct and more logical way to do things would be:<BR>\r\n<BR>\r\nalternative: (relationship between HTML and PNG parts) or text part<BR>\r\n<BR>\r\nHowever, many MUAs compose a message using the first method, so this should=\r\n be taken care of when parsing the message.<BR>\r\n<BR>\r\nAdditionally, notice that the inline image has a disposition of \"attac=\r\nhment\".  Despite this being in there, the smiley should be embedd=\r\ned inline in the HTML part, not offered as an attachment.  Conversely,=\r\n the GIF image should be offered as an attachment, not displayed inline.<BR=\r\n>\r\n<BR>\r\nIf the MUA is not PGP capable, at the very least it should recognize multip=\r\nart/signed the same as multipart/mixed, and offer the application/pgp-signa=\r\nture part as an attachment.\r\n</BODY>\r\n</HTML>\r\n\r\n--=-dHujWM/Xizz57x/JOmDF--\r\n\r\n--=-GpwozF9CQ7NdF+fd+vMG\r\nContent-ID: <1066971953.4232.15.camel@localhost>\r\nContent-Disposition: attachment; filename=smiley-3.png\r\nContent-Type: image/png; name=smiley-3.png\r\nContent-Transfer-Encoding: base64\r\n\r\niVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC+klEQVR42n2TbUjVdxTHP/+H69Xd\r\na2VWlFe69rzthZJUoxeNOWoFGxEhYRRFmZSVW2u9ab2KejWE1qDNBkEQhS82VoiaZkVPmoWaKNM5\r\nmA+opbd771//997//T/+epHBarEPHA6Hc84XDnwP/JcwcBS4AVgzcR04ONN7C+md+pcPCz44dPLA\r\narZs/gg1UABuGkvvp7X1Iad+itE/YtUAle8TuH26sujzqq/LkJQsnOQQVmIASVJQMhehZORiJwc5\r\nd76FH2pf3gY2Aigzy7+eObqmtOqbXbjGGHZqCM+eQpJ9AHhWFCc5CAjWf1KAkppc+qg3vRCol4Fw\r\n0aqcisOVW3HTE7hmBElSKD/5GFkNMhH1KDvegST78CwNSfZxeM88VuYrh4CwAuxqvxL6MnPuWiy9\r\nH1kNUPH9fZofDKPpHn8/z+Z6Yw8JK5stX5VhRO6h+OfiV3WaHxtPVKAwmF+KqXUDMkgqZ0+UoKcE\r\nP57/GXOqh46ODqrPXUQfufb6YOGxJOQD2CaHQnnlAJ4zDXggHBYvK6ap6Rau+RIz1k7djd+YHrqM\r\npXUC4KQnWTRPAdiuRqNRkFQG/omRNJOsKVQw408xtS4QDsI10AaqEY6O8Fzq70fJy3XI8gsA5HTa\r\nrBdOkvwFKj39EWrr/sJzEnj29OvsphGugfBsLlwbZnjcYN36LxiLuADtMtCUetFAcE4ee8s+pbHV\r\nYtOemwhHx3MSaPEY3X9OUnqsk5a2OMeP7KC3t4u+3gRALUC4cEW2eN62Q4ze3SAiz74TDxvOiI+X\r\nBcTsoCoyfJKYn6OKmrMbxGRnlXhyJSSqv80Vq0KSAFa+ceKl0wcK9lfsW42TGsE/pxhfcDmKfz6e\r\nFUPg4iRH6Ov6g9EJh1t341xusWuAyn9b+c7BrbklJ8oDZGTOQpL9ePY08SmDpCEwbcHwuE370yku\r\nNlj3gM/e90yXliyU9+8sCVJYlEUgU8IwBZruMThm83uzxsAYV4Hd/A9h4BjQBthAFOgDLgDF7w6/\r\nArI6YJ0eTQeGAAAAAElFTkSuQmCC\r\n\r\n--=-GpwozF9CQ7NdF+fd+vMG--\r\n\r\n--=-CgV5jm9HAY9VbUlAuneA\r\nContent-Disposition: attachment; filename=dot.gif\r\nContent-Type: image/gif; name=dot.gif\r\nContent-Transfer-Encoding: base64\r\n\r\nR0lGODdhCgAKAKEAAAAAANUAAP///8PDwywAAAAACgAKAEACHZSPMssLKoIMYLyR1I2z3sZsE2VB\r\nowcBqlqurloAADs=\r\n\r\n--=-CgV5jm9HAY9VbUlAuneA--\r\n\r\n--=-vH3FQO9a8icUn1ROCoAi\r\nContent-Type: application/pgp-signature; name=signature.asc\r\nContent-Description: This is a digitally signed message part\r\n\r\n-----BEGIN PGP SIGNATURE-----\r\nVersion: GnuPG v1.2.2 (GNU/Linux)\r\n\r\niD8DBQA/mLdEKZYQqSA+yiURAjAnAJ90G22jbX/Broy0F541R0UUbsb6zgCeJn0d\r\n02Vq9Sv6aXE+YM0lRn3jZDc=\r\n=uwCM\r\n-----END PGP SIGNATURE-----\r\n\r\n--=-vH3FQO9a8icUn1ROCoAi--",
979
- "multipart": false,
980
- "boundary": false,
981
- "message": {
982
- "childNodes": [{
983
- "childNodes": [{
984
- "childNodes": [{
985
- "childNodes": [{
986
- "header": [
987
- "Content-Type: text/plain",
988
- "Content-Transfer-Encoding: quoted-printable"
989
- ],
990
- "parsedHeader": {
991
- "content-transfer-encoding": "quoted-printable",
992
- "content-type": {
993
- "value": "text/plain",
994
- "type": "text",
995
- "subtype": "plain",
996
- "params": {}
997
- }
998
- },
999
- "body": "If this sentence is red, you are viewing the HTML part.\r\nWow, what a complicated message. This message is laid out as so:\r\n\r\nmultipart/signed\r\n| multipart/mixed\r\n| | mutipart/related\r\n| | | multipart/alternative\r\n| | | | text/plain\r\n| | | | text/html\r\n| | | image/png (smiley)\r\n| | image/gif (dot)\r\n| application/pgp-signature\r\n\r\n:)\r\n\r\nA smiley face should be embedded into the HTML part above (if you are\r\nviewing the HTML part), while the red square dot should be attached, not\r\ndisplayed inline. Additionally, this whole message is PGP signed.\r\n\r\nThis message introduces a few tricks that the MUA should cope with.=20\r\nFirst of all, the related / alternative combination doesn't make much\r\nsense. Here's the current setup in pseudo-code:\r\n\r\nrelationship between (alternative: HTML or text part) and PNG part\r\n\r\nWhy would the text part be related in anyway to the PNG? Instead, the\r\ncorrect and more logical way to do things would be:\r\n\r\nalternative: (relationship between HTML and PNG parts) or text part\r\n\r\nHowever, many MUAs compose a message using the first method, so this\r\nshould be taken care of when parsing the message.\r\n\r\nAdditionally, notice that the inline image has a disposition of\r\n\"attachment\". Despite this being in there, the smiley should be\r\nembedded inline in the HTML part, not offered as an attachment.=20\r\nConversely, the GIF image should be offered as an attachment, not\r\ndisplayed inline.\r\n\r\nIf the MUA is not PGP capable, at the very least it should recognize\r\nmultipart/signed the same as multipart/mixed, and offer the\r\napplication/pgp-signature part as an attachment.\r\n",
1000
- "multipart": false,
1001
- "boundary": false,
1002
- "lineCount": 43,
1003
- "size": 1606
1004
- }, {
1005
- "header": [
1006
- "Content-Type: text/html; charset=utf-8",
1007
- "Content-Transfer-Encoding: quoted-printable"
1008
- ],
1009
- "parsedHeader": {
1010
- "content-transfer-encoding": "quoted-printable",
1011
- "content-type": {
1012
- "value": "text/html",
1013
- "type": "text",
1014
- "subtype": "html",
1015
- "params": {
1016
- "charset": "utf-8"
1017
- },
1018
- "hasParams": true
1019
- }
1020
- },
1021
- "body": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\r\n<HTML>\r\n<HEAD>\r\n <META HTTP-EQUIV=3D\"Content-Type\" CONTENT=3D\"text/html; CHARSET=3DUTF-8\">\r\n <META NAME=3D\"GENERATOR\" CONTENT=3D\"GtkHTML/1.1.10\">\r\n</HEAD>\r\n<BODY>\r\n<FONT COLOR=3D\"#f80000\">If this sentence is red, you are viewing the HTML p=\r\nart.</FONT><BR>\r\nWow, what a complicated message.  This message is laid out as so:<BR>\r\n<BR>\r\nmultipart/signed<BR>\r\n| multipart/mixed<BR>\r\n| | mutipart/related<BR>\r\n| | | multipart/alternative<BR>\r\n| | | | text/plain<BR>\r\n| | | | text/html<BR>\r\n| | | image/png (smiley)<BR>\r\n| | image/gif (dot)<BR>\r\n| application/pgp-signature<BR>\r\n<BR>\r\n<IMG SRC=3D\"cid:1066971953.4232.15.camel@localhost\" ALIGN=3D\"bottom\" ALT=3D=\r\n\":)\" BORDER=3D\"0\"><BR>\r\n<BR>\r\nA smiley face should be embedded into the HTML part above (if you are viewi=\r\nng the HTML part), while the red square dot should be attached, not display=\r\ned inline.  Additionally, this whole message is PGP signed.<BR>\r\n<BR>\r\nThis message introduces a few tricks that the MUA should cope with.  F=\r\nirst of all, the related / alternative combination doesn't make much sense.=\r\n  Here's the current setup in pseudo-code:<BR>\r\n<BR>\r\n<I>relationship between (alternative: HTML or text part) and PNG part</I><B=\r\nR>\r\n<BR>\r\nWhy would the text part be related in anyway to the PNG?  Instead, the=\r\n correct and more logical way to do things would be:<BR>\r\n<BR>\r\nalternative: (relationship between HTML and PNG parts) or text part<BR>\r\n<BR>\r\nHowever, many MUAs compose a message using the first method, so this should=\r\n be taken care of when parsing the message.<BR>\r\n<BR>\r\nAdditionally, notice that the inline image has a disposition of \"attac=\r\nhment\".  Despite this being in there, the smiley should be embedd=\r\ned inline in the HTML part, not offered as an attachment.  Conversely,=\r\n the GIF image should be offered as an attachment, not displayed inline.<BR=\r\n>\r\n<BR>\r\nIf the MUA is not PGP capable, at the very least it should recognize multip=\r\nart/signed the same as multipart/mixed, and offer the application/pgp-signa=\r\nture part as an attachment.\r\n</BODY>\r\n</HTML>\r\n",
1022
- "multipart": false,
1023
- "boundary": false,
1024
- "lineCount": 55,
1025
- "size": 2135
1026
- }],
1027
- "header": [
1028
- "Content-Type: multipart/alternative; boundary=\"=-dHujWM/Xizz57x/JOmDF\""
1029
- ],
1030
- "parsedHeader": {
1031
- "content-type": {
1032
- "value": "multipart/alternative",
1033
- "type": "multipart",
1034
- "subtype": "alternative",
1035
- "params": {
1036
- "boundary": "=-dHujWM/Xizz57x/JOmDF"
1037
- },
1038
- "hasParams": true
1039
- }
1040
- },
1041
- "body": "\r\n",
1042
- "multipart": "alternative",
1043
- "boundary": "=-dHujWM/Xizz57x/JOmDF",
1044
- "lineCount": 2,
1045
- "size": 2
1046
- }, {
1047
- "header": [
1048
- "Content-ID: <1066971953.4232.15.camel@localhost>",
1049
- "Content-Disposition: attachment; filename=smiley-3.png",
1050
- "Content-Type: image/png; name=smiley-3.png",
1051
- "Content-Transfer-Encoding: base64"
1052
- ],
1053
- "parsedHeader": {
1054
- "content-transfer-encoding": "base64",
1055
- "content-type": {
1056
- "value": "image/png",
1057
- "type": "image",
1058
- "subtype": "png",
1059
- "params": {
1060
- "name": "smiley-3.png"
1061
- },
1062
- "hasParams": true
1063
- },
1064
- "content-disposition": {
1065
- "value": "attachment",
1066
- "type": "attachment",
1067
- "subtype": "",
1068
- "params": {
1069
- "filename": "smiley-3.png"
1070
- },
1071
- "hasParams": true
1072
- },
1073
- "content-id": "<1066971953.4232.15.camel@localhost>"
1074
- },
1075
- "body": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC+klEQVR42n2TbUjVdxTHP/+H69Xd\r\na2VWlFe69rzthZJUoxeNOWoFGxEhYRRFmZSVW2u9ab2KejWE1qDNBkEQhS82VoiaZkVPmoWaKNM5\r\nmA+opbd771//997//T/+epHBarEPHA6Hc84XDnwP/JcwcBS4AVgzcR04ONN7C+md+pcPCz44dPLA\r\narZs/gg1UABuGkvvp7X1Iad+itE/YtUAle8TuH26sujzqq/LkJQsnOQQVmIASVJQMhehZORiJwc5\r\nd76FH2pf3gY2Aigzy7+eObqmtOqbXbjGGHZqCM+eQpJ9AHhWFCc5CAjWf1KAkppc+qg3vRCol4Fw\r\n0aqcisOVW3HTE7hmBElSKD/5GFkNMhH1KDvegST78CwNSfZxeM88VuYrh4CwAuxqvxL6MnPuWiy9\r\nH1kNUPH9fZofDKPpHn8/z+Z6Yw8JK5stX5VhRO6h+OfiV3WaHxtPVKAwmF+KqXUDMkgqZ0+UoKcE\r\nP57/GXOqh46ODqrPXUQfufb6YOGxJOQD2CaHQnnlAJ4zDXggHBYvK6ap6Rau+RIz1k7djd+YHrqM\r\npXUC4KQnWTRPAdiuRqNRkFQG/omRNJOsKVQw408xtS4QDsI10AaqEY6O8Fzq70fJy3XI8gsA5HTa\r\nrBdOkvwFKj39EWrr/sJzEnj29OvsphGugfBsLlwbZnjcYN36LxiLuADtMtCUetFAcE4ee8s+pbHV\r\nYtOemwhHx3MSaPEY3X9OUnqsk5a2OMeP7KC3t4u+3gRALUC4cEW2eN62Q4ze3SAiz74TDxvOiI+X\r\nBcTsoCoyfJKYn6OKmrMbxGRnlXhyJSSqv80Vq0KSAFa+ceKl0wcK9lfsW42TGsE/pxhfcDmKfz6e\r\nFUPg4iRH6Ov6g9EJh1t341xusWuAyn9b+c7BrbklJ8oDZGTOQpL9ePY08SmDpCEwbcHwuE370yku\r\nNlj3gM/e90yXliyU9+8sCVJYlEUgU8IwBZruMThm83uzxsAYV4Hd/A9h4BjQBthAFOgDLgDF7w6/\r\nArI6YJ0eTQeGAAAAAElFTkSuQmCC\r\n",
1076
- "multipart": false,
1077
- "boundary": false,
1078
- "lineCount": 16,
1079
- "size": 1122
1080
- }],
1081
- "header": [
1082
- "Content-Type: multipart/related; type=\"multipart/alternative\";\r\n boundary=\"=-GpwozF9CQ7NdF+fd+vMG\""
1083
- ],
1084
- "parsedHeader": {
1085
- "content-type": {
1086
- "value": "multipart/related",
1087
- "type": "multipart",
1088
- "subtype": "related",
1089
- "params": {
1090
- "type": "multipart/alternative",
1091
- "boundary": "=-GpwozF9CQ7NdF+fd+vMG"
1092
- },
1093
- "hasParams": true
1094
- }
1095
- },
1096
- "body": "\r\n",
1097
- "multipart": "related",
1098
- "boundary": "=-GpwozF9CQ7NdF+fd+vMG",
1099
- "lineCount": 2,
1100
- "size": 2
1101
- }, {
1102
- "header": [
1103
- "Content-Disposition: attachment; filename=dot.gif",
1104
- "Content-Type: image/gif; name=dot.gif",
1105
- "Content-Transfer-Encoding: base64"
1106
- ],
1107
- "parsedHeader": {
1108
- "content-transfer-encoding": "base64",
1109
- "content-type": {
1110
- "value": "image/gif",
1111
- "type": "image",
1112
- "subtype": "gif",
1113
- "params": {
1114
- "name": "dot.gif"
1115
- },
1116
- "hasParams": true
1117
- },
1118
- "content-disposition": {
1119
- "value": "attachment",
1120
- "type": "attachment",
1121
- "subtype": "",
1122
- "params": {
1123
- "filename": "dot.gif"
1124
- },
1125
- "hasParams": true
1126
- }
1127
- },
1128
- "body": "R0lGODdhCgAKAKEAAAAAANUAAP///8PDwywAAAAACgAKAEACHZSPMssLKoIMYLyR1I2z3sZsE2VB\r\nowcBqlqurloAADs=\r\n",
1129
- "multipart": false,
1130
- "boundary": false,
1131
- "lineCount": 3,
1132
- "size": 96
1133
- }],
1134
- "header": [
1135
- "Content-Type: multipart/mixed; boundary=\"=-CgV5jm9HAY9VbUlAuneA\""
1136
- ],
1137
- "parsedHeader": {
1138
- "content-type": {
1139
- "value": "multipart/mixed",
1140
- "type": "multipart",
1141
- "subtype": "mixed",
1142
- "params": {
1143
- "boundary": "=-CgV5jm9HAY9VbUlAuneA"
1144
- },
1145
- "hasParams": true
1146
- }
1147
- },
1148
- "body": "\r\n",
1149
- "multipart": "mixed",
1150
- "boundary": "=-CgV5jm9HAY9VbUlAuneA",
1151
- "lineCount": 2,
1152
- "size": 2
1153
- }, {
1154
- "header": [
1155
- "Content-Type: application/pgp-signature; name=signature.asc",
1156
- "Content-Description: This is a digitally signed message part"
1157
- ],
1158
- "parsedHeader": {
1159
- "content-description": "This is a digitally signed message part",
1160
- "content-type": {
1161
- "value": "application/pgp-signature",
1162
- "type": "application",
1163
- "subtype": "pgp-signature",
1164
- "params": {
1165
- "name": "signature.asc"
1166
- },
1167
- "hasParams": true
1168
- }
1169
- },
1170
- "body": "-----BEGIN PGP SIGNATURE-----\r\nVersion: GnuPG v1.2.2 (GNU/Linux)\r\n\r\niD8DBQA/mLdEKZYQqSA+yiURAjAnAJ90G22jbX/Broy0F541R0UUbsb6zgCeJn0d\r\n02Vq9Sv6aXE+YM0lRn3jZDc=\r\n=uwCM\r\n-----END PGP SIGNATURE-----\r\n",
1171
- "multipart": false,
1172
- "boundary": false,
1173
- "lineCount": 8,
1174
- "size": 196
1175
- }],
1176
- "header": [
1177
- "Subject: smiley!",
1178
- "From: Ryan Finnie <rfinnie@domain.dom>",
1179
- "To: bob@domain.dom",
1180
- "Content-Type: multipart/signed; micalg=pgp-sha1; protocol=\"application/pgp-signature\"; boundary=\"=-vH3FQO9a8icUn1ROCoAi\"",
1181
- "Message-Id: <1066972996.4264.39.camel@localhost>",
1182
- "Mime-Version: 1.0",
1183
- "Date: 23 Oct 2003 22:23:16 -0700"
1184
- ],
1185
- "parsedHeader": {
1186
- "date": "23 Oct 2003 22:23:16 -0700",
1187
- "mime-version": "1.0",
1188
- "message-id": "<1066972996.4264.39.camel@localhost>",
1189
- "content-type": {
1190
- "value": "multipart/signed",
1191
- "type": "multipart",
1192
- "subtype": "signed",
1193
- "params": {
1194
- "micalg": "pgp-sha1",
1195
- "protocol": "application/pgp-signature",
1196
- "boundary": "=-vH3FQO9a8icUn1ROCoAi"
1197
- },
1198
- "hasParams": true
1199
- },
1200
- "to": [{
1201
- "address": "bob@domain.dom",
1202
- "name": ""
1203
- }],
1204
- "from": [{
1205
- "address": "rfinnie@domain.dom",
1206
- "name": "Ryan Finnie"
1207
- }],
1208
- "subject": "smiley!"
1209
- },
1210
- "body": "",
1211
- "multipart": "signed",
1212
- "boundary": "=-vH3FQO9a8icUn1ROCoAi",
1213
- "lineCount": 1,
1214
- "size": 0
1215
- },
1216
- "lineCount": 177,
1217
- "size": 6648
1218
- }, {
1219
- "header": [
1220
- "Content-Disposition: inline",
1221
- "Content-Description: Kittens give Morbo gas. --Morbo",
1222
- "Content-Type: message/rfc822"
1223
- ],
1224
- "parsedHeader": {
1225
- "content-type": {
1226
- "value": "message/rfc822",
1227
- "type": "message",
1228
- "subtype": "rfc822",
1229
- "params": {}
1230
- },
1231
- "content-description": "Kittens give Morbo gas. --Morbo",
1232
- "content-disposition": {
1233
- "value": "inline",
1234
- "type": "inline",
1235
- "subtype": "",
1236
- "params": {}
1237
- }
1238
- },
1239
- "body": "Subject: the PROPER way to do alternative/related\r\nFrom: Ryan Finnie <rfinnie@domain.dom>\r\nTo: bob@domain.dom\r\nContent-Type: multipart/alternative; type=\"multipart/alternative\"; boundary=\"=-tyGlQ9JvB5uvPWzozI+y\"\r\nMessage-Id: <1066973557.4265.51.camel@localhost>\r\nMime-Version: 1.0\r\nX-Mailer: Not Evolution\r\nDate: 23 Oct 2003 22:32:37 -0700\r\n\r\n\r\n--=-tyGlQ9JvB5uvPWzozI+y\r\nContent-Type: text/plain; CHARSET=US-ASCII\r\nContent-Transfer-Encoding: 8bit\r\n\r\nIf this sentence is green, you're viewing the HTML part.\r\n\r\nNow, this is the way that all MUAs SHOULD treat this kind of situation.\r\nThe layout is like so:\r\n\r\nmultipart/alternative\r\n| text/plain\r\n| multipart/related\r\n| | text/html\r\n| | image/gif\r\n\r\nSee? The GIF (which by the way should be inline towards the top of this\r\nmessage) is related to the HTML, and that whole block is an alternative\r\nto a text/plain part. This is the opposite of the way shown in the\r\nprevious email.\r\n\r\nAlso, the embedded image here does not have a filename. As mentioned\r\nabove, the MUA should suggest something as a filename, even here (the\r\nuser may want to save the embedded image, so a filename would be\r\nhelpful). In this case, I would recommend appending the random text\r\nto be suggested to the user with the part's subtype, in this case\r\nsomething like c20vsidlkvm.gif.\r\n\r\n--=-tyGlQ9JvB5uvPWzozI+y\r\nContent-Type: multipart/related; boundary=\"=-bFkxH1S3HVGcxi+o/5jG\"\r\n\r\n\r\n--=-bFkxH1S3HVGcxi+o/5jG\r\nContent-Type: text/html; CHARSET=utf-8\r\nContent-Transfer-Encoding: 8bit\r\n\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\r\n<HTML>\r\n<HEAD>\r\n <META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; CHARSET=UTF-8\">\r\n <META NAME=\"GENERATOR\" CONTENT=\"GtkHTML/1.1.10\">\r\n</HEAD>\r\n<BODY>\r\n<FONT COLOR=\"#00fc00\">If this sentence is green, you're viewing the HTML part.</FONT><BR>\r\n<IMG SRC=\"cid:1066973340.4232.46.camel@localhost\" ALIGN=\"top\" ALT=\"\" BORDER=\"0\"><BR>\r\nNow, this is the way that all MUAs <B>SHOULD</B> treat this kind of situation.  The layout is like so:<BR>\r\n<BR>\r\nmultipart/alternative<BR>\r\n| text/plain<BR>\r\n| multipart/related<BR>\r\n| | text/html<BR>\r\n| | image/gif<BR>\r\n<BR>\r\nSee?  The GIF (which by the way should be inline towards the top of this message) is related to the HTML, and that whole block is an alternative to a text/plain part.  This is the opposite of the way shown in the previous email.<BR>\r\n<BR>\r\nAlso, the embedded image here does not have a filename.  As mentioned above, the MUA should suggest something as a filename, even here (the user may want to save the embedded image, so a filename would be helpful).  In this case, I would recommend appending the random text to be suggested to the user with the part's subtype, in this case something like c20vsidlkvm.gif.\r\n</BODY>\r\n</HTML>\r\n\r\n--=-bFkxH1S3HVGcxi+o/5jG\r\nContent-ID: <1066973340.4232.46.camel@localhost>\r\nContent-Transfer-Encoding: base64\r\nContent-Type: image/gif\r\n\r\nR0lGODlhBQALAPIAAKIA/64A/8ZL/////8BS/2QDANZ//wAAACH5BAEAAAMALAAAAAAFAAsAAAMY\r\nOBIytsIYEoiEl0lqFWgKM4zkUJzjWQwJADs=\r\n\r\n--=-bFkxH1S3HVGcxi+o/5jG--\r\n\r\n--=-tyGlQ9JvB5uvPWzozI+y--\r\n",
1240
- "multipart": false,
1241
- "boundary": false,
1242
- "message": {
1243
- "childNodes": [{
1244
- "header": [
1245
- "Content-Type: text/plain; CHARSET=US-ASCII",
1246
- "Content-Transfer-Encoding: 8bit"
1247
- ],
1248
- "parsedHeader": {
1249
- "content-transfer-encoding": "8bit",
1250
- "content-type": {
1251
- "value": "text/plain",
1252
- "type": "text",
1253
- "subtype": "plain",
1254
- "params": {
1255
- "charset": "US-ASCII"
1256
- },
1257
- "hasParams": true
1258
- }
1259
- },
1260
- "body": "If this sentence is green, you're viewing the HTML part.\r\n\r\nNow, this is the way that all MUAs SHOULD treat this kind of situation.\r\nThe layout is like so:\r\n\r\nmultipart/alternative\r\n| text/plain\r\n| multipart/related\r\n| | text/html\r\n| | image/gif\r\n\r\nSee? The GIF (which by the way should be inline towards the top of this\r\nmessage) is related to the HTML, and that whole block is an alternative\r\nto a text/plain part. This is the opposite of the way shown in the\r\nprevious email.\r\n\r\nAlso, the embedded image here does not have a filename. As mentioned\r\nabove, the MUA should suggest something as a filename, even here (the\r\nuser may want to save the embedded image, so a filename would be\r\nhelpful). In this case, I would recommend appending the random text\r\nto be suggested to the user with the part's subtype, in this case\r\nsomething like c20vsidlkvm.gif.\r\n",
1261
- "multipart": false,
1262
- "boundary": false,
1263
- "lineCount": 23,
1264
- "size": 862
1265
- }, {
1266
- "childNodes": [{
1267
- "header": [
1268
- "Content-Type: text/html; CHARSET=utf-8",
1269
- "Content-Transfer-Encoding: 8bit"
1270
- ],
1271
- "parsedHeader": {
1272
- "content-transfer-encoding": "8bit",
1273
- "content-type": {
1274
- "value": "text/html",
1275
- "type": "text",
1276
- "subtype": "html",
1277
- "params": {
1278
- "charset": "utf-8"
1279
- },
1280
- "hasParams": true
1281
- }
1282
- },
1283
- "body": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\r\n<HTML>\r\n<HEAD>\r\n <META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; CHARSET=UTF-8\">\r\n <META NAME=\"GENERATOR\" CONTENT=\"GtkHTML/1.1.10\">\r\n</HEAD>\r\n<BODY>\r\n<FONT COLOR=\"#00fc00\">If this sentence is green, you're viewing the HTML part.</FONT><BR>\r\n<IMG SRC=\"cid:1066973340.4232.46.camel@localhost\" ALIGN=\"top\" ALT=\"\" BORDER=\"0\"><BR>\r\nNow, this is the way that all MUAs <B>SHOULD</B> treat this kind of situation.  The layout is like so:<BR>\r\n<BR>\r\nmultipart/alternative<BR>\r\n| text/plain<BR>\r\n| multipart/related<BR>\r\n| | text/html<BR>\r\n| | image/gif<BR>\r\n<BR>\r\nSee?  The GIF (which by the way should be inline towards the top of this message) is related to the HTML, and that whole block is an alternative to a text/plain part.  This is the opposite of the way shown in the previous email.<BR>\r\n<BR>\r\nAlso, the embedded image here does not have a filename.  As mentioned above, the MUA should suggest something as a filename, even here (the user may want to save the embedded image, so a filename would be helpful).  In this case, I would recommend appending the random text to be suggested to the user with the part's subtype, in this case something like c20vsidlkvm.gif.\r\n</BODY>\r\n</HTML>\r\n",
1284
- "multipart": false,
1285
- "boundary": false,
1286
- "lineCount": 23,
1287
- "size": 1263
1288
- }, {
1289
- "header": [
1290
- "Content-ID: <1066973340.4232.46.camel@localhost>",
1291
- "Content-Transfer-Encoding: base64",
1292
- "Content-Type: image/gif"
1293
- ],
1294
- "parsedHeader": {
1295
- "content-type": {
1296
- "value": "image/gif",
1297
- "type": "image",
1298
- "subtype": "gif",
1299
- "params": {}
1300
- },
1301
- "content-transfer-encoding": "base64",
1302
- "content-id": "<1066973340.4232.46.camel@localhost>"
1303
- },
1304
- "body": "R0lGODlhBQALAPIAAKIA/64A/8ZL/////8BS/2QDANZ//wAAACH5BAEAAAMALAAAAAAFAAsAAAMY\r\nOBIytsIYEoiEl0lqFWgKM4zkUJzjWQwJADs=\r\n",
1305
- "multipart": false,
1306
- "boundary": false,
1307
- "lineCount": 3,
1308
- "size": 116
1309
- }],
1310
- "header": [
1311
- "Content-Type: multipart/related; boundary=\"=-bFkxH1S3HVGcxi+o/5jG\""
1312
- ],
1313
- "parsedHeader": {
1314
- "content-type": {
1315
- "value": "multipart/related",
1316
- "type": "multipart",
1317
- "subtype": "related",
1318
- "params": {
1319
- "boundary": "=-bFkxH1S3HVGcxi+o/5jG"
1320
- },
1321
- "hasParams": true
1322
- }
1323
- },
1324
- "body": "\r\n",
1325
- "multipart": "related",
1326
- "boundary": "=-bFkxH1S3HVGcxi+o/5jG",
1327
- "lineCount": 2,
1328
- "size": 2
1329
- }],
1330
- "header": [
1331
- "Subject: the PROPER way to do alternative/related",
1332
- "From: Ryan Finnie <rfinnie@domain.dom>",
1333
- "To: bob@domain.dom",
1334
- "Content-Type: multipart/alternative; type=\"multipart/alternative\"; boundary=\"=-tyGlQ9JvB5uvPWzozI+y\"",
1335
- "Message-Id: <1066973557.4265.51.camel@localhost>",
1336
- "Mime-Version: 1.0",
1337
- "X-Mailer: Not Evolution",
1338
- "Date: 23 Oct 2003 22:32:37 -0700"
1339
- ],
1340
- "parsedHeader": {
1341
- "date": "23 Oct 2003 22:32:37 -0700",
1342
- "x-mailer": "Not Evolution",
1343
- "mime-version": "1.0",
1344
- "message-id": "<1066973557.4265.51.camel@localhost>",
1345
- "content-type": {
1346
- "value": "multipart/alternative",
1347
- "type": "multipart",
1348
- "subtype": "alternative",
1349
- "params": {
1350
- "type": "multipart/alternative",
1351
- "boundary": "=-tyGlQ9JvB5uvPWzozI+y"
1352
- },
1353
- "hasParams": true
1354
- },
1355
- "to": [{
1356
- "address": "bob@domain.dom",
1357
- "name": ""
1358
- }],
1359
- "from": [{
1360
- "address": "rfinnie@domain.dom",
1361
- "name": "Ryan Finnie"
1362
- }],
1363
- "subject": "the PROPER way to do alternative/related"
1364
- },
1365
- "body": "\r\n",
1366
- "multipart": "alternative",
1367
- "boundary": "=-tyGlQ9JvB5uvPWzozI+y",
1368
- "lineCount": 2,
1369
- "size": 2
1370
- },
1371
- "lineCount": 80,
1372
- "size": 3092
1373
- }],
1374
- "header": [
1375
- "Subject: Ryan Finnie's MIME Torture Test v1.0",
1376
- "From: Ryan Finnie <rfinnie@domain.dom>",
1377
- "To: bob@domain.dom",
1378
- "Content-Type: multipart/mixed; boundary=\"=-qYxqvD9rbH0PNeExagh1\"",
1379
- "Message-Id: <1066976914.4721.5.camel@localhost>",
1380
- "Mime-Version: 1.0",
1381
- "Date: 23 Oct 2003 23:28:34 -0700"
1382
- ],
1383
- "parsedHeader": {
1384
- "date": "23 Oct 2003 23:28:34 -0700",
1385
- "mime-version": "1.0",
1386
- "message-id": "<1066976914.4721.5.camel@localhost>",
1387
- "content-type": {
1388
- "value": "multipart/mixed",
1389
- "type": "multipart",
1390
- "subtype": "mixed",
1391
- "params": {
1392
- "boundary": "=-qYxqvD9rbH0PNeExagh1"
1393
- },
1394
- "hasParams": true
1395
- },
1396
- "to": [{
1397
- "address": "bob@domain.dom",
1398
- "name": ""
1399
- }],
1400
- "from": [{
1401
- "address": "rfinnie@domain.dom",
1402
- "name": "Ryan Finnie"
1403
- }],
1404
- "subject": "Ryan Finnie's MIME Torture Test v1.0"
1405
- },
1406
- "body": "\r\n",
1407
- "multipart": "mixed",
1408
- "boundary": "=-qYxqvD9rbH0PNeExagh1",
1409
- "lineCount": 2,
1410
- "size": 2
1411
- }