[要約] RFC 5784は、XML形式でのSieveメールフィルタリングのためのSievesとDisplay Directivesに関する仕様です。このRFCの目的は、Sieveスクリプトの作成と表示指示の統一的な表現を提供することです。

Internet Engineering Task Force (IETF)                          N. Freed
Request for Comments: 5784                                      S. Vedam
Category: Standards Track                               Sun Microsystems
ISSN: 2070-1721                                               March 2010
        

Sieve Email Filtering: Sieves and Display Directives in XML

ふるい電子メールフィルタリング:XMLのシーブと表示ディレクティブ

Abstract

概要

This document describes a way to represent Sieve email filtering language scripts in XML. Representing Sieves in XML is intended not as an alternate storage format for Sieve but rather as a means to facilitate manipulation of scripts using XML tools.

このドキュメントでは、XMLの言語スクリプトをフィルタリングするふるい電子メールを表す方法について説明しています。XMLでシーブを表すことは、ふるいの代替ストレージ形式としてではなく、XMLツールを使用してスクリプトの操作を促進する手段として意図されています。

The XML representation also defines additional elements that have no counterparts in the regular Sieve language. These elements are intended for use by graphical user interfaces and provide facilities for labeling or grouping sections of a script so they can be displayed more conveniently. These elements are represented as specially structured comments in regular Sieve format.

XML表現は、通常のふるい言語に対応するものがない追加の要素も定義します。これらの要素は、グラフィカルユーザーインターフェイスで使用することを目的としており、スクリプトのセクションをラベル付けまたはグループ化するための機能を提供して、より便利に表示できます。これらの要素は、通常のふるい形式で特別に構造化されたコメントとして表されます。

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.

このドキュメントは、インターネットエンジニアリングタスクフォース(IETF)の製品です。IETFコミュニティのコンセンサスを表しています。公開レビューを受けており、インターネットエンジニアリングステアリンググループ(IESG)からの出版が承認されています。インターネット標準の詳細については、RFC 5741のセクション2で入手できます。

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/rfc5784.

このドキュメントの現在のステータス、任意のERRATA、およびそのフィードバックを提供する方法に関する情報は、http://www.rfc-editor.org/info/rfc5784で取得できます。

Copyright Notice

著作権表示

Copyright (c) 2010 IETF Trust and the persons identified as the document authors. All rights reserved.

Copyright(c)2010 IETF Trustおよび文書著者として特定された人。全著作権所有。

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.

このドキュメントは、BCP 78およびIETFドキュメント(http://trustee.ietf.org/license-info)に関連するIETF Trustの法的規定の対象となります。この文書に関するあなたの権利と制限を説明するので、これらの文書を注意深く確認してください。このドキュメントから抽出されたコードコンポーネントには、セクション4.Eで説明されている法的規定のセクション4.Eで説明されており、単純化されたBSDライセンスで説明されているように保証なしで提供される簡略化されたBSDライセンステキストを含める必要があります。

Table of Contents

目次

   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
   2.  Conventions Used in This Document  . . . . . . . . . . . . . .  4
   3.  Grammatical Structure of Sieve . . . . . . . . . . . . . . . .  4
   4.  XML Representation of Sieve  . . . . . . . . . . . . . . . . .  6
     4.1.  XML Display Directives . . . . . . . . . . . . . . . . . .  9
     4.2.  Structured Comments  . . . . . . . . . . . . . . . . . . . 10
     4.3.  Validation . . . . . . . . . . . . . . . . . . . . . . . . 11
   5.  Security Considerations  . . . . . . . . . . . . . . . . . . . 11
   6.  IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 11
   7.  References . . . . . . . . . . . . . . . . . . . . . . . . . . 12
     7.1.  Normative References . . . . . . . . . . . . . . . . . . . 12
     7.2.  Informative References . . . . . . . . . . . . . . . . . . 13
   Appendix A.  Extended Example  . . . . . . . . . . . . . . . . . . 14
   Appendix B.  XML Schema for Sieves in XML  . . . . . . . . . . . . 21
   Appendix C.  Relax NG Schema for Sieves in XML . . . . . . . . . . 24
   Appendix D.  Stylesheet for Conversion from XML  . . . . . . . . . 26
   Appendix E.  Acknowledgements  . . . . . . . . . . . . . . . . . . 32
        
1. Introduction
1. はじめに

Sieve [RFC5228] is a language for filtering email messages at or around the time of final delivery. It is designed to be implementable on either a mail client or mail server. It is meant to be extensible, simple, and independent of access protocol, mail architecture, and operating system, and it is intended to be manipulated by a variety of different user interfaces.

Sieve [RFC5228]は、最終配信時またはその頃に電子メールメッセージをフィルタリングするための言語です。メールクライアントまたはメールサーバーのいずれかで実装できるように設計されています。これは、アクセスプロトコル、メールアーキテクチャ、オペレーティングシステムから拡張可能で、シンプルで、独立していることを意図しており、さまざまな異なるユーザーインターフェイスによって操作されることを目的としています。

Some user interface environments have extensive existing facilities for manipulating material represented in XML [XML]. While adding support for alternate data syntaxes may be possible in most if not all of these environments, it may not be particularly convenient to do so. The obvious way to deal with this issue is to map Sieves into XML, possibly on a separate back-end system, manipulate the XML, and convert it back to normal Sieve format.

一部のユーザーインターフェイス環境には、XML [XML]に表される材料を操作するための広範な既存の施設があります。これらの環境のすべてではないにしても、ほとんどの場合、代替データ構文のサポートを追加することは可能かもしれませんが、そうすることは特に便利ではないかもしれません。この問題に対処する明白な方法は、シーブをXMLにマッピングし、おそらく別のバックエンドシステムにマッピングし、XMLを操作し、通常のふるい形式に戻すことです。

The fact that conversion into and out of XML may be done as a separate operation on a different system argues strongly for defining a common XML representation for Sieve. This way, different front-end user interfaces can be used with different back-end mapping and storage facilities.

XMLの内外に変換が別のシステムで別の操作として行われる可能性があるという事実は、ふるいの一般的なXML表現を定義するために強く主張しています。これにより、さまざまなフロントエンドユーザーインターフェイスをさまざまなバックエンドマッピングおよびストレージ機能で使用できます。

Another issue with the creation and manipulation of Sieve scripts by user interfaces is that the language is strictly focused on describing email filtering operations. The language contains no mechanisms for indicating how a given script should be presented in a user interface. Such information can be represented in XML very easily, so it makes sense to define a framework to do this as part of the XML format. A structured comment convention is then used to retain this information when the script is converted to normal Sieve format.

ユーザーインターフェイスによるシーブスクリプトの作成と操作に関するもう1つの問題は、言語が電子メールフィルタリング操作の説明に厳密に焦点を合わせていることです。言語には、特定のスクリプトをユーザーインターフェイスでどのように表示するかを示すメカニズムが含まれていません。このような情報はXMLで非常に簡単に表現できるため、XML形式の一部としてこれを行うフレームワークを定義することは理にかなっています。構造化されたコメント規則を使用して、スクリプトが通常のふるい形式に変換されたときにこの情報を保持します。

It should be noted, however, that the ability for different front ends to use the same mapping and storage facilities does not mean that the additional XML information produced by different front ends will interoperate.

ただし、異なるフロントエンドが同じマッピングおよびストレージ機能を使用する能力は、異なるフロントエンドによって生成された追加のXML情報が相互運用することを意味しないことに注意する必要があります。

Various Sieve extensions have already been defined, e.g., [RFC5183], [RFC5229], [RFC5230], [RFC5231], [RFC5232], [RFC5233], [RFC5235], [RFC5293], and more are planned. The set of extensions available varies from one implementation to the next and may even change as a result of configuration choices. It is therefore essential that the XML representation of Sieve be able to accommodate Sieve extensions without requiring schema changes. It is also desirable that Sieve extensions not require changes to the code that converts to and from the XML representation.

さまざまなふるい拡張機能がすでに定義されています。たとえば、[RFC5183]、[RFC5229]、[RFC5230]、[RFC5231]、[RFC5232]、[RFC5233]、[RFC5235]、[RFC5293]、[RFC5235]、[RFC5235]、[RFC5235]など。利用可能な拡張機能のセットは、実装ごとに異なり、構成の選択の結果として変更される場合があります。したがって、ふるいのXML表現は、スキーマの変更を必要とせずにふるい延長に対応できることが不可欠です。また、シーブ拡張は、XML表現との間で変換するコードの変更を必要としないことも望ましいです。

This specification defines an XML representation for Sieve scripts and explains how the conversion process to and from XML works. The XML representation is capable of accommodating any future Sieve extension as long as the underlying Sieve grammar remains unchanged. Furthermore, code that converts from XML to the normal Sieve format requires no changes to accommodate extensions, while code used to convert from normal Sieve format to XML only requires changes when new control commands are added -- a rare event. An XML Schema, Relax NG Schema, and a sample stylesheet to convert from XML format are also provided in the appendices.

この仕様では、ふるいスクリプトのXML表現を定義し、XMLとの間の変換プロセスがどのように機能するかを説明します。XML表現は、基礎となるふるい文法が変わらない限り、将来のふるい拡張に対応することができます。さらに、XMLから通常のふるい形式に変換するコードは、拡張機能に対応するために変更を必要としませんが、通常のふるい形式からXMLに変換するために使用されるコードは、新しい制御コマンドが追加された場合にのみ変更が必要です。XMLスキーマ、NGスキーマ、およびXML形式から変換するためのサンプルスタイルシートも付録に提供されています。

2. Conventions Used in This Document
2. このドキュメントで使用されている規則

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].

この文書のキーワード "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", および "OPTIONAL" はRFC 2119 [RFC2119]で説明されているように解釈されます。

The term "processor" is used throughout this document to refer to agents that convert Sieve to and from the XML representation. The term "editor" refers to agents that operate on, possibly creating or modifying, Sieves in XML format.

「プロセッサ」という用語は、このドキュメント全体で使用されて、ふるいをXML表現に往復するエージェントを指すために使用されます。「編集者」という用語は、XML形式で操作する、おそらく作成または変更するエージェントを指します。

3. Grammatical Structure of Sieve
3. ふるいの文法構造

The Sieve language is designed to be highly extensible without making any changes to the basic language syntax. Accordingly, the syntax of Sieve, defined in Section 8 of [RFC5228], is entirely structural in nature and employs no reserved words of any sort.

ふるい言語は、基本的な言語の構文に変更を加えることなく、非常に拡張可能になるように設計されています。したがって、[RFC5228]のセクション8で定義されているふるいの構文は、本質的に完全に構造的であり、いかなる種類の予約された言葉を採用していません。

Structurally, a Sieve script consists of a series of commands. Each command, in turn, consists of an identifier, zero or more arguments, an optional test or test-list, and finally an optional block containing another series of commands. Commands are further broken down into controls and actions, although this distinction cannot be determined from the grammar.

構造的には、ふるいスクリプトは一連のコマンドで構成されています。各コマンドは、識別子、ゼロ以上の引数、オプションのテストまたはテストリスト、そして最後に別の一連のコマンドを含むオプションのブロックで構成されています。コマンドはさらにコントロールとアクションに分割されますが、この区別は文法から決定することはできません。

Some example Sieve controls are:

シーブコントロールの例は次のとおりです。

   stop;               <-- No arguments, test, or command block
   require "fileinto"; <-- Control with a single argument
   if true {stop;}     <-- Control with test and command block
        

Some examples of Sieve actions are:

ふるい行動の例は次のとおりです。

discard;            <-- Action with no arguments, test, or command block
fileinto "folder";  <-- Action with an argument
        

At the time of this writing, there are no controls defined that accept both arguments and a test. Similarly, there are currently no defined actions that allow either a test or a command block. Nevertheless, the Sieve grammar allows such constructs to be defined by some future extension.

この執筆時点では、引数とテストの両方を受け入れるコントロールは定義されていません。同様に、テストまたはコマンドブロックのいずれかを許可する定義されたアクションはありません。それにもかかわらず、ふるい文法により、そのような構成要素が将来の拡張によって定義されることができます。

A test consists of an identifier followed by zero or more arguments, then another test or test-list. Unlike commands, tests cannot be followed by a command block.

テストは、識別子で構成され、その後にゼロ以上の引数が続き、次に別のテストまたはテストリストがあります。コマンドとは異なり、テストに続いてコマンドブロックが続くことはできません。

Here are some examples of Sieve tests. Note that such tests have to appear as part of a command in order to be syntactically valid:

ふるいテストの例をいくつか紹介します。このようなテストは、構文的に有効になるためには、コマンドの一部として表示されなければならないことに注意してください。

   true                <-- Test with no argument or subordinate test
   envelope "to" "me@example.com" <-- Test with several arguments
   header :is "from" "you@example.com" <-- Test with tagged argument
        

Command or test arguments can be either string lists, whole numbers, or tags. (Tags are simply identifiers preceded by a colon.) Note that although the Sieve grammar treats single strings as a degenerate case of a string list, some tests or actions have arguments that can only be individual strings, not lists.

コマンドまたはテストの引数は、文字列リスト、整数、またはタグのいずれかです。(タグは、コロンが先行する単純な識別子です。)Sive Grammarは単一の文字列を文字列リストの退化したケースとして扱いますが、一部のテストまたはアクションには、リストではなく個々の文字列のみである可能性があることに注意してください。

Here is an example showing the use of both a test-list and a string list:

以下は、テストリストと文字列リストの両方の使用を示す例です。

   if anyof (not exists ["From", "Date"],
             header :contains "from" "fool@example.edu") {
     discard;
   }
        

Extensions can add new controls, actions, tests, or arguments to existing controls or actions. Extensions have also changed how string content is interpreted, although this is not relevant to this specification. However, it is especially important to note that so far, only one of the many defined Sieve extensions -- the foreverypart extension [RFC5703] -- has added new controls to the language. It seems safe to assume that, due to their nature, future addition of controls will be relatively rare.

拡張機能は、既存のコントロールまたはアクションに新しいコントロール、アクション、テスト、または引数を追加できます。拡張機能も文字列コンテンツの解釈方法を変更しましたが、これはこの仕様には関係ありません。ただし、これまでのところ、多くの定義されたふるい拡張機能の1つであるForeverypart Extension [RFC5703]が言語に新しいコントロールを追加したことに注意することが特に重要です。その性質上、将来のコントロールの追加は比較的まれであると想定するのは安全だと思われます。

Finally, comments are allowed between lexical elements in a Sieve script. One important use case for comments is encoding meta-data about the script, a facility that is lacking in the Sieve language. Therefore, comments need to be preserved in the XML representation.

最後に、ふるいスクリプトの語彙要素間でコメントが許可されます。コメントの重要なユースケースの1つは、スクリプトに関するメタデータをエンコードすることです。これは、ふるい言語に欠けている施設です。したがって、コメントはXML表現に保存する必要があります。

4. XML Representation of Sieve
4. ふるいのXML表現

Sieve controls and actions are represented in XML as "control" or "action" elements, respectively. The command's identifier appears as a name attribute on the element itself. This is the only attribute allowed on controls and actions -- arguments, tests, test-lists, and nested command blocks are all represented as nested elements. While naming the element after the control or action itself may seem like a better choice, doing so would result in extensions requiring frequent corresponding schema changes.

ふるいのコントロールとアクションは、XMLでそれぞれ「コントロール」または「アクション」要素として表されます。コマンドの識別子は、要素自体の名前属性として表示されます。これは、コントロールとアクションで許可される唯一の属性です。引数、テスト、テストリスト、ネストされたコマンドブロックはすべてネストされた要素として表されます。コントロールまたはアクション自体の後に要素に名前を付けることは、より良い選択のように思えるかもしれませんが、そうすることで、頻繁に対応するスキーマの変更が必要な拡張機能になります。

The example Sieve controls shown in the previous section would be represented as these XML fragments:

前のセクションに示されているシーブコントロールの例は、これらのXMLフラグメントとして表されます。

    <control name="stop"/>
        
    <control name="require"><str>fileinto</str></control>
        
    <control name="if">
     <test name="true"/><control name="stop"/>
    </control>
        

The example Sieve actions shown above would appear in XML as:

上記のシーブアクションの例は、XMLに次のように表示されます。

   <action name="discard"/>
   <action name="fileinto"><str>folder</str></action>
        

The separation of controls from actions in the XML representation means that conversion from normal Sieve format to XML has to be able to distinguish between controls and actions. This is easily done by maintaining a list of all known controls since experience indicates new controls are rarely added. At the time of this writing, the list of defined controls consists of:

XML表現内のアクションからコントロールを分離することは、通常のふるい形式からXMLへの変換が、コントロールとアクションを区別できる必要があることを意味します。これは、新しいコントロールがめったに追加されないことを示すため、すべての既知のコントロールのリストを維持することで簡単に実行できます。この執筆時点で、定義されたコントロールのリストは以下で構成されています。

1. if [RFC5228],

1. [rfc5228]の場合、

2. stop [RFC5228],

2. 停止[rfc5228]、

3. require [RFC5228],

3. [RFC5228]が必要です

4. foreverypart [RFC5703], and

4. ForeveryPart [RFC5703]、および

5. break [RFC5703].

5. ブレイク[RFC5703]。

It should be noted that with this approach unknown controls will simply be treated as actions and can be passed back and forth between the two representations. The treatment of a control as an action is unlikely to cause other issues since knowledge of a control's language semantics is almost always required to take advantage of it.

このアプローチでは、不明なコントロールは単にアクションとして扱われ、2つの表現の間で前後に渡すことができることに注意する必要があります。コントロールの言語セマンティクスの知識がほとんど常にそれを利用するために必要であるため、アクションとしてのコントロールの扱いは他の問題を引き起こす可能性は低いです。

Tests are represented in the same basic way as controls and actions, that is, as a "test" element with a name attribute giving the test identifier. For example, the following XML fragments show various types of tests:

テストは、コントロールとアクションと同じ基本的な方法で表されます。つまり、テスト識別子を与える名前属性を持つ「テスト」要素として表されます。たとえば、次のXMLフラグメントは、さまざまなタイプのテストを示しています。

   <test name="true"/>
        
   <test name="envelope"/>
     <str>to</str><str>me@example.com</str>
   </test>
        
   <test name="header"/>
     <tag>is</tag><str>from</str><str>you@example.com</str>
   </test>
        

String, number, and tag arguments are represented as "str", "num", and "tag" elements, respectively. The actual string, number, or tag identifier appears as text inside the element. None of these elements have any defined attributes. Several examples of arguments have already appeared in the preceding control, action, and test examples. Any whitespace in the str body content MUST be preserved by the processor. Also, note that since strings and tags are represented as element text, any quotes or other syntactic elements required in the regular Sieve representation are dropped rather than being carried over into the XML.

文字列、数字、タグ引数は、それぞれ「str」、「num」、および「タグ」要素として表されます。実際の文字列、番号、またはタグ識別子は、要素内のテキストとして表示されます。これらの要素には、定義された属性はありません。議論のいくつかの例が、前のコントロール、アクション、およびテストの例にすでに登場しています。STRボディの含有量の空白は、プロセッサによって保存する必要があります。また、文字列とタグは要素テキストとして表されるため、通常のふるい表現に必要な引用符または他の構文要素は、XMLに持ち越されるのではなく、ドロップされることに注意してください。

String list arguments are represented as a "list" element, which in turn contains one or more str elements. Note that this allows the distinction between a single string and a string list containing a single string to be preserved. This is not essential since a list containing a single string could simply be mapped to a string, but it seems prudent to maintain the distinction when mapping to and from XML.

文字列リスト引数は「リスト」要素として表され、1つ以上のSTR要素が含まれます。これにより、単一の文字列と文字列リストを含む文字列リストが保持されることに注意してください。単一の文字列を含むリストは単に文字列にマッピングできるため、これは不可欠ではありませんが、XMLとの間でマッピングするときに区別を維持することは賢明なようです。

Nested command blocks appear as a series of control or action elements inside of an outer control or action element. No block element is needed since an inner command block can only appear once and only after any arguments, tests, or test-lists. For example:

ネストされたコマンドブロックは、外側のコントロールまたはアクション要素内の一連のコントロールまたはアクション要素として表示されます。内側のコマンドブロックは、引数、テスト、またはテストリストの後にのみ1回しか表示されないため、ブロック要素は必要ありません。例えば:

   <control name="if">
     <test name="anyof">
       <test name="not">
         <test name="exists">
           <list><str>From</str><str>Date</str></list>
         </test>
       </test>
       <test name="header">
         <tag>contains</tag>
         <str>from</str>
         <str>fool@example.edu</str>
       </test>
     </test>
     <action name="discard"/>
   </control>
        

Sieve comments are mapped to a special "comment" element in XML. Both hash and bracketed comments are mapped to the same construct so the distinction between the two is lost in XML. XML comments are not used because some XML tools do not make it convenient to access comment nodes.

ふるいコメントは、XMLの特別な「コメント」要素にマッピングされます。ハッシュコメントとブラケットの両方のコメントは同じコンストラクトにマッピングされるため、XMLで2つの区別が失われます。一部のXMLツールはコメントノードにアクセスするのに便利ではないため、XMLコメントは使用されません。

Comments are allowed between commands and inside "test" elements. But comments aren't allowed directly inside commands -- due to limitations of XML Schema, special enclosing "preamble" and "postamble" elements are needed:

コマンドと内部の「テスト」要素の間でコメントが許可されます。しかし、コメントはコマンド内に直接許可されていません - XMLスキーマの制限により、特別な囲まれた「プリアンブル」と「ポストインク」要素が必要です。

   <control name="if">
     <preamble>
       <comment>Check to see if message should be discarded</comment>
     </preamble>
     <test name="anyof">
       <test name="not">
         <test name="exists">
           <list><str>From</str><str>Date</str></list>
         </test>
       </test>
       <test name="header">
         <tag>contains</tag>
         <str>from</str>
         <str>fool@example.edu</str>
       </test>
     </test>
     <action name="discard"/>
     <postamble>
       <comment>End of discard check</comment>
     </postamble>
   </control>
        
4.1. XML Display Directives
4.1. XML表示ディレクティブ

Sometimes graphical user interfaces are a convenient way to provide Sieve management functions to users. These interfaces typically summarize/annotate/group/display Sieve script(s) in an intuitive way for end users.

グラフィカルユーザーインターフェイスは、ユーザーにふるい管理機能を提供する便利な方法である場合があります。これらのインターフェイスは通常、エンドユーザーのために直感的な方法で、ふるいスクリプトを要約/グループ/ディスプレイシーブスクリプトを要約します。

To do this effectively, the graphical user interface may require additional information about the Sieve script itself. That information or "meta-data" might include, but is not limited to, a Sieve name (identifying the current Sieve), whether the Sieve is enabled or disabled, and the order in which the parts of the Sieve are presented to the user. The graphical user interface may also choose to provide mechanisms to allow the user to modify the script.

これを効果的に行うには、グラフィカルユーザーインターフェイスには、ふるいスクリプト自体に関する追加情報が必要になる場合があります。その情報または「メタデータ」には、ふるい名前(現在のふるいを識別する)、ふるいが有効であるか無効になっているか、およびふるいの部分がユーザーに提示される順序が含まれるかもしれませんが、これらに限定されないかもしれません。。グラフィカルユーザーインターフェイスは、ユーザーがスクリプトを変更できるようにするメカニズムを提供することもできます。

It is often useful for a graphical user interface to group related Sieve script elements and provide an interface that displays these groups separately so they can be managed as a single object. Some examples include Sieve statements that together provide vacation responders, blacklists/whitelists, and other types of filtering controls.

多くの場合、グラフィカルなユーザーインターフェイスがグループ関連のシーブスクリプト要素に合わせて役立ち、これらのグループを個別に表示して単一のオブジェクトとして管理できるインターフェイスを提供します。いくつかの例には、休暇対応者、ブラックリスト/ホワイトリスト、およびその他の種類のフィルタリングコントロールを提供するふるいの声明が含まれます。

Some advanced graphical user interfaces may even provide a natural language representation of a Sieve script and/or an advanced interface to present Sieve statements directly to the user.

いくつかの高度なグラフィカルユーザーインターフェイスは、ふるいスクリプトおよび/または高度なインターフェイスの自然言語表現を提供して、ユーザーに直接ふるい声明を提示することもできます。

A graphical user interface may also choose to support only a subset of action commands in the Sieve language (and its extensions), and so a mechanism to indicate the extent of support and characterize the relationships between those supported action commands and the test (with its arguments) is immensely useful and probably required for clients that may not have complete knowledge of Sieve grammar and semantics.

グラフィカルユーザーインターフェイスは、ふるい言語(およびその拡張)のアクションコマンドのサブセットのみをサポートすることも選択できます。したがって、サポートの範囲を示し、サポートされているアクションコマンドとテストとの関係を特徴付けるメカニズム(議論)は非常に有用であり、おそらくふるいの文法とセマンティクスの完全な知識を持っていないかもしれないクライアントに必要です。

The Sieve language contains no mechanisms for indicating how a given script should be presented in a user interface. The language also does not contain any specific mechanisms to represent other sorts of meta-data about the script. Providing support for such meta-data as part of a Sieve script is currently totally implementation specific and is usually done by imposing some type of structure on comments.

ふるい言語には、特定のスクリプトをユーザーインターフェイスでどのように表示するかを示すメカニズムが含まれていません。言語には、スクリプトに関する他の種類のメタデータを表す特定のメカニズムも含まれていません。ふるいスクリプトの一部としてそのようなメタデータをサポートすることは現在、完全に実装固有であり、通常、コメントに何らかのタイプの構造を課すことによって行われます。

However, such information can be represented in XML very easily, so it makes sense to define a framework to do this as part of the XML format. Implementations MAY choose to use structured comments to retain this information when the script is converted to normal Sieve format.

ただし、そのような情報はXMLで非常に簡単に表現できるため、XML形式の一部としてこれを行うフレームワークを定義することは理にかなっています。実装は、スクリプトが通常のふるい形式に変換されたときに、構造化されたコメントを使用してこの情報を保持することを選択できます。

The sample schemata for the XML representation of Sieve allows XML in foreign namespaces to be inserted in the same places "comment" elements can appear in Sieve scripts. This is the preferred means of including additional information. Alternately, the schema defines two display directives -- displayblock and displaydata -- as containers for meta-data needed by graphical user interfaces.

ふるいのXML表現のサンプルスキーマにより、外国の名前空間のXMLを同じ場所に挿入することができます。これは、追加情報を含めることの好ましい手段です。あるいは、スキーマは、グラフィカルユーザーインターフェイスで必要なメタデータのコンテナとして、DisplayBlockとDisplayDataの2つのディスプレイディレクティブを定義します。

Editors MAY use displayblock, displaydata, and foreign namespaces to associate meta-data. Some editors find it inconvenient to preserve this additional data during an editing session. Editors MAY preserve this data during an editing session for compatibility with other editors.

編集者は、DisplayBlock、DisplayData、および外国の名前空間を使用して、メタデータを関連付けることができます。一部の編集者は、編集セッション中にこの追加データを保存することは不便だと感じています。編集者は、他の編集者との互換性のために編集セッション中にこのデータを保存する場合があります。

The displayblock element can be used to enclose any number of Sieve statements at any level. It is semantically meaningless to the Sieve script itself. It allows an arbitrary set of attributes. Implementations MAY use this to provide many simple, display-related meta-data for the Sieve such as Sieve identifier, group identifier, order of processing, etc.

DisplayBlock要素を使用して、あらゆるレベルで任意の数のふるいステートメントを囲むことができます。それは、ふるいスクリプト自体にとって意味的に意味がありません。任意の属性セットを許可します。実装はこれを使用して、ふるい識別子、グループ識別子、処理順など、ふるいに多くのシンプルなディスプレイ関連メタデータを提供する場合があります。

The displaydata element supports any number of arbitrary child elements. Implementations MAY use this to represent complex data about that Sieve such as a natural language representation of Sieve or a way to provide the Sieve script directly.

DisplayData要素は、任意の任意の子要素を任意の数のサポートしています。実装はこれを使用して、ふるいの自然言語表現やふるいスクリプトを直接提供する方法など、そのふるいに関する複雑なデータを表す場合があります。

4.2. Structured Comments
4.2. 構造化されたコメント

Since the XML representation is not intended as a storage format, there needs to be a way to preserve the additional information that can be included in the XML representation in the normal Sieve syntax. This is done through the use of three structured comment conventions:

XML表現はストレージ形式として意図されていないため、通常のふるいの構文のXML表現に含めることができる追加情報を保存する方法が必要です。これは、3つの構造化されたコメント規則を使用して行われます。

1. XML content in other namespaces is placed in Sieve bracketed comments beginning with the string "/* [/" and ending with the string "/] */".

1. 他の名前空間のXMLコンテンツは、文字列 "/ * [/"から始まり、文字列 "/] */"で終了するSiveブラケットのコメントに配置されます。

2. The content of displaydata elements is placed in Sieve bracketed comments beginning with the string "/* [|" and ending with the string "|] */".

2. DisplayData要素の内容は、文字列「/* [|」から始まるふるいブラケットのコメントに配置されます。文字列「|] */」で終わります。

3. The beginning of a displayblock element is mapped to a bracketed Sieve comment beginning with the string "/* [*", which then lists any displayblock attribute names and values in XML format. The end of a displayblock element is mapped to a comment of the form "*] */".

3. DisplayBlock要素の先頭は、文字列「/* [*」で始まるブラケットのシーブコメントにマッピングされ、XML形式のDisplayBlock属性名と値をリストします。displayblock要素の端は、フォーム「 *] */」のコメントにマッピングされます。

Processors MUST preserve the additional information allowed in the XML format and SHOULD use the structured comment format shown above.

プロセッサは、XML形式で許可されている追加情報を保存する必要があり、上記の構造化されたコメント形式を使用する必要があります。

Note: If "*/" is found in the XML content, when mapped into a comment, it would prematurely terminate that comment. Escaping this sequence would often be inconvenient for processors. Editors SHALL NOT include "*/" within displayblock, displaydata, or foreign markup. Processors MAY regard documents containing "*/" in foreign markup, displayblock, or displaydata as invalid.

注:「*/」がXMLコンテンツで見つかった場合、コメントにマッピングすると、そのコメントを早めに終了します。このシーケンスを逃れることは、しばしばプロセッサにとって不便です。編集者は、displayblock、displaydata、または外国マークアップ内に「*/」を含めてはなりません。プロセッサは、外部マークアップ、DisplayBlock、またはDisplayDataの「*/」を含むドキュメントを無効と見なす場合があります。

4.3. Validation
4.3. 検証

A processor MAY validate documents against a schema, and it MAY reject any that do not conform. For any document that a processor does not reject as invalid, any markup that the processor cannot understand by reference to this specification MAY be discarded.

プロセッサは、スキーマに対してドキュメントを検証する場合があり、適合していないものを拒否する場合があります。プロセッサが無効として拒否されないドキュメントの場合、この仕様を参照することでプロセッサが理解できないマークアップが破棄される場合があります。

Note that example Relax NG and XML Schema are given in the appendices below.

例のリラックスNGおよびXMLスキーマは、以下の付録に記載されていることに注意してください。

5. Security Considerations
5. セキュリティに関する考慮事項

Any syntactically valid Sieve script can be represented in XML. Accordingly, all security considerations applicable to Sieve and any extensions used also apply to the XML representation.

構文的に有効なふるいスクリプトは、XMLで表すことができます。したがって、ふるいに適用されるすべてのセキュリティ上の考慮事項および使用される拡張機能もXML表現にも適用されます。

The use of XML carries its own security risks. Section 7 of RFC 3470 [RFC3470] discusses these risks.

XMLの使用には、独自のセキュリティリスクがあります。RFC 3470 [RFC3470]のセクション7では、これらのリスクについて説明しています。

It is axiomatic that a Sieve editor must be trusted to do what the user specifies. If XML formats are used, this trust necessarily must extend to the components involved in converting to and from XML format.

ふるいエディターがユーザーが指定したことを行うことを信頼しなければならないことは公理的です。XML形式が使用される場合、この信頼は必然的にXML形式との変換に関与するコンポーネントに拡張する必要があります。

Arbitrary data can be included using other namespaces or placed in the extensible displayblock and displaydata constructs defined in this specification, possibly including entire scripts and other executable content in languages other than Sieve. Such material will necessarily have its own security considerations, which are beyond the scope of this document.

任意のデータは、他の名前空間を使用して含めるか、この仕様で定義された拡張可能なDisplayBlockおよびDisplayDataコンストラクトに配置することができます。このような資料には、この文書の範囲を超えた独自のセキュリティに関する考慮事項が必然的にあります。

6. IANA Considerations
6. IANAの考慮事項

This section registers a new XML namespace per the procedures in RFC 3688 [RFC3688].

このセクションでは、RFC 3688 [RFC3688]の手順ごとに新しいXML名前空間を登録します。

   URI:  urn:ietf:params:xml:ns:sieve
        
   Registrant Contact:  IETF Sieve working group
                        <ietf-mta-filters@imc.org>
        

XML:

XML:

     BEGIN
     <?xml version="1.0"?>
     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
       "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
     <html xmlns="http://www.w3.org/1999/xhtml">
     <head>
       <meta http-equiv="content-type"
             content="text/html;charset=iso-8859-1"/>
       <title>Sieve Namespace</title>
     </head>
     <body>
       <h1>Namespace for Sieve Language objects expressed in XML</h1>
       <h2>urn:ietf:params:xml:ns:sieve</h2>
       <p>See <a href="http://www.rfc-editor.org/rfc/rfc5784.txt">
        RFC 5784</a>.
       </p>
     </body>
     </html>
     END
        
7. References
7. 参考文献
7.1. Normative References
7.1. 引用文献

[OASISRNC] Clark, J., "RELAX NG Compact Syntax", OASIS Committee Specification rnc, November 2002.

[Oasisrnc] Clark、J。、「Compact Syntaxのリラックス」、Oasis委員会仕様RNC、2002年11月。

[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.

[RFC2119] Bradner、S。、「要件レベルを示すためにRFCで使用するためのキーワード」、BCP 14、RFC 2119、1997年3月。

[RFC3470] Hollenbeck, S., Rose, M., and L. Masinter, "Guidelines for the Use of Extensible Markup Language (XML) within IETF Protocols", BCP 70, RFC 3470, January 2003.

[RFC3470] Hollenbeck、S.、Rose、M。、およびL. Masinter、「IETFプロトコル内の拡張マークアップ言語(XML)の使用に関するガイドライン」、BCP 70、RFC 3470、2003年1月。

[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, January 2004.

[RFC3688] Mealling、M。、「IETF XMLレジストリ」、BCP 81、RFC 3688、2004年1月。

[RFC5228] Guenther, P. and T. Showalter, "Sieve: An Email Filtering Language", RFC 5228, January 2008.

[RFC5228] Guenther、P。およびT. Showalter、「Sieve:An Email Filtering Language」、RFC 5228、2008年1月。

[XML] Bray, T., Paoli, J., Sperberg-McQueen, C., Maler, E., and F. Yergeau, "Extensible Markup Language (XML) 1.0 (Fifth Edition)", W3C REC-xml-20081126, November 2008, <http://www.w3.org/TR/2008/REC-xml-20081126/>.

[XML] Bray、T.、Paoli、J.、Sperberg-Mcqueen、C.、Maler、E。、およびF. Yergeau、「拡張可能なマークアップ言語(XML)1.0(第5版)」、W3C REC-XML-20081126、2008年11月、<http://www.w3.org/tr/2008/rec-xml-20081126/>。

7.2. Informative References
7.2. 参考引用

[RFC5183] Freed, N., "Sieve Email Filtering: Environment Extension", RFC 5183, May 2008.

[RFC5183] Freed、N。、「Sieve Emailフィルタリング:環境拡張」、RFC 5183、2008年5月。

[RFC5229] Homme, K., "Sieve Email Filtering: Variables Extension", RFC 5229, January 2008.

[RFC5229] Homme、K。、「Sieve Emailフィルタリング:変数拡張」、RFC 5229、2008年1月。

[RFC5230] Showalter, T. and N. Freed, "Sieve Email Filtering: Vacation Extension", RFC 5230, January 2008.

[RFC5230] Showalter、T。and N. Freed、「Sieve Emailフィルタリング:休暇拡張」、RFC 5230、2008年1月。

[RFC5231] Segmuller, W. and B. Leiba, "Sieve Email Filtering: Relational Extension", RFC 5231, January 2008.

[RFC5231] Segmuller、W。およびB. Leiba、「Sieve Emailフィルタリング:リレーショナルエクステンション」、RFC 5231、2008年1月。

[RFC5232] Melnikov, A., "Sieve Email Filtering: Imap4flags Extension", RFC 5232, January 2008.

[RFC5232] Melnikov、A。、「Sieve Emailフィルタリング:IMAP4FLAGS拡張機能」、RFC 5232、2008年1月。

[RFC5233] Murchison, K., "Sieve Email Filtering: Subaddress Extension", RFC 5233, January 2008.

[RFC5233]マーチソン、K。、「シーブメールフィルタリング:SubAddress Extension」、RFC 5233、2008年1月。

[RFC5235] Daboo, C., "Sieve Email Filtering: Spamtest and Virustest Extensions", RFC 5235, January 2008.

[RFC5235] Daboo、C。、「Sieve Emailフィルタリング:スパムテストとVirustest Extensions」、RFC 5235、2008年1月。

[RFC5293] Degener, J. and P. Guenther, "Sieve Email Filtering: Editheader Extension", RFC 5293, August 2008.

[RFC5293] Degener、J。およびP. Guenther、「Sieve Emailフィルタリング:Editheader Extension」、RFC 5293、2008年8月。

[RFC5703] Hansen, T. and C. Daboo, "Sieve Email Filtering: MIME Part Tests, Iteration, Extraction, Replacement, and Enclosure", RFC 5703, October 2009.

[RFC5703] Hansen、T。およびC. Daboo、「Sieve Emailフィルタリング:MIMEパーツテスト、反復、抽出、交換、およびエンクロージャー」、RFC 5703、2009年10月。

Appendix A. Extended Example
付録A. 拡張例

The example Sieve script given in Section 9 of [RFC5228] would be represented in XML as the following code component:

[RFC5228]のセクション9に記載されているシーブスクリプトの例は、XMLで次のコードコンポーネントとして表されます。

   <sieve xmlns="urn:ietf:params:xml:ns:sieve">
     <comment>
       Example Sieve Filter
       Declare any optional features or extensions used by the script
     </comment>
        
     <control name="require">
       <str>fileinto</str>
     </control>
     <comment>
       Handle messages from known mailing lists.
       Move messages from IETF filter discussion list to filter mailbox.
     </comment>
     <control name="if">
       <test name="header">
         <tag>is</tag>
         <str>Sender</str>
         <str>owner-ietf-mta-filters@imc.org</str>
       </test>
       <action name="fileinto">
         <str>filter</str>
       </action>
       <postamble>
         <comment>move to "filter" mailbox</comment>
       </postamble>
     </control>
        
     <comment>
       Keep all messages to or from people in my company.
     </comment>
     <control name="elsif">
       <test name="address">
         <tag>domain</tag>
         <tag>is</tag>
         <list>
           <str>From</str>
           <str>To</str>
         </list>
         <str>example.com</str>
       </test>
       <action name="keep"/>
     </control>
        
     <comment>
       Try and catch unsolicited email.  If a message is not to me,
       or it contains a subject known to be spam, file it away.
     </comment>
     <control name="elsif">
       <test name="anyof">
         <test name="not">
           <test name="address">
             <tag>all</tag>
             <tag>contains</tag>
             <list>
               <str>To</str>
               <str>Cc</str>
               <str>Bcc</str>
             </list>
             <str>me@example.com</str>
           </test>
         </test>
         <test name="header">
           <tag>matches</tag>
           <str>subject</str>
           <list>
             <str>*make*money*fast*</str>
             <str>*university*dipl*mas*</str>
           </list>
         </test>
       </test>
       <action name="fileinto">
         <str>spam</str>
       </action>
     </control>
     <control name="else">
       <preamble>
         <comment>
           Move all other (non-company) mail to "personal"
           mailbox.
         </comment>
       </preamble>
       <action name="fileinto">
         <str>personal</str>
       </action>
     </control>
        

</sieve> The same script could be annotated with graphical display hints in a variety of ways. Three possible code components that do this are:

</sieve>同じスクリプトに、さまざまな方法でグラフィカルディスプレイのヒントを注釈することができます。これを行う3つの可能なコードコンポーネントは次のとおりです。

   <sieve xmlns="urn:ietf:params:xml:ns:sieve">
        
     <control name="require">
       <str>fileinto</str>
     </control>
        
     <displayblock name="File filter list mail" order="1"
                   group="FILE_TO_FOLDER" enable="true">
       <control name="if">
         <test name="header">
           <tag>is</tag>
           <str>Sender</str>
           <str>owner-ietf-mta-filters@imc.org</str>
         </test>
         <action name="fileinto">
           <str>filter</str>
         </action>
       </control>
     </displayblock>
        
     <displayblock name="Keep all company mail" order="2"
                   group="KEEP_MESSAGE" enable="true">
       <control name="elsif">
         <test name="address">
           <tag>domain</tag>
           <tag>is</tag>
           <list>
             <str>From</str>
             <str>To</str>
           </list>
           <str>example.com</str>
         </test>
         <action name="keep"/>
      </control>
     </displayblock>
        
     <displayblock name="File suspected spam" order="3"
                   group="FILE_TO_FOLDER" enable="true">
        <control name="elsif">
          <test name="anyof">
            <test name="not">
              <test name="address">
                <tag>all</tag>
                <tag>contains</tag>
                <list>
        
                  <str>To</str>
                  <str>Cc</str>
                  <str>Bcc</str>
                </list>
                <str>me@example.com</str>
              </test>
            </test>
            <test name="header">
              <tag>matches</tag>
              <str>subject</str>
              <list>
                <str>*make*money*fast*</str>
                <str>*university*dipl*mas*</str>
              </list>
            </test>
          </test>
          <action name="fileinto">
            <str>spam</str>
          </action>
        </control>
      </displayblock>
        
     <displayblock name="File noncompany mail as personal" order="4"
                   group="FILE_TO_FOLDER" enable="true">
       <control name="else">
         <action name="fileinto">
           <str>personal</str>
         </action>
       </control>
     </displayblock>
        

</sieve>

</sieve>

Note that since displayblock elements are semantically null as far as the script itself is concerned, they can be used to group structures like elsif and else that are tied to statements in other groups.

DisplayBlock要素は、スクリプト自体に関する限り、意味的にヌルであるため、Elsifなどの構造をグループ化するために使用できます。

The representation of this script in regular Sieve syntax uses structured comments:

通常のふるいの構文でのこのスクリプトの表現は、構造化されたコメントを使用します。

   require "fileinto";
   /* [* name="File filter list mail" order="1"
         group="FILE_TO_FOLDER" enable="true" */
   if header :is "Sender" "owner-ietf-mta-filters@imc.org"
   {
     fileinto "filter";
   }
   /* *] */
   /* [* name="Keep all company mail" order="2"
         group="KEEP_MESSAGE" enable="true" */
   elsif address :domain :is [ "From", "To" ] "example.com"
   {
     keep;
   }
   /* *] */
   /* [* name="File suspected spam" order="3"
         group="FILE_TO_FOLDER" enable="true" */
   elsif anyof ( not ( address :all :contains [ "To", "Cc", "Bcc" ]
                       "me@example.com" ),
                 header :matches "subject" [ "*make*money*fast*",
                                             "*university*dipl*mas*" ] )
   {
     fileinto "spam";
   }
   /* *] */
   /* [* name="File noncompany mail as personal" order="4"
         group="FILE_TO_FOLDER" enable="true" */
   else
   {
     fileinto "personal";
   }
   /* *] */
      A separate namespace can be used to embed text or structured
   information:
        
   <sieve xmlns="urn:ietf:params:xml:ns:sieve"
          xmlns:nls="http://example.com/nls">
        

<nls:interpretation> If the email header "Sender" is owner-ietf-mta-filters@imc.org, then file it into the "filter" folder.

<nls:解釈>電子メールヘッダー「送信者」が所有者-ietf-mta-filters@imc.orgである場合、「フィルター」フォルダーにファイルします。

Otherwise, if the address in the "From" or "To" has a domain that is "example.com", then keep it.

それ以外の場合、「from」または「to」のアドレスが「emple.com」であるドメインがある場合は、それを保持します。

Otherwise, messages meeting with any of these conditions:

それ以外の場合、これらの条件のいずれかと会うメッセージ:

(1) None of the addresses in "To", "Cc", or "Bcc" contain the domain "example.com".

(1) 「to」、「cc」、または「bcc」のアドレスは、ドメイン「example.com」を含んでいません。

(2) The "Subject" field matches the pattern *make*money*fast* or *university*dipl*mas*, then file it into the "spam" folder.

(2) 「件名」フィールドは、パターン*make*make*money*fast*or*diply*mas*と一致し、「スパム」フォルダーにファイルします。

If all else fails, then file the message in the "personal" folder. </nls:interpretation>

他のすべてが失敗した場合は、「個人」フォルダーにメッセージを提出します。</nls:解釈>

... the actual Sieve script ...

...実際のふるいスクリプト...

</sieve> Alternately, displaydata elements can be used to accomplish the same thing:

</sieve>交互に、displaydata要素を使用して同じことを達成できます。

   <sieve xmlns="urn:ietf:params:xml:ns:sieve">
        

<displaydata> <nls-interpretation> If the email header "Sender" is owner-ietf-mta-filters@imc.org, then file it into the "filter" folder.

<DisplayData> <NLS-interpretation>電子メールヘッダーの「送信者」が所有者のan-itf-mta-filters@imc.orgである場合、「フィルター」フォルダーにファイルします。

Otherwise, if the address in the "From" or "To" has a domain that is "example.com", then keep it.

それ以外の場合、「from」または「to」のアドレスが「emple.com」であるドメインがある場合は、それを保持します。

Otherwise, messages meeting with any of these conditions:

それ以外の場合、これらの条件のいずれかと会うメッセージ:

(1) None of the addresses in "To","Cc", or "Bcc" contain the domain "example.com".

(1) 「to」、「cc」、または「bcc」のアドレスは、ドメイン「example.com」を含んでいません。

(2) The "Subject" field matches the pattern *make*money*fast* or *university*dipl*mas*, then file it into the "spam" folder.

(2) 「件名」フィールドは、パターン*make*make*money*fast*or*diply*mas*と一致し、「スパム」フォルダーにファイルします。

If all else fails, then file the message in the "personal" folder. </nls-interpretation> </displaydata>

他のすべてが失敗した場合は、「個人」フォルダーにメッセージを提出します。</nls解釈> </displayData>

... the actual Sieve script ...

...実際のふるいスクリプト...

</sieve> Again, structured comments are used to represent this in regular Sieve syntax:

</sieve>繰り返しますが、構造化されたコメントは、通常のふるいの構文でこれを表すために使用されます。

     /* [|
       <nls-interpretation>
         If the email header "Sender" is owner-ietf-mta-filters@imc.org,
         then file it into the "filter" folder.
        

Otherwise, if the address in the "From" or "To" has a domain that is "example.com", then keep it.

それ以外の場合、「from」または「to」のアドレスが「emple.com」であるドメインがある場合は、それを保持します。

Otherwise, messages meeting with any of these conditions:

それ以外の場合、これらの条件のいずれかと会うメッセージ:

(1) None of the addresses in "To","Cc", or "Bcc" contain the domain "example.com".

(1) 「to」、「cc」、または「bcc」のアドレスは、ドメイン「example.com」を含んでいません。

(2) The "Subject" field matches the pattern *make*money*fast* or *university*dipl*mas*, then file it into the "spam" folder.

(2) 「件名」フィールドは、パターン*make*make*money*fast*or*diply*mas*と一致し、「スパム」フォルダーにファイルします。

         If all else fails, then file the message in the "personal"
         folder.
       </nls-interpretation>
     |] */
        

... the actual Sieve script ...

...実際のふるいスクリプト...

Appendix B. XML Schema for Sieves in XML
付録B. XMLのシーブ用のXMLスキーマ

This appendix is informative. The following code component is an XML Schema for the XML representation of Sieve scripts. Most of the elements employing a complex content model allow use of elements in other namespaces, subject to lax XML Schema validation rules. Additionally, displaydata elements can be used to encapsulate arbitrary XML content. Finally, displayblock elements can be used as a general-purpose grouping mechanism -- arbitrary attributes are allowed on displayblock elements.

この付録は有益です。次のコードコンポーネントは、シーブスクリプトのXML表現のXMLスキーマです。複雑なコンテンツモデルを採用している要素のほとんどは、LAX XMLスキーマ検証ルールを条件として、他の名前空間で要素を使用できます。さらに、DisplayData要素を使用して、任意のXMLコンテンツをカプセル化できます。最後に、DisplayBlock要素は、汎用グループ化メカニズムとして使用できます。DisplayBlock要素では任意の属性が許可されています。

   <?xml version="1.0" encoding="UTF-8"?>
        
   <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns="urn:ietf:params:xml:ns:sieve"
               targetNamespace="urn:ietf:params:xml:ns:sieve">
        
     <xsd:element name="sieve">
       <xsd:complexType>
         <xsd:sequence>
           <xsd:choice maxOccurs="unbounded" minOccurs="0">
        
             <xsd:element ref="control"/>
             <xsd:element ref="action"/>
             <xsd:element ref="displayblock"/>
             <xsd:element ref="displaydata"/>
             <xsd:element ref="comment"/>
             <xsd:any namespace="##other" processContents="lax"/>
           </xsd:choice>
         </xsd:sequence>
       </xsd:complexType>
     </xsd:element>
        
     <xsd:element name="comment" type="xsd:string"/>
        
     <xsd:complexType name="ambles">
       <xsd:choice minOccurs="0" maxOccurs="unbounded">
         <xsd:element ref="displaydata"/>
         <xsd:element ref="comment"/>
         <xsd:any namespace="##other" processContents="lax"/>
      </xsd:choice>
     </xsd:complexType>
        
     <xsd:element name="preamble" type="ambles"/>
     <xsd:element name="postamble" type="ambles"/>
        
     <xsd:complexType name="command">
       <xsd:sequence>
         <xsd:element ref="preamble" minOccurs="0" maxOccurs="1"/>
         <xsd:choice minOccurs="0" maxOccurs="unbounded">
           <xsd:element ref="str"/>
           <xsd:element ref="num"/>
           <xsd:element ref="list"/>
           <xsd:element ref="tag"/>
         </xsd:choice>
         <xsd:element ref="test" minOccurs="0" maxOccurs="1"/>
         <xsd:choice minOccurs="0" maxOccurs="unbounded">
           <xsd:element ref="control"/>
           <xsd:element ref="action"/>
           <xsd:element ref="displayblock"/>
         </xsd:choice>
         <xsd:element ref="postamble" minOccurs="0" maxOccurs="1"/>
       </xsd:sequence>
       <xsd:attribute use="required" name="name" type="identifier"/>
     </xsd:complexType>
        
     <xsd:element name="control" type="command"/>
     <xsd:element name="action" type="command"/>
        
     <xsd:element name="test">
        
       <xsd:complexType>
         <xsd:sequence>
           <xsd:choice minOccurs="0" maxOccurs="unbounded">
             <xsd:element ref="str"/>
             <xsd:element ref="num"/>
             <xsd:element ref="list"/>
             <xsd:element ref="tag"/>
             <xsd:element ref="displaydata"/>
             <xsd:element ref="comment"/>
             <xsd:any namespace="##other" processContents="lax"/>
           </xsd:choice>
           <xsd:element ref="test" minOccurs="0"
                        maxOccurs="unbounded"/>
         </xsd:sequence>
         <xsd:attribute use="required" name="name" type="identifier"/>
       </xsd:complexType>
     </xsd:element>
        
     <xsd:element name="list">
       <xsd:complexType>
         <xsd:sequence>
           <xsd:element ref="str" minOccurs="1"
                        maxOccurs="unbounded"/>
         </xsd:sequence>
       </xsd:complexType>
     </xsd:element>
        
     <xsd:element name="tag" type="identifier"/>
        
     <xsd:element name="str" type="xsd:string"/>
        
     <xsd:element name="num" type="xsd:nonNegativeInteger"/>
        
     <xsd:simpleType name="identifier">
       <xsd:restriction base="xsd:token">
         <xsd:pattern value="[A-Za-z_][A-Za-z0-9_]*"/>
       </xsd:restriction>
     </xsd:simpleType>
        
     <xsd:element name="displayblock">
       <xsd:complexType>
         <xsd:sequence>
           <xsd:choice minOccurs="0" maxOccurs="unbounded">
             <xsd:element ref="control"/>
             <xsd:element ref="action"/>
             <xsd:element ref="displayblock"/>
             <xsd:element ref="displaydata"/>
             <xsd:element ref="comment"/>
        
             <xsd:any namespace="##other" processContents="lax"/>
           </xsd:choice>
         </xsd:sequence>
         <xsd:anyAttribute processContents="skip"/>
       </xsd:complexType>
     </xsd:element>
        
     <xsd:element name="displaydata">
       <xsd:complexType>
         <xsd:sequence minOccurs="0" maxOccurs="unbounded">
           <xsd:any processContents="skip"/>
         </xsd:sequence>
       </xsd:complexType>
     </xsd:element>
        
   </xsd:schema>
        
Appendix C. Relax NG Schema for Sieves in XML
付録C. XMLのシーブ用のNGスキーマをリラックスします

This appendix is informative. The following code component defines a Relax NG Schema using compact notation OASISRNC [OASISRNC] for the XML representation of Sieve scripts. Most of the elements employing a complex content model allow unrestricted use of elements in other namespaces. Additionally, displaydata elements can be used to encapsulate arbitrary XML content. Finally, displayblock elements can be used as a general-purpose grouping mechanism -- arbitrary attributes are allowed on displayblock elements.

この付録は有益です。次のコードコンポーネントは、シーブスクリプトのXML表現にコンパクトな表記OASISRNC [OASISRNC]を使用して、緩和ngスキーマを定義します。複雑なコンテンツモデルを使用している要素のほとんどは、他の名前空間で要素を無制限に使用できるようにします。さらに、DisplayData要素を使用して、任意のXMLコンテンツをカプセル化できます。最後に、DisplayBlock要素は、汎用グループ化メカニズムとして使用できます。DisplayBlock要素では任意の属性が許可されています。

   namespace sieve = "urn:ietf:params:xml:ns:sieve"
        
   start = element sieve:sieve { ( control | action | displayblock |
                                   displaydata | comment | ext )* }
        
   comment = element sieve:comment { xsd:string }
        

ambles = ( ( displaydata | comment | ext )* ), empty

ambles =((displaydata | comment | ext)*)、empty

   preamble = element sieve:preamble { ambles }
   postamble = element sieve:postamble { ambles }
        
   command =
      (
         attribute name {
           xsd:token {
        
             pattern = "[A-Za-z_][A-Za-z0-9_]*" } },
         preamble?,
         ( str | num | \list | tag )*,
         test?,
         ( control | action | displayblock)*,
         postamble?
      ),
      empty
        
   control = element sieve:control { command }
   action = element sieve:action { command }
        
   test =
      element sieve:test
      {
         attribute name {
           xsd:token {
             pattern = "[A-Za-z_][A-Za-z0-9_]*" } },
         ( str | num | \list | tag | comment | ext )*,
         test*
      }
        
   \list = element sieve:list { str+ }
        
   tag = element sieve:tag {
           xsd:token {
             pattern = "[A-Za-z_][A-Za-z0-9_]*" } }
        
   str = element sieve:str { xsd:string }
        
   num = element sieve:num { xsd:nonNegativeInteger }
        
   any = ( element * { any } | attribute * { text } | text )*
        
   ext = element * - sieve:* { any }*
        
   displayblock =
      element sieve:displayblock
      {
         ( control | action | displayblock |
           displaydata | comment | ext )*,
         attribute * { text }*
      }
        
   displaydata = element sieve:displaydata { any* }
        
Appendix D. Stylesheet for Conversion from XML
付録D. XMLからの変換のためのStyleSheet

This appendix is informative. The following code component is a stylesheet that can be used to convert the Sieve in XML representation to regular Sieve format. Content in other namespaces, displaydata, and displayblock elements are converted to structured comments as appropriate.

この付録は有益です。次のコードコンポーネントは、XML表現のふるいを通常のふるい形式に変換するために使用できるスタイルシートです。他の名前空間、DisplayData、およびDisplayBlock要素のコンテンツは、必要に応じて構造化されたコメントに変換されます。

   <?xml version="1.0" encoding="UTF-8"?>
        
   <!-- Convert Sieve in XML to standard Sieve syntax -->
        
   <xsl:stylesheet version="1.0"
                   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                   xmlns:sieve="urn:ietf:params:xml:ns:sieve">
        
     <xsl:output method="text" encoding="UTF-8"
                 media-type="application/sieve"/>
        
     <!-- Only preserve whitespace in str elements -->
     <xsl:strip-space elements="*"/>
     <xsl:preserve-space elements="sieve:str"/>
        
     <!-- Match top level sieve node,
          start processing in sieve mode -->
        
     <xsl:template match="sieve:sieve">
       <xsl:apply-templates select="*" mode="sieve">
         <xsl:with-param name="prefix" select="''"/>
       </xsl:apply-templates>
     </xsl:template>
        
     <!-- Routine to properly literalize quotes in Sieve strings -->
        
     <xsl:template name="quote-string">
       <xsl:param name="str"/>
       <xsl:choose>
         <xsl:when test="not($str)"/>
         <xsl:when test="contains($str, '&quot;')">
           <xsl:call-template name="quote-string">
             <xsl:with-param name="str"
                select="substring-before($str, '&quot;')"/>
           </xsl:call-template>
           <xsl:text>\&quot;</xsl:text>
           <xsl:call-template name="quote-string">
             <xsl:with-param name="str"
                select="substring-after($str, '&quot;')"/>
           </xsl:call-template>
        
         </xsl:when>
         <xsl:when test="contains($str, '\')">
           <xsl:call-template name="quote-string">
             <xsl:with-param name="str"
                select="substring-before($str, '\')"/>
           </xsl:call-template>
           <xsl:text>\\</xsl:text>
           <xsl:call-template name="quote-string">
             <xsl:with-param name="str"
                select="substring-after($str, '\')"/>
           </xsl:call-template>
         </xsl:when>
         <xsl:otherwise>
           <xsl:value-of select="$str"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:template>
        
     <!-- Sieve mode processing templates -->
        
     <xsl:template match="sieve:control|sieve:action" mode="sieve">
       <xsl:param name="prefix"/>
       <xsl:text xml:space="preserve">
   </xsl:text>
       <xsl:value-of select="$prefix"/>
       <xsl:value-of select="@name"/>
       <xsl:variable name="blockbegin"
               select="generate-id(sieve:control|sieve:action)"/>
       <xsl:for-each select="*">
         <xsl:choose>
           <xsl:when test="self::sieve:str|self::sieve:num|
                           self::sieve:list|self::sieve:tag|
                           self::sieve:test">
             <xsl:apply-templates select="." mode="sieve"/>
           </xsl:when>
           <xsl:when test="generate-id(.) = $blockbegin">
             <xsl:text xml:space="preserve">
   </xsl:text>
             <xsl:value-of select="$prefix"/>
             <xsl:text>{</xsl:text>
             <xsl:apply-templates select="." mode="sieve">
               <xsl:with-param name="prefix"
                  select="concat($prefix, '  ')"/>
             </xsl:apply-templates>
           </xsl:when>
           <xsl:otherwise>
             <xsl:apply-templates select="." mode="sieve">
               <xsl:with-param name="prefix"
        
                  select="concat($prefix, '  ')"/>
             </xsl:apply-templates>
           </xsl:otherwise>
         </xsl:choose>
       </xsl:for-each>
       <xsl:choose>
         <xsl:when test="count(sieve:control|sieve:action) &gt; 0">
           <xsl:text xml:space="preserve">
   </xsl:text>
           <xsl:value-of select="$prefix"/>
           <xsl:text>}</xsl:text>
         </xsl:when>
         <xsl:otherwise>
           <xsl:text>;</xsl:text>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:template>
        
     <xsl:template match="sieve:preamble|sieve:postamble" mode="sieve">
       <xsl:param name="prefix"/>
       <xsl:apply-templates mode="sieve">
         <xsl:with-param name="prefix" select="$prefix"/>
       </xsl:apply-templates>
     </xsl:template>
        
     <xsl:template match="sieve:test" mode="sieve">
       <xsl:text xml:space="preserve"> </xsl:text>
       <xsl:value-of select="@name"/>
       <xsl:apply-templates select="*[not(self::sieve:test)]"
                            mode="sieve"/>
       <xsl:if test="count(descendant::sieve:test) &gt; 0">
         <xsl:text> (</xsl:text>
         <xsl:for-each select="sieve:test">
           <xsl:apply-templates select="." mode="sieve"/>
           <xsl:if test="count(following-sibling::sieve:test) &gt; 0">
             <xsl:text>,</xsl:text>
           </xsl:if>
         </xsl:for-each>
         <xsl:text> )</xsl:text>
       </xsl:if>
     </xsl:template>
        
     <xsl:template match="sieve:str" mode="sieve">
       <xsl:text> &quot;</xsl:text>
       <xsl:call-template name="quote-string">
         <xsl:with-param name="str" select="text()"/>
       </xsl:call-template>
       <xsl:text>&quot;</xsl:text>
        
     </xsl:template>
        
     <xsl:template match="sieve:num" mode="sieve">
       <xsl:text xml:space="preserve"> </xsl:text>
       <!-- Use numeric suffixes when possible -->
       <xsl:choose>
         <xsl:when test="(number(text()) mod 1073741824) = 0">
           <xsl:value-of select="number(text()) div 1073741824"/>
           <xsl:text>G</xsl:text>
         </xsl:when>
         <xsl:when test="(number(text()) mod 1048576) = 0">
           <xsl:value-of select="number(text()) div 1048576"/>
           <xsl:text>M</xsl:text>
         </xsl:when>
         <xsl:when test="(number(text()) mod 1024) = 0">
           <xsl:value-of select="number(text()) div 1024"/>
           <xsl:text>K</xsl:text>
         </xsl:when>
         <xsl:otherwise>
           <xsl:value-of select="text()"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:template>
        
     <xsl:template match="sieve:list" mode="sieve">
       <xsl:text> [</xsl:text>
       <xsl:for-each select="sieve:str">
         <xsl:apply-templates select="." mode="sieve"/>
         <xsl:if test="count(following-sibling::sieve:str) &gt; 0">
           <xsl:text>,</xsl:text>
         </xsl:if>
       </xsl:for-each>
       <xsl:text> ]</xsl:text>
     </xsl:template>
        
     <xsl:template match="sieve:tag" mode="sieve">
       <xsl:text> :</xsl:text>
       <xsl:value-of select="text()"/>
     </xsl:template>
        
     <xsl:template match="sieve:comment" mode="sieve">
       <xsl:param name="prefix"/>
       <xsl:text xml:space="preserve">
   </xsl:text>
       <xsl:value-of select="$prefix"/>
       <xsl:text>/*</xsl:text>
       <xsl:value-of select="."/>
       <xsl:value-of select="$prefix"/>
        
       <xsl:text>*/</xsl:text>
     </xsl:template>
        
     <!-- Convert display information into structured comments -->
        
     <xsl:template match="sieve:displayblock" mode="sieve">
       <xsl:param name="prefix"/>
       <xsl:text xml:space="preserve">
   </xsl:text>
       <xsl:value-of select="$prefix"/>
       <xsl:text>/* [*</xsl:text>
       <xsl:apply-templates select="@*" mode="copy"/>
       <xsl:text> */</xsl:text>
       <xsl:apply-templates select="*" mode="sieve">
         <xsl:with-param name="prefix" select="$prefix"/>
       </xsl:apply-templates>
       <xsl:text xml:space="preserve">
   </xsl:text>
       <xsl:value-of select="$prefix"/>
       <xsl:text>/* *] */</xsl:text>
     </xsl:template>
        
     <xsl:template match="sieve:displaydata" mode="sieve">
       <xsl:param name="prefix"/>
       <xsl:text xml:space="preserve">
   </xsl:text>
       <xsl:value-of select="$prefix"/>
       <xsl:text>/* [|</xsl:text>
       <xsl:apply-templates mode="copy">
         <xsl:with-param name="prefix"
                         select="concat($prefix, '  ')"/>
       </xsl:apply-templates>
       <xsl:text xml:space="preserve">
   </xsl:text>
       <xsl:value-of select="$prefix"/>
       <xsl:text>   |] */</xsl:text>
     </xsl:template>
        
     <!-- Copy unrecnognized nodes and their descendants -->
        
     <xsl:template match="*" mode="sieve">
       <xsl:param name="prefix"/>
       <xsl:text xml:space="preserve">
   </xsl:text>
       <xsl:value-of select="$prefix"/>
       <xsl:text>/* [/</xsl:text>
       <xsl:apply-templates select="." mode="copy">
         <xsl:with-param name="prefix"
        
                         select="concat($prefix, '  ')"/>
       </xsl:apply-templates>
       <xsl:text xml:space="preserve">
   </xsl:text>
       <xsl:value-of select="$prefix"/>
       <xsl:text>   /] */</xsl:text>
     </xsl:template>
        
     <!-- Copy mode processing templates -->
        
     <xsl:template match="*[not(node())]" mode="copy">
       <xsl:param name="prefix"/>
       <xsl:text xml:space="preserve">
   </xsl:text>
       <xsl:value-of select="$prefix"/>
       <xsl:text>&lt;</xsl:text>
       <xsl:value-of select="name()"/>
       <xsl:apply-templates select="@*" mode="copy"/>
       <xsl:text>/&gt;</xsl:text>
     </xsl:template>
        
     <xsl:template match="*[node()]" mode="copy">
       <xsl:param name="prefix"/>
       <xsl:text xml:space="preserve">
   </xsl:text>
       <xsl:value-of select="$prefix"/>
       <xsl:text>&lt;</xsl:text>
       <xsl:value-of select="name()"/>
       <xsl:apply-templates select="@*" mode="copy"/>
       <xsl:text>&gt;</xsl:text>
       <xsl:apply-templates mode="copy">
         <xsl:with-param name="prefix"
                         select="concat($prefix, '  ')"/>
       </xsl:apply-templates>
       <xsl:if test="*[last()][not(text())]">
         <xsl:text xml:space="preserve">
   </xsl:text>
         <xsl:value-of select="$prefix"/>
       </xsl:if>
       <xsl:text>&lt;/</xsl:text>
       <xsl:value-of select="name()"/>
       <xsl:text>&gt;</xsl:text>
     </xsl:template>
        
     <xsl:template match="@*" mode="copy">
       <xsl:text> </xsl:text>
       <xsl:value-of select="name()"/>
       <xsl:text>="</xsl:text>
        
       <xsl:value-of select="."/>
       <xsl:text>"</xsl:text>
     </xsl:template>
        
   </xsl:stylesheet>
        
Appendix E. Acknowledgements
付録E. 謝辞

The stylesheet copy mode code is loosely based on a sample code posted to the xsl-list list by Americo Albuquerque. Jari Arkko, Robert Burrell Donkin, Andrew McKeon, Alexey Melnikov, and Aaron Stone provided useful comments on the document.

StyleSheetコピーモードコードは、Americo AlbuquerqueがXSLリストに投稿したサンプルコードに大まかに基づいています。Jari Arkko、Robert Burrell Donkin、Andrew McKeon、Alexey Melnikov、およびAaron Stoneは、この文書に有用なコメントを提供しました。

Authors' Addresses

著者のアドレス

Ned Freed Sun Microsystems 800 Royal Oaks Monrovia, CA 91016-6347 USA

Ned Freed Sun Microsystems 800 Royal Oaks Monrovia、CA 91016-6347 USA

   Phone: +1 909 457 4293
   EMail: ned.freed@mrochek.com
        

Srinivas Saisatish Vedam Sun Microsystems

Srinivas Saisatish Vedam Sun Microsystems

   Phone: +91 80669 27577
   EMail: Srinivas.Sv@Sun.COM