1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
|
Internet Engineering Task Force (IETF) A. Melnikov
Request for Comments: 6558 Isode Limited
Category: Standards Track B. Leiba
ISSN: 2070-1721 K. Li
Huawei Technologies
March 2012
Sieve Extension for Converting Messages before Delivery
Abstract
This document describes how the "CONVERT" IMAP extension can be used
within the Sieve mail filtering language to transform messages before
final delivery.
Status of This Memo
This is an Internet Standards Track document.
This document is a product of the Internet Engineering Task Force
(IETF). It represents the consensus of the IETF community. It has
received public review and has been approved for publication by the
Internet Engineering Steering Group (IESG). Further information on
Internet Standards is available in Section 2 of RFC 5741.
Information about the current status of this document, any errata,
and how to provide feedback on it may be obtained at
http://www.rfc-editor.org/info/rfc6558.
Copyright Notice
Copyright (c) 2012 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License.
Melnikov, et al. Standards Track [Page 1]
^L
RFC 6558 Sieve CONVERT March 2012
Table of Contents
1. Introduction ....................................................2
1.1. Conventions Used in This Document ..........................2
2. "convert" Action ................................................2
2.1. Interaction with Other Tests and Actions ...................3
2.2. "convert" as a Test ........................................4
3. Examples ........................................................5
3.1. Example 1 ..................................................5
3.2. Example 2 ..................................................5
3.3. Example 3 ..................................................5
3.4. Example 4 ..................................................6
4. Security Considerations .........................................7
5. IANA Considerations .............................................7
6. Acknowledgements ................................................7
7. Normative References ............................................7
1. Introduction
The IMAP "CONVERT" extension [RFC5259] adds an IMAP command for
performing client-controlled conversions on whole messages or their
body parts. This document defines a similar extension to the Sieve
mail filtering language [RFC5228], which reuses the conversion
parameters and framework established by IMAP CONVERT.
1.1. Conventions Used in This Document
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in RFC 2119 [RFC2119].
Conventions for notations are as in Sieve [RFC5228], Section 1.1.
2. "convert" Action
Usage: convert <quoted-from-media-type: string>
<quoted-to-media-type: string>
<transcoding-params: string-list>
The "convert" action specifies that all body parts with a media type
[RFC2046] (sometimes called "MIME type") equal to <quoted-from-media-
type> be converted to the media type in <quoted-to-media-type> using
conversion parameters specified in <transcoding-params>. Each
conversion parameter value has the following syntax: "<transcoding-
param-name>=<transcoding-param-value>", where <transcoding-param-
name> and <transcoding-param-value> are defined in CONVERT [RFC5259].
Messages that don't have any body parts with the <quoted-from-media-
type> media type are not affected by the conversion.
Melnikov, et al. Standards Track [Page 2]
^L
RFC 6558 Sieve CONVERT March 2012
The "convert" action can be used with Sieve MIME Part Tests
[RFC5703], in the case that some, but not all of the body parts need
to be converted, or where different body parts might require
different conversions. When the "convert" action appears in a
"foreverypart" loop, it applies only to the body part being
processed, and not to any other body parts (see Section 3.2 for an
example).
When the "convert" action appears outside a "foreverypart" loop, the
conversion applies equally to all body parts -- that is, all body
parts that have the "quoted-from-media-type" are converted, using the
same transcoding parameters.
A single "convert" action will only apply once to any body part. If,
for example, << convert "image/jpeg" "image/jpeg" ["pix-x=100","pix-
y=120"] >> converts a larger JPEG image to the smaller 100 x 120
size, that will be the end of that "convert" action on that body
part. The action will not see a "new" JPEG body part to process,
resulting from the conversion.
If a "convert" action cannot be completed -- perhaps because the
conversion failed, or because the requested conversion is not
available -- that "convert" action MUST terminate and leave the
message unchanged, rolling back any other conversions done by that
action. The script processing continues, and prior or subsequent
"convert" actions are not affected. No error condition is raised,
and no partial conversions from a single "convert" action are
allowed.
Implementations might defer any actual conversion until the results
of the conversion are needed for script processing, to avoid doing
conversions unnecessarily. Consider the case wherein a "convert"
action is processed but a "discard" action results without the need
to actually perform the conversion.
When conversions actually need to be done, they can put a significant
load on the server. Computationally expensive conversions of a lot
of body parts can constitute an attack vector; even if done
legitimately, they can create an unacceptable load. Servers MAY
refuse conversions, or do them at lower priority, effectively slowing
the requesting process in order to avoid negative effects on service
to other processes.
2.1. Interaction with Other Tests and Actions
Whether or not the actual conversion has been done yet, a successful
"convert" action effectively changes the message, and all subsequent
actions, including any other "convert" actions, apply to the changed
Melnikov, et al. Standards Track [Page 3]
^L
RFC 6558 Sieve CONVERT March 2012
message. The "convert" action does not affect the applicability of
other actions; any action that was applicable before the "convert" is
equally applicable to the changed message afterward.
When a disposition-type action, such as "fileinto" or "redirect", is
encountered, the state of the message with respect to conversions is
"locked in" for that disposition-type action. Whether the
implementation performs the action at that point or batches it for
later, it MUST perform the action on the message as it stood at the
time, and MUST NOT include subsequent conversions encountered later
in the script processing. Therefore, the sequence "convert,
fileinto, convert, fileinto" will store two different versions of the
message: the first "fileinto" uses only the first conversion, while
the second uses both. See Section 3.4 for an example of how this can
be used.
In addition, any tests done on the message and its parts will test
the message after prior conversions have been done. The fourth block
of Section 3.4 shows an example of this situation.
Convert actions are cumulative, and each conversion operates on the
message as it stands after all prior conversions. See the fourth
block of Section 3.4 for an example of how this might be tricky.
Because the implicit keep (see Section 2.10.2 of [RFC5228]), if it is
in effect, acts on the final state of the message, all conversions
are performed before any implicit keep.
2.2. "convert" as a Test
To simplify testing for supported and successful conversions, the
"convert" action can also be used as a test. As such, it will
attempt to perform the requested conversion(s) and will evaluate to
"false" if and only if at least one conversion failed. The failure
can be because a conversion was unsupported or because the data could
not be converted (perhaps it had been corrupted in transit or
mislabeled at its origin).
This creates a new type of Sieve action, a "testable action". The
usage as a test is exactly the same as for an action, and it doubles
as an action and a test of the action's result at the same time. See
Section 3.2 for an example of how this test can be used.
Note that defining this new testable action does not change the
definitions of any other actions -- it does not imply that other
actions can be used as tests. Future extensions might define other
testable actions, but those specifications would be responsible for
clearly specifying that.
Melnikov, et al. Standards Track [Page 4]
^L
RFC 6558 Sieve CONVERT March 2012
3. Examples
3.1. Example 1
In the following example, all "image/tiff" body parts of the message
are converted to "image/jpeg" with image resolution of 320x240
pixels. The converted message is then subject to the implicit keep.
require ["convert"];
convert "image/tiff" "image/jpeg" ["pix-x=320","pix-y=240"];
3.2. Example 2
In the following example, all "image/tiff" body parts of the message
are converted to "image/jpeg", as in Example 1. If the conversions
were successful, those messages are then filed into a mailbox called
"INBOX.pics". Other messages (those with no image/tiff body parts)
are subject to the implicit keep, and have not been converted.
require ["mime", "fileinto", "convert"];
if header :mime :anychild :contenttype
"Content-Type" "image/tiff"
{
if (convert "image/tiff" "image/jpeg" ["pix-x=320","pix-y=240"])
{
fileinto "INBOX.pics";
}
}
3.3. Example 3
In the following example, only "image/tiff" body parts with a
Content-Disposition of "inline" are converted. Matching parts that
are larger than 500 kilobytes are converted using an image resolution
of 640x480 pixels, and those smaller are converted to 320x240 pixels.
The message disposition is not changed, so the implicit keep will be
in effect unless something else in the script changes that.
require ["mime", "foreverypart", "fileinto", "convert"];
foreverypart
{
if header :mime :param "filename" :contains
"Content-Disposition" "inline"
{
if size :over "500K"
{
convert "image/tiff" "image/jpeg" ["pix-x=640","pix-y=480"];
} else {
Melnikov, et al. Standards Track [Page 5]
^L
RFC 6558 Sieve CONVERT March 2012
convert "image/tiff" "image/jpeg" ["pix-x=320","pix-y=240"];
}
}
}
[... script continues ...]
3.4. Example 4
The following example shows some tricky interactions between multiple
"convert" actions and other disposition-type actions.
require ["mime", "foreverypart",
"fileinto", "redirect", "convert"];
# The first "if" block will convert all image/tiff body parts
# to 640x480 jpegs and will file the message
# into the "INBOX.pics" mailbox as converted at this point.
if header :mime :anychild :contenttype
"Content-Type" "image/tiff"
{
convert "image/tiff" "image/jpeg" ["pix-x=640","pix-y=480"];
fileinto "INBOX.pics";
}
# The second block, the "foreverypart" loop, will convert all
# inline jpegs to 320x240 resolution... including any tiff body
# parts that had been converted in the first block, above.
# Therefore, any tiff that had been converted to a 640x480 jpeg
# will be re-converted to a 320x240 jpeg here if its
# Content-Disposition is specified as "inline".
foreverypart
{
if header :mime :param "filename" :contains
"Content-Disposition" "inline"
{
convert "image/jpeg" "image/jpeg" ["pix-x=320","pix-y=240"];
}
}
# The third block will take any message that contains a header
# field called "Mobile-Link" and redirect it to the user's
# mobile address. The redirected message will include both
# conversions above, from block one and block two.
if exists "Mobile-Link"
{
redirect "joe@mobile.example.com";
}
Melnikov, et al. Standards Track [Page 6]
^L
RFC 6558 Sieve CONVERT March 2012
# The fourth block will file the message into "Tiff" if it
# contains any tiff body parts. But because of the earlier
# conversion (in the first block), there will never be any
# tiff body parts, so this "fileinto" will never happen.
if header :mime :anychild :contenttype
"Content-Type" "image/tiff"
{
fileinto "Tiff";
}
# Now, at the end of the script processing, the Sieve
# processor will perform an implicit keep if none of
# the "fileinto" and "redirect" actions were taken.
# The kept message will include any conversions that
# were done (that is, any from the second block).
4. Security Considerations
Security considerations given in IMAP CONVERT [RFC5259] and Sieve
[RFC5228] are relevant to this document. There are no additional
security considerations resulting from combining the two.
5. IANA Considerations
IANA has added the following registration to the "Sieve Extensions"
registry, as defined in RFC 5228:
Capability name: convert
Description: adds a new Sieve test and action that enable Sieve
scripts to perform data conversions on the message being
delivered.
RFC number: RFC 6558
Contact address: The Sieve discussion list <sieve@ietf.org>
6. Acknowledgements
The authors also want to thank all who have contributed key insight
and extensively reviewed and discussed the concepts of CONVERT.
Qian Sun contributed text to this document.
7. Normative References
[RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
Extensions (MIME) Part Two: Media Types", RFC 2046,
November 1996.
Melnikov, et al. Standards Track [Page 7]
^L
RFC 6558 Sieve CONVERT March 2012
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC5228] Guenther, P. and T. Showalter, "Sieve: An Email Filtering
Language", RFC 5228, January 2008.
[RFC5259] Melnikov, A. and P. Coates, "Internet Message Access
Protocol - CONVERT Extension", RFC 5259, July 2008.
[RFC5703] Hansen, T. and C. Daboo, "Sieve Email Filtering: MIME Part
Tests, Iteration, Extraction, Replacement, and Enclosure",
RFC 5703, October 2009.
Authors' Addresses
Alexey Melnikov
Isode Limited
5 Castle Business Village
36 Station Road
Hampton, Middlesex TW12 2BX
UK
EMail: Alexey.Melnikov@isode.com
URI: http://www.melnikov.ca/
Barry Leiba
Huawei Technologies
Phone: +1 646 827 0648
EMail: barryleiba@computer.org
URI: http://internetmessagingtechnology.org/
Kepeng Li
Huawei Technologies
Huawei Base, Bantian, Longgang District
Shenzhen, Guangdong 518129
P. R. China
Phone: +86-755-28974289
EMail: likepeng@huawei.com
Melnikov, et al. Standards Track [Page 8]
^L
|