├── .coveragerc
├── .github
└── workflows
│ ├── codeql-analysis.yml
│ └── pythonpackage.yml
├── .gitignore
├── HISTORY.rst
├── LICENSE
├── MANIFEST.in
├── README.rst
├── data
└── properties.txt
├── requirements.txt
├── scripts
└── make_props.py
├── setup.cfg
├── setup.py
├── tests
├── examples
│ ├── IPM-DistList.tnef
│ ├── MAPI_ATTACH_DATA_OBJ.tnef
│ ├── MAPI_OBJECT.tnef
│ ├── bad_checksum.tnef
│ ├── body.tnef
│ ├── data-before-name.tnef
│ ├── duplicate_filename.tnef
│ ├── garbage-at-end.tnef
│ ├── long-filename.tnef
│ ├── minimal_attachment.tnef
│ ├── missing-filenames.tnef
│ ├── multi-name-property.tnef
│ ├── multi-value-attribute.tnef
│ ├── one-file.tnef
│ ├── rtf.tnef
│ ├── triples.tnef
│ ├── two-files.tnef
│ ├── umlaut.tnef
│ ├── unicode-mapi-attr-name.tnef
│ └── unicode-mapi-attr.tnef
├── test_attributes.py
├── test_cmdline.py
├── test_codepage.py
├── test_decoding.py
└── test_tnef.py
├── tnefparse
├── __init__.py
├── cmdline.py
├── codepage.py
├── mapi.py
├── properties.py
├── tnef.py
└── util.py
└── tox.ini
/.coveragerc:
--------------------------------------------------------------------------------
1 | [run]
2 | branch = True
3 | source = tnefparse
4 |
5 | [report]
6 | exclude_lines =
7 | if self.debug:
8 | pragma: no cover
9 | raise NotImplementedError
10 | if __name__ == .__main__.:
11 | ignore_errors = True
12 | omit =
13 | tests/*
14 |
--------------------------------------------------------------------------------
/.github/workflows/codeql-analysis.yml:
--------------------------------------------------------------------------------
1 | # For most projects, this workflow file will not need changing; you simply need
2 | # to commit it to your repository.
3 | #
4 | # You may wish to alter this file to override the set of languages analyzed,
5 | # or to provide custom queries or build logic.
6 | #
7 | # ******** NOTE ********
8 | # We have attempted to detect the languages in your repository. Please check
9 | # the `language` matrix defined below to confirm you have the correct set of
10 | # supported CodeQL languages.
11 | #
12 | name: "CodeQL"
13 |
14 | on:
15 | push:
16 | branches: [ master ]
17 | pull_request:
18 | # The branches below must be a subset of the branches above
19 | branches: [ master ]
20 | schedule:
21 | - cron: '35 11 * * 2'
22 |
23 | jobs:
24 | analyze:
25 | name: Analyze
26 | runs-on: ubuntu-latest
27 |
28 | strategy:
29 | fail-fast: false
30 | matrix:
31 | language: [ 'python' ]
32 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
33 | # Learn more:
34 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
35 |
36 | steps:
37 | - name: Checkout repository
38 | uses: actions/checkout@v2
39 |
40 | # Initializes the CodeQL tools for scanning.
41 | - name: Initialize CodeQL
42 | uses: github/codeql-action/init@v1
43 | with:
44 | languages: ${{ matrix.language }}
45 | # If you wish to specify custom queries, you can do so here or in a config file.
46 | # By default, queries listed here will override any specified in a config file.
47 | # Prefix the list here with "+" to use these queries and those in the config file.
48 | # queries: ./path/to/local/query, your-org/your-repo/queries@main
49 |
50 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
51 | # If this step fails, then you should remove it and run the build manually (see below)
52 | - name: Autobuild
53 | uses: github/codeql-action/autobuild@v1
54 |
55 | # ℹ️ Command-line programs to run using the OS shell.
56 | # 📚 https://git.io/JvXDl
57 |
58 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
59 | # and modify them (or add more) to build your code if your project
60 | # uses a compiled language
61 |
62 | #- run: |
63 | # make bootstrap
64 | # make release
65 |
66 | - name: Perform CodeQL Analysis
67 | uses: github/codeql-action/analyze@v1
68 |
--------------------------------------------------------------------------------
/.github/workflows/pythonpackage.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on:
4 | push:
5 | pull_request:
6 | schedule:
7 | - cron: 42 0 * * 5
8 | workflow_dispatch:
9 |
10 | jobs:
11 | build:
12 |
13 | runs-on: ubuntu-latest
14 | strategy:
15 | max-parallel: 5
16 | matrix:
17 | python-version: [3.6, 3.7, 3.8, 3.9, 'pypy3']
18 |
19 | steps:
20 | - uses: actions/checkout@v1
21 | - name: Set up Python ${{ matrix.python-version }}
22 | uses: actions/setup-python@v1
23 | with:
24 | python-version: ${{ matrix.python-version }}
25 | - name: Install dependencies
26 | run: |
27 | python -m pip install --upgrade pip
28 | pip install -r requirements.txt
29 |
30 | - name: Lint Python code with flake8
31 | run: |
32 | pip install flake8
33 | # ignore max complexity and line break after binary operator
34 | flake8 tnefparse/ tests/ setup.py --ignore=C901,W504
35 | # check max complexity, but do not enforce it
36 | flake8 tnefparse/ tests/ setup.py --count --exit-zero --max-complexity=10 --statistics
37 |
38 | - name: Test with pytest
39 | run: |
40 | pip install -e .[optional]
41 | pip install pytest pytest-console-scripts pytest-cov codecov
42 | pytest --cov --cov-report=xml
43 |
44 | - name: Upload coverage to Codecov
45 | uses: codecov/codecov-action@v1
46 | with:
47 | files: coverage.xml
48 | flags: unittests
49 | name: codecov-umbrella
50 | fail_ci_if_error: true
51 | verbose: true
52 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | env/
12 | build/
13 | develop-eggs/
14 | dist/
15 | downloads/
16 | eggs/
17 | .eggs/
18 | lib/
19 | lib64/
20 | parts/
21 | sdist/
22 | var/
23 | wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 |
28 | # PyInstaller
29 | # Usually these files are written by a python script from a template
30 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
31 | *.manifest
32 | *.spec
33 |
34 | # Installer logs
35 | pip-log.txt
36 | pip-delete-this-directory.txt
37 |
38 | # Unit test / coverage reports
39 | htmlcov/
40 | .tox/
41 | .coverage
42 | .coverage.*
43 | .cache
44 | nosetests.xml
45 | coverage.xml
46 | *.cover
47 | .hypothesis/
48 | .pytest_cache/
49 |
50 | # Translations
51 | *.mo
52 | *.pot
53 |
54 | # Django stuff:
55 | *.log
56 | local_settings.py
57 |
58 | # Flask stuff:
59 | instance/
60 | .webassets-cache
61 |
62 | # Scrapy stuff:
63 | .scrapy
64 |
65 | # Sphinx documentation
66 | docs/_build/
67 |
68 | # PyBuilder
69 | target/
70 |
71 | # Jupyter Notebook
72 | .ipynb_checkpoints
73 |
74 | # pyenv
75 | .python-version
76 |
77 | # celery beat schedule file
78 | celerybeat-schedule
79 |
80 | # SageMath parsed files
81 | *.sage.py
82 |
83 | # dotenv
84 | .env
85 |
86 | # virtualenv
87 | .venv
88 | venv/
89 | ENV/
90 |
91 | # Spyder project settings
92 | .spyderproject
93 | .spyproject
94 |
95 | # Rope project settings
96 | .ropeproject
97 |
98 | # mkdocs documentation
99 | /site
100 |
101 | # mypy
102 | .mypy_cache/
103 |
104 | # BBEdit
105 |
106 | *.bbprojectd/
107 |
108 | # vs code
109 | .vscode/
110 |
--------------------------------------------------------------------------------
/HISTORY.rst:
--------------------------------------------------------------------------------
1 | tnefparse 1.4.1 (unreleased)
2 | =============================
3 |
4 | - nothing yet
5 |
6 |
7 | tnefparse 1.4.0 (2021-01-24)
8 | =============================
9 |
10 | - drop Python 2 support
11 | - drop Python 3.5 support (jugmac00)
12 | - add Python 3.9 support (jugmac00)
13 | - command-line support for zipped export of attachments (Beercow)
14 | - introduce using type annotations (jugmac00)
15 | - remove deprecated parseFile & raw_mapi functions
16 | - fix str representation for TNEF class (jugmac00)
17 | - prefer `getattr` over `eval` (eumiro)
18 | - fix `test_zip` deprecation warning for bytes (1nF0rmed)
19 | - correctly handle attachments of embedded objects (jrideout)
20 | - add expirimental support for parsing embedded message objects (jrideout)
21 | - zipped output now uses long filename when possible (jrideout)
22 | - run GitHub Actions CI for pull requests and once a week (eumiro)
23 | - use pathlib instead of os.path (eumiro)
24 | - change logger name for mapi to the package name (jrideout)
25 | - add unit tests for mapi attribute parsing (jrideout)
26 | - do not use Travis CI any more (jugmac00)
27 |
28 |
29 | tnefparse 1.3.1 (2020-09-30)
30 | =============================
31 |
32 | - heuristics to decode binary body and filenames when possible (jrideout)
33 | - JSON export for TNEF contents tnefparse (jrideout)
34 | - add support for Python 3.8 (jugmac00)
35 | - modernize package and test setup (jugmac00)
36 | - apply Flake8 on the code and enforce rules on CI (jugmac00)
37 |
38 | tnefparse 1.3.0 (2018-12-01)
39 | =============================
40 |
41 | - drop Python 2.6 & 3.3 support
42 | - Python 2/3 compatibility fixes
43 | - more tests & example files (jrideout)
44 | - overall improved testing & start tracking coverage
45 | - lots of parsing improvements (jrideout)
46 | - turn some unnecessary warnings into debug messages
47 | - add tnefparse -p | --path option for setting attachment extraction path
48 | - support more MAPI (PidTag) properties (jrideout)
49 | - support RTF body extraction (jrideout)
50 | - support extracting top level object attributes in msgprops (jrideout)
51 | - util.raw_mapi & tnefparse.parseFile functions will be deprecated after 1.3
52 |
53 | tnefparse 1.2.3, 2018-11-14
54 | ============================
55 |
56 | - misc. fixes
57 |
58 | tnefparse 1.2.2, 2017
59 | ======================
60 |
61 | - have `TNEF` init raise ValueError on invalid TNEF signature, rather than calling sys.exit()
62 | - `parseFile` convenience function should not expect a `self` parameter, removed
63 | - other misc. fixes
64 |
65 | tnefparse 1.2.1, 2013
66 | ======================
67 |
68 | - Python 3 compatibility; tests pass on Python 2.6/2.7/3.2/3.3
69 | - add package to travis ci
70 | - add tox.ini for testing using https://testrun.org/tox
71 |
72 | tnefparse 1.2, 2013
73 | ===================
74 |
75 | - performance improvements & bug fixes (Dave Baggett)
76 | - added to_zip function for converting TNEF attachments into ZIPped ones (Dave Baggett)
77 | - tnefparse is now used in the inky email client from Arcode
78 |
79 | tnefparse 1.1.1, 08/2012 (unreleased)
80 | =====================================
81 |
82 | - fixed entry point bug that caused 'tnefparse' cmd-line invocation to fail
83 |
84 | tnefparse 1.1, 03/2012
85 | =======================
86 |
87 | - Repackaged and renamed the library
88 | - Code moved to github
89 | - Use the stdlib logging module
90 | - Further bug fixes and enhancements to pure-python code
91 | - Add a command-line script
92 | - Drop the unix tnef command-line tool wrapper
93 |
94 | pytnef 0.2.1-Novell, circa 2010
95 | ================================
96 |
97 | - Bug fixes/enhancements to pure-python code (Tom Doman)
98 |
99 | pytnef 0.2, circa 2005
100 | ======================
101 |
102 | - Added a wrapper for the unix tnef command-line tool (Petri Savolainen)
103 | - Pure-python code not very useful yet
104 |
105 | pytnef 0.1 - circa 2005
106 | =======================
107 |
108 | - First version (pure-python) created as a conversion of a Ruby TNEF decoder
109 | by Trevor Scheroeder (Petri Savolainen)
110 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU LESSER GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 |
9 | This version of the GNU Lesser General Public License incorporates
10 | the terms and conditions of version 3 of the GNU General Public
11 | License, supplemented by the additional permissions listed below.
12 |
13 | 0. Additional Definitions.
14 |
15 | As used herein, "this License" refers to version 3 of the GNU Lesser
16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU
17 | General Public License.
18 |
19 | "The Library" refers to a covered work governed by this License,
20 | other than an Application or a Combined Work as defined below.
21 |
22 | An "Application" is any work that makes use of an interface provided
23 | by the Library, but which is not otherwise based on the Library.
24 | Defining a subclass of a class defined by the Library is deemed a mode
25 | of using an interface provided by the Library.
26 |
27 | A "Combined Work" is a work produced by combining or linking an
28 | Application with the Library. The particular version of the Library
29 | with which the Combined Work was made is also called the "Linked
30 | Version".
31 |
32 | The "Minimal Corresponding Source" for a Combined Work means the
33 | Corresponding Source for the Combined Work, excluding any source code
34 | for portions of the Combined Work that, considered in isolation, are
35 | based on the Application, and not on the Linked Version.
36 |
37 | The "Corresponding Application Code" for a Combined Work means the
38 | object code and/or source code for the Application, including any data
39 | and utility programs needed for reproducing the Combined Work from the
40 | Application, but excluding the System Libraries of the Combined Work.
41 |
42 | 1. Exception to Section 3 of the GNU GPL.
43 |
44 | You may convey a covered work under sections 3 and 4 of this License
45 | without being bound by section 3 of the GNU GPL.
46 |
47 | 2. Conveying Modified Versions.
48 |
49 | If you modify a copy of the Library, and, in your modifications, a
50 | facility refers to a function or data to be supplied by an Application
51 | that uses the facility (other than as an argument passed when the
52 | facility is invoked), then you may convey a copy of the modified
53 | version:
54 |
55 | a) under this License, provided that you make a good faith effort to
56 | ensure that, in the event an Application does not supply the
57 | function or data, the facility still operates, and performs
58 | whatever part of its purpose remains meaningful, or
59 |
60 | b) under the GNU GPL, with none of the additional permissions of
61 | this License applicable to that copy.
62 |
63 | 3. Object Code Incorporating Material from Library Header Files.
64 |
65 | The object code form of an Application may incorporate material from
66 | a header file that is part of the Library. You may convey such object
67 | code under terms of your choice, provided that, if the incorporated
68 | material is not limited to numerical parameters, data structure
69 | layouts and accessors, or small macros, inline functions and templates
70 | (ten or fewer lines in length), you do both of the following:
71 |
72 | a) Give prominent notice with each copy of the object code that the
73 | Library is used in it and that the Library and its use are
74 | covered by this License.
75 |
76 | b) Accompany the object code with a copy of the GNU GPL and this license
77 | document.
78 |
79 | 4. Combined Works.
80 |
81 | You may convey a Combined Work under terms of your choice that,
82 | taken together, effectively do not restrict modification of the
83 | portions of the Library contained in the Combined Work and reverse
84 | engineering for debugging such modifications, if you also do each of
85 | the following:
86 |
87 | a) Give prominent notice with each copy of the Combined Work that
88 | the Library is used in it and that the Library and its use are
89 | covered by this License.
90 |
91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license
92 | document.
93 |
94 | c) For a Combined Work that displays copyright notices during
95 | execution, include the copyright notice for the Library among
96 | these notices, as well as a reference directing the user to the
97 | copies of the GNU GPL and this license document.
98 |
99 | d) Do one of the following:
100 |
101 | 0) Convey the Minimal Corresponding Source under the terms of this
102 | License, and the Corresponding Application Code in a form
103 | suitable for, and under terms that permit, the user to
104 | recombine or relink the Application with a modified version of
105 | the Linked Version to produce a modified Combined Work, in the
106 | manner specified by section 6 of the GNU GPL for conveying
107 | Corresponding Source.
108 |
109 | 1) Use a suitable shared library mechanism for linking with the
110 | Library. A suitable mechanism is one that (a) uses at run time
111 | a copy of the Library already present on the user's computer
112 | system, and (b) will operate properly with a modified version
113 | of the Library that is interface-compatible with the Linked
114 | Version.
115 |
116 | e) Provide Installation Information, but only if you would otherwise
117 | be required to provide such information under section 6 of the
118 | GNU GPL, and only to the extent that such information is
119 | necessary to install and execute a modified version of the
120 | Combined Work produced by recombining or relinking the
121 | Application with a modified version of the Linked Version. (If
122 | you use option 4d0, the Installation Information must accompany
123 | the Minimal Corresponding Source and Corresponding Application
124 | Code. If you use option 4d1, you must provide the Installation
125 | Information in the manner specified by section 6 of the GNU GPL
126 | for conveying Corresponding Source.)
127 |
128 | 5. Combined Libraries.
129 |
130 | You may place library facilities that are a work based on the
131 | Library side by side in a single library together with other library
132 | facilities that are not Applications and are not covered by this
133 | License, and convey such a combined library under terms of your
134 | choice, if you do both of the following:
135 |
136 | a) Accompany the combined library with a copy of the same work based
137 | on the Library, uncombined with any other library facilities,
138 | conveyed under the terms of this License.
139 |
140 | b) Give prominent notice with the combined library that part of it
141 | is a work based on the Library, and explaining where to find the
142 | accompanying uncombined form of the same work.
143 |
144 | 6. Revised Versions of the GNU Lesser General Public License.
145 |
146 | The Free Software Foundation may publish revised and/or new versions
147 | of the GNU Lesser General Public License from time to time. Such new
148 | versions will be similar in spirit to the present version, but may
149 | differ in detail to address new problems or concerns.
150 |
151 | Each version is given a distinguishing version number. If the
152 | Library as you received it specifies that a certain numbered version
153 | of the GNU Lesser General Public License "or any later version"
154 | applies to it, you have the option of following the terms and
155 | conditions either of that published version or of any later version
156 | published by the Free Software Foundation. If the Library as you
157 | received it does not specify a version number of the GNU Lesser
158 | General Public License, you may choose any version of the GNU Lesser
159 | General Public License ever published by the Free Software Foundation.
160 |
161 | If the Library as you received it specifies that a proxy can decide
162 | whether future versions of the GNU Lesser General Public License shall
163 | apply, that proxy's public statement of acceptance of any version is
164 | permanent authorization for you to choose that version for the
165 | Library.
166 |
--------------------------------------------------------------------------------
/MANIFEST.in:
--------------------------------------------------------------------------------
1 | include *.rst
2 | include *.txt
3 | include .coveragerc
4 | include LICENSE
5 | include tox.ini
6 | recursive-include tests *.py
7 | recursive-include tests *.tnef
8 |
9 | include *.py
10 | recursive-include scripts *.py
11 | recursive-include data *.txt
12 |
--------------------------------------------------------------------------------
/README.rst:
--------------------------------------------------------------------------------
1 | tnefparse - TNEF decoding and attachment extraction
2 | ===================================================
3 |
4 | .. image:: https://github.com/koodaamo/tnefparse/workflows/CI/badge.svg?branch=master
5 | :target: https://github.com/koodaamo/tnefparse/actions?workflow=CI
6 | :alt: CI Status
7 |
8 | .. image:: https://codecov.io/gh/koodaamo/tnefparse/branch/master/graph/badge.svg
9 | :target: https://codecov.io/gh/koodaamo/tnefparse
10 |
11 | .. image:: https://img.shields.io/pypi/v/tnefparse.svg
12 | :target: https://pypi.org/project/tnefparse/
13 |
14 | .. image:: https://img.shields.io/pypi/pyversions/tnefparse.svg
15 | :target: https://pypi.org/project/tnefparse/
16 |
17 | This is a pure-python library for decoding Microsoft's Transport Neutral Encapsulation Format (TNEF), for Python
18 | versions 3.6+ and PyPy3. The last version to support Python2 was 1.3.1. For more information on TNEF, see for example
19 | `wikipedia `_. The full TNEF specification
20 | is also available as a `PDF download `_.
21 |
22 | A :code:`tnefparse` command-line utility is provided for listing contents of TNEF files, extracting attachments
23 | found inside them and so on::
24 |
25 | usage: tnefparse [-h] [-o] [-a] [-p PATH] [-b] [-hb]
26 | [-l LEVEL] [-c]
27 | file [file ...]
28 |
29 | Extract TNEF file contents. Show this help message if no arguments are given.
30 |
31 | positional arguments:
32 | file space-separated list of paths to the TNEF files
33 |
34 | optional arguments:
35 | -h, --help show this help message and exit
36 | -o, --overview show (possibly long) overview of TNEF file contents
37 | -a, --attachments extract attachments, by default to current dir
38 | -z, --zip extract attachments into a single zip file, by default to current dir
39 | -p PATH, --path PATH optional explicit path to extract attachments to
40 | -b, --body extract the body to stdout
41 | -hb, --htmlbody extract the HTML body to stdout
42 | -rb, --rtfbody extract the RTF body to stdout
43 | -l LEVEL, --log LEVEL set log level to DEBUG, INFO, WARN or ERROR
44 | -c, --checksum calculate checksums (off by default)
45 | -d, --dump extract a json dump of the tnef contents
46 |
47 | The library can also be used as a basis for applications that need to parse TNEF. To parse a TNEF attachment, run eg. :
48 |
49 | >>> from tnefparse import TNEF
50 | >>> with open("tests/examples/one-file.tnef", "rb") as tneffile:
51 | ... tnefobj = TNEF(tneffile.read())
52 |
53 | The parsed attachment contents are then available as TNEF object attributes:
54 |
55 | * signature - TNEF file signature
56 | * key - generated by TNEF enabled transports before using the TNEF implementation to generate a TNEF stream
57 | * codepage - a Windows code page string
58 | * objects - a collection of `TNEFObject` instances
59 | * attachments - a collection of `TNEFAttachment` instances
60 | * mapiprops - a collection of MAPI properties represented by `TNEFMAPI_Attribute` instances
61 | * body - message body (may contain both HTML and RTF)
62 | * htmlbody - a string containing just the HTML message body
63 | * rtfbody - just the RTF body
64 |
65 | Some of the above properties may be empty, depending on what's contained in the attachment that was parsed.
66 |
67 | Tests
68 | -----
69 |
70 | To run the test suite, all you need is tox_. `tox` will run all tests on all supported Python versions.
71 |
72 | If you want to run the tests only for e.g. Python 3.8, just enter `tox -e py38`.
73 |
74 | You also can run a subset of tests in a specific environment by invoking e.g. `tox -e py38 -- -k test_cmdline`.
75 |
76 | With `tox -e coverage` you can generate a coverage report.
77 | The output will be shown in the terminal and a HTML coverage report will be generated in the `htmlcov` directory.
78 |
79 | Contributing
80 | ------------
81 |
82 | Issues and pull requests welcome. **Please however always provide an example TNEF file** that can be used to demonstrate the bug or desired behavior, if at all possible.
83 |
84 | **Note: If you have understanding of TNEF and/or MIME internals or just need this package and want to help with maintaining it, I am open to giving you commit rights. Just let me know.**
85 |
86 | .. _tox: https://tox.readthedocs.io/
87 |
--------------------------------------------------------------------------------
/data/properties.txt:
--------------------------------------------------------------------------------
1 | MAPI_ACKNOWLEDGEMENT_MODE 0x0001
2 | MAPI_ALTERNATE_RECIPIENT_ALLOWED 0x0002
3 | MAPI_AUTHORIZING_USERS 0x0003
4 | MAPI_AUTO_FORWARD_COMMENT 0x0004
5 | MAPI_AUTO_FORWARDED 0x0005
6 | MAPI_CONTENT_CONFIDENTIALITY_ALGORITHM_ID 0x0006
7 | MAPI_CONTENT_CORRELATOR 0x0007
8 | MAPI_CONTENT_IDENTIFIER 0x0008
9 | MAPI_CONTENT_LENGTH 0x0009
10 | MAPI_CONTENT_RETURN_REQUESTED 0x000A
11 | MAPI_CONVERSATION_KEY 0x000B
12 | MAPI_CONVERSION_EITS 0x000C
13 | MAPI_CONVERSION_WITH_LOSS_PROHIBITED 0x000D
14 | MAPI_CONVERTED_EITS 0x000E
15 | MAPI_DEFERRED_DELIVERY_TIME 0x000F
16 | MAPI_DELIVER_TIME 0x0010
17 | MAPI_DISCARD_REASON 0x0011
18 | MAPI_DISCLOSURE_OF_RECIPIENTS 0x0012
19 | MAPI_DL_EXPANSION_HISTORY 0x0013
20 | MAPI_DL_EXPANSION_PROHIBITED 0x0014
21 | MAPI_EXPIRY_TIME 0x0015
22 | MAPI_IMPLICIT_CONVERSION_PROHIBITED 0x0016
23 | MAPI_IMPORTANCE 0x0017
24 | MAPI_IPM_ID 0x0018
25 | MAPI_LATEST_DELIVERY_TIME 0x0019
26 | MAPI_MESSAGE_CLASS 0x001A
27 | MAPI_MESSAGE_DELIVERY_ID 0x001B
28 | MAPI_MESSAGE_SECURITY_LABEL 0x001E
29 | MAPI_OBSOLETED_IPMS 0x001F
30 | MAPI_ORIGINALLY_INTENDED_RECIPIENT_NAME 0x0020
31 | MAPI_ORIGINAL_EITS 0x0021
32 | MAPI_ORIGINATOR_CERTIFICATE 0x0022
33 | MAPI_ORIGINATOR_DELIVERY_REPORT_REQUESTED 0x0023
34 | MAPI_ORIGINATOR_RETURN_ADDRESS 0x0024
35 | MAPI_PARENT_KEY 0x0025
36 | MAPI_PRIORITY 0x0026
37 | MAPI_ORIGIN_CHECK 0x0027
38 | MAPI_PROOF_OF_SUBMISSION_REQUESTED 0x0028
39 | MAPI_READ_RECEIPT_REQUESTED 0x0029
40 | MAPI_RECEIPT_TIME 0x002A
41 | MAPI_RECIPIENT_REASSIGNMENT_PROHIBITED 0x002B
42 | MAPI_REDIRECTION_HISTORY 0x002C
43 | MAPI_RELATED_IPMS 0x002D
44 | MAPI_ORIGINAL_SENSITIVITY 0x002E
45 | MAPI_LANGUAGES 0x002F
46 | MAPI_REPLY_TIME 0x0030
47 | MAPI_REPORT_TAG 0x0031
48 | MAPI_REPORT_TIME 0x0032
49 | MAPI_RETURNED_IPM 0x0033
50 | MAPI_SECURITY 0x0034
51 | MAPI_INCOMPLETE_COPY 0x0035
52 | MAPI_SENSITIVITY 0x0036
53 | MAPI_SUBJECT 0x0037
54 | MAPI_SUBJECT_IPM 0x0038
55 | MAPI_CLIENT_SUBMIT_TIME 0x0039
56 | MAPI_REPORT_NAME 0x003A
57 | MAPI_SENT_REPRESENTING_SEARCH_KEY 0x003B
58 | MAPI_X400_CONTENT_TYPE 0x003C
59 | MAPI_SUBJECT_PREFIX 0x003D
60 | MAPI_NON_RECEIPT_REASON 0x003E
61 | MAPI_RECEIVED_BY_ENTRYID 0x003F
62 | MAPI_RECEIVED_BY_NAME 0x0040
63 | MAPI_SENT_REPRESENTING_ENTRYID 0x0041
64 | MAPI_SENT_REPRESENTING_NAME 0x0042
65 | MAPI_RCVD_REPRESENTING_ENTRYID 0x0043
66 | MAPI_RCVD_REPRESENTING_NAME 0x0044
67 | MAPI_REPORT_ENTRYID 0x0045
68 | MAPI_READ_RECEIPT_ENTRYID 0x0046
69 | MAPI_MESSAGE_SUBMISSION_ID 0x0047
70 | MAPI_PROVIDER_SUBMIT_TIME 0x0048
71 | MAPI_ORIGINAL_SUBJECT 0x0049
72 | MAPI_DISC_VAL 0x004A
73 | MAPI_ORIG_MESSAGE_CLASS 0x004B
74 | MAPI_ORIGINAL_AUTHOR_ENTRYID 0x004C
75 | MAPI_ORIGINAL_AUTHOR_NAME 0x004D
76 | MAPI_ORIGINAL_SUBMIT_TIME 0x004E
77 | MAPI_REPLY_RECIPIENT_ENTRIES 0x004F
78 | MAPI_REPLY_RECIPIENT_NAMES 0x0050
79 | MAPI_RECEIVED_BY_SEARCH_KEY 0x0051
80 | MAPI_RCVD_REPRESENTING_SEARCH_KEY 0x0052
81 | MAPI_READ_RECEIPT_SEARCH_KEY 0x0053
82 | MAPI_REPORT_SEARCH_KEY 0x0054
83 | MAPI_ORIGINAL_DELIVERY_TIME 0x0055
84 | MAPI_ORIGINAL_AUTHOR_SEARCH_KEY 0x0056
85 | MAPI_MESSAGE_TO_ME 0x0057
86 | MAPI_MESSAGE_CC_ME 0x0058
87 | MAPI_MESSAGE_RECIP_ME 0x0059
88 | MAPI_ORIGINAL_SENDER_NAME 0x005A
89 | MAPI_ORIGINAL_SENDER_ENTRYID 0x005B
90 | MAPI_ORIGINAL_SENDER_SEARCH_KEY 0x005C
91 | MAPI_ORIGINAL_SENT_REPRESENTING_NAME 0x005D
92 | MAPI_ORIGINAL_SENT_REPRESENTING_ENTRYID 0x005E
93 | MAPI_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY 0x005F
94 | MAPI_START_DATE 0x0060
95 | MAPI_END_DATE 0x0061
96 | MAPI_OWNER_APPT_ID 0x0062
97 | MAPI_RESPONSE_REQUESTED 0x0063
98 | MAPI_SENT_REPRESENTING_ADDRTYPE 0x0064
99 | MAPI_SENT_REPRESENTING_EMAIL_ADDRESS 0x0065
100 | MAPI_ORIGINAL_SENDER_ADDRTYPE 0x0066
101 | MAPI_ORIGINAL_SENDER_EMAIL_ADDRESS 0x0067
102 | MAPI_ORIGINAL_SENT_REPRESENTING_ADDRTYPE 0x0068
103 | MAPI_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS 0x0069
104 | MAPI_CONVERSATION_TOPIC 0x0070
105 | MAPI_CONVERSATION_INDEX 0x0071
106 | MAPI_ORIGINAL_DISPLAY_BCC 0x0072
107 | MAPI_ORIGINAL_DISPLAY_CC 0x0073
108 | MAPI_ORIGINAL_DISPLAY_TO 0x0074
109 | MAPI_RECEIVED_BY_ADDRTYPE 0x0075
110 | MAPI_RECEIVED_BY_EMAIL_ADDRESS 0x0076
111 | MAPI_RCVD_REPRESENTING_ADDRTYPE 0x0077
112 | MAPI_RCVD_REPRESENTING_EMAIL_ADDRESS 0x0078
113 | MAPI_ORIGINAL_AUTHOR_ADDRTYPE 0x0079
114 | MAPI_ORIGINAL_AUTHOR_EMAIL_ADDRESS 0x007A
115 | MAPI_ORIGINALLY_INTENDED_RECIP_ADDRTYPE 0x007B
116 | MAPI_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS 0x007C
117 | MAPI_TRANSPORT_MESSAGE_HEADERS 0x007D
118 | MAPI_DELEGATION 0x007E
119 | MAPI_TNEF_CORRELATION_KEY 0x007F
120 | MAPI_CONTENT_INTEGRITY_CHECK 0x0C00
121 | MAPI_EXPLICIT_CONVERSION 0x0C01
122 | MAPI_IPM_RETURN_REQUESTED 0x0C02
123 | MAPI_MESSAGE_TOKEN 0x0C03
124 | MAPI_NDR_REASON_CODE 0x0C04
125 | MAPI_NDR_DIAG_CODE 0x0C05
126 | MAPI_NON_RECEIPT_NOTIFICATION_REQUESTED 0x0C06
127 | MAPI_DELIVERY_POINT 0x0C07
128 | MAPI_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED 0x0C08
129 | MAPI_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT 0x0C09
130 | MAPI_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY 0x0C0A
131 | MAPI_PHYSICAL_DELIVERY_MODE 0x0C0B
132 | MAPI_PHYSICAL_DELIVERY_REPORT_REQUEST 0x0C0C
133 | MAPI_PHYSICAL_FORWARDING_ADDRESS 0x0C0D
134 | MAPI_PHYSICAL_FORWARDING_ADDRESS_REQUESTED 0x0C0E
135 | MAPI_PHYSICAL_FORWARDING_PROHIBITED 0x0C0F
136 | MAPI_PHYSICAL_RENDITION_ATTRIBUTES 0x0C10
137 | MAPI_PROOF_OF_DELIVERY 0x0C11
138 | MAPI_PROOF_OF_DELIVERY_REQUESTED 0x0C12
139 | MAPI_RECIPIENT_CERTIFICATE 0x0C13
140 | MAPI_RECIPIENT_NUMBER_FOR_ADVICE 0x0C14
141 | MAPI_RECIPIENT_TYPE 0x0C15
142 | MAPI_REGISTERED_MAIL_TYPE 0x0C16
143 | MAPI_REPLY_REQUESTED 0x0C17
144 | MAPI_REQUESTED_DELIVERY_METHOD 0x0C18
145 | MAPI_SENDER_ENTRYID 0x0C19
146 | MAPI_SENDER_NAME 0x0C1A
147 | MAPI_SUPPLEMENTARY_INFO 0x0C1B
148 | MAPI_TYPE_OF_MTS_USER 0x0C1C
149 | MAPI_SENDER_SEARCH_KEY 0x0C1D
150 | MAPI_SENDER_ADDRTYPE 0x0C1E
151 | MAPI_SENDER_EMAIL_ADDRESS 0x0C1F
152 | MAPI_CURRENT_VERSION 0x0E00
153 | MAPI_DELETE_AFTER_SUBMIT 0x0E01
154 | MAPI_DISPLAY_BCC 0x0E02
155 | MAPI_DISPLAY_CC 0x0E03
156 | MAPI_DISPLAY_TO 0x0E04
157 | MAPI_PARENT_DISPLAY 0x0E05
158 | MAPI_MESSAGE_DELIVERY_TIME 0x0E06
159 | MAPI_MESSAGE_FLAGS 0x0E07
160 | MAPI_MESSAGE_SIZE 0x0E08
161 | MAPI_PARENT_ENTRYID 0x0E09
162 | MAPI_SENTMAIL_ENTRYID 0x0E0A
163 | MAPI_CORRELATE 0x0E0C
164 | MAPI_CORRELATE_MTSID 0x0E0D
165 | MAPI_DISCRETE_VALUES 0x0E0E
166 | MAPI_RESPONSIBILITY 0x0E0F
167 | MAPI_SPOOLER_STATUS 0x0E10
168 | MAPI_TRANSPORT_STATUS 0x0E11
169 | MAPI_MESSAGE_RECIPIENTS 0x0E12
170 | MAPI_MESSAGE_ATTACHMENTS 0x0E13
171 | MAPI_SUBMIT_FLAGS 0x0E14
172 | MAPI_RECIPIENT_STATUS 0x0E15
173 | MAPI_TRANSPORT_KEY 0x0E16
174 | MAPI_MSG_STATUS 0x0E17
175 | MAPI_MESSAGE_DOWNLOAD_TIME 0x0E18
176 | MAPI_CREATION_VERSION 0x0E19
177 | MAPI_MODIFY_VERSION 0x0E1A
178 | MAPI_HASATTACH 0x0E1B
179 | MAPI_BODY_CRC 0x0E1C
180 | MAPI_NORMALIZED_SUBJECT 0x0E1D
181 | MAPI_RTF_IN_SYNC 0x0E1F
182 | MAPI_ATTACH_SIZE 0x0E20
183 | MAPI_ATTACH_NUM 0x0E21
184 | MAPI_PREPROCESS 0x0E22
185 | MAPI_ORIGINATING_MTA_CERTIFICATE 0x0E25
186 | MAPI_PROOF_OF_SUBMISSION 0x0E26
187 | MAPI_PRIMARY_SEND_ACCOUNT 0x0E28
188 | MAPI_NEXT_SEND_ACCT 0x0E29
189 | MAPI_ACCESS 0x0FF4
190 | MAPI_ROW_TYPE 0x0FF5
191 | MAPI_INSTANCE_KEY 0x0FF6
192 | MAPI_ACCESS_LEVEL 0x0FF7
193 | MAPI_MAPPING_SIGNATURE 0x0FF8
194 | MAPI_RECORD_KEY 0x0FF9
195 | MAPI_STORE_RECORD_KEY 0x0FFA
196 | MAPI_STORE_ENTRYID 0x0FFB
197 | MAPI_MINI_ICON 0x0FFC
198 | MAPI_ICON 0x0FFD
199 | MAPI_OBJECT_TYPE 0x0FFE
200 | MAPI_ENTRYID 0x0FFF
201 | MAPI_BODY 0x1000
202 | MAPI_REPORT_TEXT 0x1001
203 | MAPI_ORIGINATOR_AND_DL_EXPANSION_HISTORY 0x1002
204 | MAPI_REPORTING_DL_NAME 0x1003
205 | MAPI_REPORTING_MTA_CERTIFICATE 0x1004
206 | MAPI_RTF_SYNC_BODY_CRC 0x1006
207 | MAPI_RTF_SYNC_BODY_COUNT 0x1007
208 | MAPI_RTF_SYNC_BODY_TAG 0x1008
209 | MAPI_RTF_COMPRESSED 0x1009
210 | MAPI_RTF_SYNC_PREFIX_COUNT 0x1010
211 | MAPI_RTF_SYNC_TRAILING_COUNT 0x1011
212 | MAPI_ORIGINALLY_INTENDED_RECIP_ENTRYID 0x1012
213 | MAPI_BODY_HTML 0x1013
214 | MAPI_NATIVE_BODY 0x1016
215 | MAPI_SMTP_MESSAGE_ID 0x1035
216 | MAPI_INTERNET_REFERENCES 0x1039
217 | MAPI_IN_REPLY_TO_ID 0x1042
218 | MAPI_INTERNET_RETURN_PATH 0x1046
219 | MAPI_ICON_INDEX 0x1080
220 | MAPI_LAST_VERB_EXECUTED 0x1081
221 | MAPI_LAST_VERB_EXECUTION_TIME 0x1082
222 | MAPI_URL_COMP_NAME 0x10F3
223 | MAPI_ATTRIBUTE_HIDDEN 0x10F4
224 | MAPI_ATTRIBUTE_SYSTEM 0x10F5
225 | MAPI_ATTRIBUTE_READ_ONLY 0x10F6
226 | MAPI_ROWID 0x3000
227 | MAPI_DISPLAY_NAME 0x3001
228 | MAPI_ADDRTYPE 0x3002
229 | MAPI_EMAIL_ADDRESS 0x3003
230 | MAPI_COMMENT 0x3004
231 | MAPI_DEPTH 0x3005
232 | MAPI_PROVIDER_DISPLAY 0x3006
233 | MAPI_CREATION_TIME 0x3007
234 | MAPI_LAST_MODIFICATION_TIME 0x3008
235 | MAPI_RESOURCE_FLAGS 0x3009
236 | MAPI_PROVIDER_DLL_NAME 0x300A
237 | MAPI_SEARCH_KEY 0x300B
238 | MAPI_PROVIDER_UID 0x300C
239 | MAPI_PROVIDER_ORDINAL 0x300D
240 | MAPI_TARGET_ENTRY_ID 0x3010
241 | MAPI_CONVERSATION_ID 0x3013
242 | MAPI_CONVERSATION_INDEX_TRACKING 0x3016
243 | MAPI_FORM_VERSION 0x3301
244 | MAPI_FORM_CLSID 0x3302
245 | MAPI_FORM_CONTACT_NAME 0x3303
246 | MAPI_FORM_CATEGORY 0x3304
247 | MAPI_FORM_CATEGORY_SUB 0x3305
248 | MAPI_FORM_HOST_MAP 0x3306
249 | MAPI_FORM_HIDDEN 0x3307
250 | MAPI_FORM_DESIGNER_NAME 0x3308
251 | MAPI_FORM_DESIGNER_GUID 0x3309
252 | MAPI_FORM_MESSAGE_BEHAVIOR 0x330A
253 | MAPI_DEFAULT_STORE 0x3400
254 | MAPI_STORE_SUPPORT_MASK 0x340D
255 | MAPI_STORE_STATE 0x340E
256 | MAPI_STORE_UNICODE_MASK 0x340F
257 | MAPI_IPM_SUBTREE_SEARCH_KEY 0x3410
258 | MAPI_IPM_OUTBOX_SEARCH_KEY 0x3411
259 | MAPI_IPM_WASTEBASKET_SEARCH_KEY 0x3412
260 | MAPI_IPM_SENTMAIL_SEARCH_KEY 0x3413
261 | MAPI_MDB_PROVIDER 0x3414
262 | MAPI_RECEIVE_FOLDER_SETTINGS 0x3415
263 | MAPI_VALID_FOLDER_MASK 0x35DF
264 | MAPI_IPM_SUBTREE_ENTRYID 0x35E0
265 | MAPI_IPM_OUTBOX_ENTRYID 0x35E2
266 | MAPI_IPM_WASTEBASKET_ENTRYID 0x35E3
267 | MAPI_IPM_SENTMAIL_ENTRYID 0x35E4
268 | MAPI_VIEWS_ENTRYID 0x35E5
269 | MAPI_COMMON_VIEWS_ENTRYID 0x35E6
270 | MAPI_FINDER_ENTRYID 0x35E7
271 | MAPI_CONTAINER_FLAGS 0x3600
272 | MAPI_FOLDER_TYPE 0x3601
273 | MAPI_CONTENT_COUNT 0x3602
274 | MAPI_CONTENT_UNREAD 0x3603
275 | MAPI_CREATE_TEMPLATES 0x3604
276 | MAPI_DETAILS_TABLE 0x3605
277 | MAPI_SEARCH 0x3607
278 | MAPI_SELECTABLE 0x3609
279 | MAPI_SUBFOLDERS 0x360A
280 | MAPI_STATUS 0x360B
281 | MAPI_ANR 0x360C
282 | MAPI_CONTENTS_SORT_ORDER 0x360D
283 | MAPI_CONTAINER_HIERARCHY 0x360E
284 | MAPI_CONTAINER_CONTENTS 0x360F
285 | MAPI_FOLDER_ASSOCIATED_CONTENTS 0x3610
286 | MAPI_DEF_CREATE_DL 0x3611
287 | MAPI_DEF_CREATE_MAILUSER 0x3612
288 | MAPI_CONTAINER_CLASS 0x3613
289 | MAPI_CONTAINER_MODIFY_VERSION 0x3614
290 | MAPI_AB_PROVIDER_ID 0x3615
291 | MAPI_DEFAULT_VIEW_ENTRYID 0x3616
292 | MAPI_ASSOC_CONTENT_COUNT 0x3617
293 | MAPI_ATTACHMENT_X400_PARAMETERS 0x3700
294 | MAPI_ATTACH_DATA_OBJ 0x3701
295 | MAPI_ATTACH_ENCODING 0x3702
296 | MAPI_ATTACH_EXTENSION 0x3703
297 | MAPI_ATTACH_FILENAME 0x3704
298 | MAPI_ATTACH_METHOD 0x3705
299 | MAPI_ATTACH_LONG_FILENAME 0x3707
300 | MAPI_ATTACH_PATHNAME 0x3708
301 | MAPI_ATTACH_RENDERING 0x3709
302 | MAPI_ATTACH_TAG 0x370A
303 | MAPI_RENDERING_POSITION 0x370B
304 | MAPI_ATTACH_TRANSPORT_NAME 0x370C
305 | MAPI_ATTACH_LONG_PATHNAME 0x370D
306 | MAPI_ATTACH_MIME_TAG 0x370E
307 | MAPI_ATTACH_ADDITIONAL_INFO 0x370F
308 | MAPI_ATTACH_MIME_SEQUENCE 0x3710
309 | MAPI_ATTACH_CONTENT_ID 0x3712
310 | MAPI_ATTACH_CONTENT_LOCATION 0x3713
311 | MAPI_ATTACH_FLAGS 0x3714
312 | MAPI_DISPLAY_TYPE 0x3900
313 | MAPI_TEMPLATEID 0x3902
314 | MAPI_PRIMARY_CAPABILITY 0x3904
315 | MAPI_SMTP_ADDRESS 0x39FE
316 | MAPI_7BIT_DISPLAY_NAME 0x39FF
317 | MAPI_ACCOUNT 0x3A00
318 | MAPI_ALTERNATE_RECIPIENT 0x3A01
319 | MAPI_CALLBACK_TELEPHONE_NUMBER 0x3A02
320 | MAPI_CONVERSION_PROHIBITED 0x3A03
321 | MAPI_DISCLOSE_RECIPIENTS 0x3A04
322 | MAPI_GENERATION 0x3A05
323 | MAPI_GIVEN_NAME 0x3A06
324 | MAPI_GOVERNMENT_ID_NUMBER 0x3A07
325 | MAPI_BUSINESS_TELEPHONE_NUMBER 0x3A08
326 | MAPI_HOME_TELEPHONE_NUMBER 0x3A09
327 | MAPI_INITIALS 0x3A0A
328 | MAPI_KEYWORD 0x3A0B
329 | MAPI_LANGUAGE 0x3A0C
330 | MAPI_LOCATION 0x3A0D
331 | MAPI_MAIL_PERMISSION 0x3A0E
332 | MAPI_MHS_COMMON_NAME 0x3A0F
333 | MAPI_ORGANIZATIONAL_ID_NUMBER 0x3A10
334 | MAPI_SURNAME 0x3A11
335 | MAPI_ORIGINAL_ENTRYID 0x3A12
336 | MAPI_ORIGINAL_DISPLAY_NAME 0x3A13
337 | MAPI_ORIGINAL_SEARCH_KEY 0x3A14
338 | MAPI_POSTAL_ADDRESS 0x3A15
339 | MAPI_COMPANY_NAME 0x3A16
340 | MAPI_TITLE 0x3A17
341 | MAPI_DEPARTMENT_NAME 0x3A18
342 | MAPI_OFFICE_LOCATION 0x3A19
343 | MAPI_PRIMARY_TELEPHONE_NUMBER 0x3A1A
344 | MAPI_BUSINESS2_TELEPHONE_NUMBER 0x3A1B
345 | MAPI_MOBILE_TELEPHONE_NUMBER 0x3A1C
346 | MAPI_RADIO_TELEPHONE_NUMBER 0x3A1D
347 | MAPI_CAR_TELEPHONE_NUMBER 0x3A1E
348 | MAPI_OTHER_TELEPHONE_NUMBER 0x3A1F
349 | MAPI_TRANSMITABLE_DISPLAY_NAME 0x3A20
350 | MAPI_PAGER_TELEPHONE_NUMBER 0x3A21
351 | MAPI_USER_CERTIFICATE 0x3A22
352 | MAPI_PRIMARY_FAX_NUMBER 0x3A23
353 | MAPI_BUSINESS_FAX_NUMBER 0x3A24
354 | MAPI_HOME_FAX_NUMBER 0x3A25
355 | MAPI_COUNTRY 0x3A26
356 | MAPI_LOCALITY 0x3A27
357 | MAPI_STATE_OR_PROVINCE 0x3A28
358 | MAPI_STREET_ADDRESS 0x3A29
359 | MAPI_POSTAL_CODE 0x3A2A
360 | MAPI_POST_OFFICE_BOX 0x3A2B
361 | MAPI_TELEX_NUMBER 0x3A2C
362 | MAPI_ISDN_NUMBER 0x3A2D
363 | MAPI_ASSISTANT_TELEPHONE_NUMBER 0x3A2E
364 | MAPI_HOME2_TELEPHONE_NUMBER 0x3A2F
365 | MAPI_ASSISTANT 0x3A30
366 | MAPI_SEND_RICH_INFO 0x3A40
367 | MAPI_WEDDING_ANNIVERSARY 0x3A41
368 | MAPI_BIRTHDAY 0x3A42
369 | MAPI_HOBBIES 0x3A43
370 | MAPI_MIDDLE_NAME 0x3A44
371 | MAPI_DISPLAY_NAME_PREFIX 0x3A45
372 | MAPI_PROFESSION 0x3A46
373 | MAPI_PREFERRED_BY_NAME 0x3A47
374 | MAPI_SPOUSE_NAME 0x3A48
375 | MAPI_COMPUTER_NETWORK_NAME 0x3A49
376 | MAPI_CUSTOMER_ID 0x3A4A
377 | MAPI_TTYTDD_PHONE_NUMBER 0x3A4B
378 | MAPI_FTP_SITE 0x3A4C
379 | MAPI_GENDER 0x3A4D
380 | MAPI_MANAGER_NAME 0x3A4E
381 | MAPI_NICKNAME 0x3A4F
382 | MAPI_PERSONAL_HOME_PAGE 0x3A50
383 | MAPI_BUSINESS_HOME_PAGE 0x3A51
384 | MAPI_CONTACT_VERSION 0x3A52
385 | MAPI_CONTACT_ENTRYIDS 0x3A53
386 | MAPI_CONTACT_ADDRTYPES 0x3A54
387 | MAPI_CONTACT_DEFAULT_ADDRESS_INDEX 0x3A55
388 | MAPI_CONTACT_EMAIL_ADDRESSES 0x3A56
389 | MAPI_COMPANY_MAIN_PHONE_NUMBER 0x3A57
390 | MAPI_CHILDRENS_NAMES 0x3A58
391 | MAPI_HOME_ADDRESS_CITY 0x3A59
392 | MAPI_HOME_ADDRESS_COUNTRY 0x3A5A
393 | MAPI_HOME_ADDRESS_POSTAL_CODE 0x3A5B
394 | MAPI_HOME_ADDRESS_STATE_OR_PROVINCE 0x3A5C
395 | MAPI_HOME_ADDRESS_STREET 0x3A5D
396 | MAPI_HOME_ADDRESS_POST_OFFICE_BOX 0x3A5E
397 | MAPI_OTHER_ADDRESS_CITY 0x3A5F
398 | MAPI_OTHER_ADDRESS_COUNTRY 0x3A60
399 | MAPI_OTHER_ADDRESS_POSTAL_CODE 0x3A61
400 | MAPI_OTHER_ADDRESS_STATE_OR_PROVINCE 0x3A62
401 | MAPI_OTHER_ADDRESS_STREET 0x3A63
402 | MAPI_OTHER_ADDRESS_POST_OFFICE_BOX 0x3A64
403 | MAPI_SEND_INTERNET_ENCODING 0x3A71
404 | MAPI_STORE_PROVIDERS 0x3D00
405 | MAPI_AB_PROVIDERS 0x3D01
406 | MAPI_TRANSPORT_PROVIDERS 0x3D02
407 | MAPI_DEFAULT_PROFILE 0x3D04
408 | MAPI_AB_SEARCH_PATH 0x3D05
409 | MAPI_AB_DEFAULT_DIR 0x3D06
410 | MAPI_AB_DEFAULT_PAB 0x3D07
411 | MAPI_FILTERING_HOOKS 0x3D08
412 | MAPI_SERVICE_NAME 0x3D09
413 | MAPI_SERVICE_DLL_NAME 0x3D0A
414 | MAPI_SERVICE_ENTRY_NAME 0x3D0B
415 | MAPI_SERVICE_UID 0x3D0C
416 | MAPI_SERVICE_EXTRA_UIDS 0x3D0D
417 | MAPI_SERVICES 0x3D0E
418 | MAPI_SERVICE_SUPPORT_FILES 0x3D0F
419 | MAPI_SERVICE_DELETE_FILES 0x3D10
420 | MAPI_AB_SEARCH_PATH_UPDATE 0x3D11
421 | MAPI_PROFILE_NAME 0x3D12
422 | MAPI_IDENTITY_DISPLAY 0x3E00
423 | MAPI_IDENTITY_ENTRYID 0x3E01
424 | MAPI_RESOURCE_METHODS 0x3E02
425 | MAPI_RESOURCE_TYPE 0x3E03
426 | MAPI_STATUS_CODE 0x3E04
427 | MAPI_IDENTITY_SEARCH_KEY 0x3E05
428 | MAPI_OWN_STORE_ENTRYID 0x3E06
429 | MAPI_RESOURCE_PATH 0x3E07
430 | MAPI_STATUS_STRING 0x3E08
431 | MAPI_X400_DEFERRED_DELIVERY_CANCEL 0x3E09
432 | MAPI_HEADER_FOLDER_ENTRYID 0x3E0A
433 | MAPI_REMOTE_PROGRESS 0x3E0B
434 | MAPI_REMOTE_PROGRESS_TEXT 0x3E0C
435 | MAPI_REMOTE_VALIDATE_OK 0x3E0D
436 | MAPI_CONTROL_FLAGS 0x3F00
437 | MAPI_CONTROL_STRUCTURE 0x3F01
438 | MAPI_CONTROL_TYPE 0x3F02
439 | MAPI_DELTAX 0x3F03
440 | MAPI_DELTAY 0x3F04
441 | MAPI_XPOS 0x3F05
442 | MAPI_YPOS 0x3F06
443 | MAPI_CONTROL_ID 0x3F07
444 | MAPI_INITIAL_DETAILS_PANE 0x3F08
445 | MAPI_UNCOMPRESSED_BODY 0x3FD9
446 | MAPI_INTERNET_CODEPAGE 0x3FDE
447 | MAPI_AUTO_RESPONSE_SUPPRESS 0x3FDF
448 | MAPI_MESSAGE_LOCALE_ID 0x3FF1
449 | MAPI_RULE_TRIGGER_HISTORY 0x3FF2
450 | MAPI_MOVE_TO_STORE_ENTRYID 0x3FF3
451 | MAPI_MOVE_TO_FOLDER_ENTRYID 0x3FF4
452 | MAPI_STORAGE_QUOTA_LIMIT 0x3FF5
453 | MAPI_EXCESS_STORAGE_USED 0x3FF6
454 | MAPI_SVR_GENERATING_QUOTA_MSG 0x3FF7
455 | MAPI_CREATOR_NAME 0x3FF8
456 | MAPI_CREATOR_ENTRY_ID 0x3FF9
457 | MAPI_LAST_MODIFIER_NAME 0x3FFA
458 | MAPI_LAST_MODIFIER_ENTRY_ID 0x3FFB
459 | MAPI_REPLY_RECIPIENT_SMTP_PROXIES 0x3FFC
460 | MAPI_MESSAGE_CODEPAGE 0x3FFD
461 | MAPI_EXTENDED_ACL_DATA 0x3FFE
462 | MAPI_SENDER_FLAGS 0x4019
463 | MAPI_SENT_REPRESENTING_FLAGS 0x401A
464 | MAPI_RECEIVED_BY_FLAGS 0x401B
465 | MAPI_RECEIVED_REPRESENTING_FLAGS 0x401C
466 | MAPI_CREATOR_ADDRESS_TYPE 0x4022
467 | MAPI_CREATOR_EMAIL_ADDRESS 0x4023
468 | MAPI_SENDER_SIMPLE_DISPLAY_NAME 0x4030
469 | MAPI_SENT_REPRESENTING_SIMPLE_DISPLAY_NAME 0x4031
470 | MAPI_RECEIVED_REPRESENTING_SIMPLE_DISPLAY_NAME 0x4035
471 | MAPI_CREATOR_SIMPLE_DISP_NAME 0x4038
472 | MAPI_LAST_MODIFIER_SIMPLE_DISPLAY_NAME 0x4039
473 | MAPI_CONTENT_FILTER_SPAM_CONFIDENCE_LEVEL 0x4076
474 | MAPI_INTERNET_MAIL_OVERRIDE_FORMAT 0x5902
475 | MAPI_MESSAGE_EDITOR_FORMAT 0x5909
476 | MAPI_SENDER_SMTP_ADDRESS 0x5D01
477 | MAPI_SENT_REPRESENTING_SMTP_ADDRESS 0x5D02
478 | MAPI_READ_RECEIPT_SMTP_ADDRESS 0x5D05
479 | MAPI_RECEIVED_BY_SMTP_ADDRESS 0x5D07
480 | MAPI_RECEIVED_REPRESENTING_SMTP_ADDRESS 0x5D08
481 | MAPI_SENDING_SMTP_ADDRESS 0x5D09
482 | MAPI_SIP_ADDRESS 0x5FE5
483 | MAPI_RECIPIENT_DISPLAY_NAME 0x5FF6
484 | MAPI_RECIPIENT_ENTRYID 0x5FF7
485 | MAPI_RECIPIENT_FLAGS 0x5FFD
486 | MAPI_RECIPIENT_TRACKSTATUS 0x5FFF
487 | MAPI_CHANGE_KEY 0x65E2
488 | MAPI_PREDECESSOR_CHANGE_LIST 0x65E3
489 | MAPI_ID_SECURE_MIN 0x67F0
490 | MAPI_ID_SECURE_MAX 0x67FF
491 | MAPI_VOICE_MESSAGE_DURATION 0x6801
492 | MAPI_SENDER_TELEPHONE_NUMBER 0x6802
493 | MAPI_VOICE_MESSAGE_SENDER_NAME 0x6803
494 | MAPI_FAX_NUMBER_OF_PAGES 0x6804
495 | MAPI_VOICE_MESSAGE_ATTACHMENT_ORDER 0x6805
496 | MAPI_CALL_ID 0x6806
497 | MAPI_ATTACHMENT_LINK_ID 0x7FFA
498 | MAPI_EXCEPTION_START_TIME 0x7FFB
499 | MAPI_EXCEPTION_END_TIME 0x7FFC
500 | MAPI_ATTACHMENT_FLAGS 0x7FFD
501 | MAPI_ATTACHMENT_HIDDEN 0x7FFE
502 | MAPI_ATTACHMENT_CONTACT_PHOTO 0x7FFF
503 | MAPI_FILE_UNDER 0x8005
504 | MAPI_FILE_UNDER_ID 0x8006
505 | MAPI_CONTACT_ITEM_DATA 0x8007
506 | MAPI_REFERRED_BY 0x800E
507 | MAPI_DEPARTMENT 0x8010
508 | MAPI_HAS_PICTURE 0x8015
509 | MAPI_HOME_ADDRESS 0x801A
510 | MAPI_WORK_ADDRESS 0x801B
511 | MAPI_OTHER_ADDRESS 0x801C
512 | MAPI_POSTAL_ADDRESS_ID 0x8022
513 | MAPI_CONTACT_CHARACTER_SET 0x8023
514 | MAPI_AUTO_LOG 0x8025
515 | MAPI_FILE_UNDER_LIST 0x8026
516 | MAPI_EMAIL_LIST 0x8027
517 | MAPI_ADDRESS_BOOK_PROVIDER_EMAIL_LIST 0x8028
518 | MAPI_ADDRESS_BOOK_PROVIDER_ARRAY_TYPE 0x8029
519 | MAPI_HTML 0x802B
520 | MAPI_YOMI_FIRST_NAME 0x802C
521 | MAPI_YOMI_LAST_NAME 0x802D
522 | MAPI_YOMI_COMPANY_NAME 0x802E
523 | MAPI_BUSINESS_CARD_DISPLAY_DEFINITION 0x8040
524 | MAPI_BUSINESS_CARD_CARD_PICTURE 0x8041
525 | MAPI_WORK_ADDRESS_STREET 0x8045
526 | MAPI_WORK_ADDRESS_CITY 0x8046
527 | MAPI_WORK_ADDRESS_STATE 0x8047
528 | MAPI_WORK_ADDRESS_POSTAL_CODE 0x8048
529 | MAPI_WORK_ADDRESS_COUNTRY 0x8049
530 | MAPI_WORK_ADDRESS_POST_OFFICE_BOX 0x804A
531 | MAPI_DISTRIBUTION_LIST_CHECKSUM 0x804C
532 | MAPI_BIRTHDAY_EVENT_ENTRY_ID 0x804D
533 | MAPI_ANNIVERSARY_EVENT_ENTRY_ID 0x804E
534 | MAPI_CONTACT_USER_FIELD1 0x804F
535 | MAPI_CONTACT_USER_FIELD2 0x8050
536 | MAPI_CONTACT_USER_FIELD3 0x8051
537 | MAPI_CONTACT_USER_FIELD4 0x8052
538 | MAPI_DISTRIBUTION_LIST_NAME 0x8053
539 | MAPI_DISTRIBUTION_LIST_ONE_OFF_MEMBERS 0x8054
540 | MAPI_DISTRIBUTION_LIST_MEMBERS 0x8055
541 | MAPI_INSTANT_MESSAGING_ADDRESS 0x8062
542 | MAPI_DISTRIBUTION_LIST_STREAM 0x8064
543 | MAPI_EMAIL_DISPLAY_NAME 0x8080
544 | MAPI_EMAIL_ADDR_TYPE 0x8082
545 | MAPI_EMAIL_EMAIL_ADDRESS 0x8083
546 | MAPI_EMAIL_ORIGINAL_DISPLAY_NAME 0x8084
547 | MAPI_EMAIL1ORIGINAL_ENTRY_ID 0x8085
548 | MAPI_EMAIL1RICH_TEXT_FORMAT 0x8086
549 | MAPI_EMAIL1EMAIL_TYPE 0x8087
550 | MAPI_EMAIL2DISPLAY_NAME 0x8090
551 | MAPI_EMAIL2ENTRY_ID 0x8091
552 | MAPI_EMAIL2ADDR_TYPE 0x8092
553 | MAPI_EMAIL2EMAIL_ADDRESS 0x8093
554 | MAPI_EMAIL2ORIGINAL_DISPLAY_NAME 0x8094
555 | MAPI_EMAIL2ORIGINAL_ENTRY_ID 0x8095
556 | MAPI_EMAIL2RICH_TEXT_FORMAT 0x8096
557 | MAPI_EMAIL3DISPLAY_NAME 0x80A0
558 | MAPI_EMAIL3ENTRY_ID 0x80A1
559 | MAPI_EMAIL3ADDR_TYPE 0x80A2
560 | MAPI_EMAIL3EMAIL_ADDRESS 0x80A3
561 | MAPI_EMAIL3ORIGINAL_DISPLAY_NAME 0x80A4
562 | MAPI_EMAIL3ORIGINAL_ENTRY_ID 0x80A5
563 | MAPI_EMAIL3RICH_TEXT_FORMAT 0x80A6
564 | MAPI_FAX1ADDRESS_TYPE 0x80B2
565 | MAPI_FAX1EMAIL_ADDRESS 0x80B3
566 | MAPI_FAX1ORIGINAL_DISPLAY_NAME 0x80B4
567 | MAPI_FAX1ORIGINAL_ENTRY_ID 0x80B5
568 | MAPI_FAX2ADDRESS_TYPE 0x80C2
569 | MAPI_FAX2EMAIL_ADDRESS 0x80C3
570 | MAPI_FAX2ORIGINAL_DISPLAY_NAME 0x80C4
571 | MAPI_FAX2ORIGINAL_ENTRY_ID 0x80C5
572 | MAPI_FAX3ADDRESS_TYPE 0x80D2
573 | MAPI_FAX3EMAIL_ADDRESS 0x80D3
574 | MAPI_FAX3ORIGINAL_DISPLAY_NAME 0x80D4
575 | MAPI_FAX3ORIGINAL_ENTRY_ID 0x80D5
576 | MAPI_FREE_BUSY_LOCATION 0x80D8
577 | MAPI_HOME_ADDRESS_COUNTRY_CODE 0x80DA
578 | MAPI_WORK_ADDRESS_COUNTRY_CODE 0x80DB
579 | MAPI_OTHER_ADDRESS_COUNTRY_CODE 0x80DC
580 | MAPI_ADDRESS_COUNTRY_CODE 0x80DD
581 | MAPI_BIRTHDAY_LOCAL 0x80DE
582 | MAPI_WEDDING_ANNIVERSARY_LOCAL 0x80DF
583 | MAPI_TASK_STATUS 0x8101
584 | MAPI_TASK_START_DATE 0x8104
585 | MAPI_TASK_DUE_DATE 0x8105
586 | MAPI_TASK_ACTUAL_EFFORT 0x8110
587 | MAPI_TASK_ESTIMATED_EFFORT 0x8111
588 | MAPI_TASK_FRECUR 0x8126
589 | MAPI_SEND_MEETING_AS_ICAL 0x8200
590 | MAPI_APPOINTMENT_SEQUENCE 0x8201
591 | MAPI_APPOINTMENT_SEQUENCE_TIME 0x8202
592 | MAPI_APPOINTMENT_LAST_SEQUENCE 0x8203
593 | MAPI_CHANGE_HIGHLIGHT 0x8204
594 | MAPI_BUSY_STATUS 0x8205
595 | MAPI_FEXCEPTIONAL_BODY 0x8206
596 | MAPI_APPOINTMENT_AUXILIARY_FLAGS 0x8207
597 | MAPI_OUTLOOK_LOCATION 0x8208
598 | MAPI_MEETING_WORKSPACE_URL 0x8209
599 | MAPI_FORWARD_INSTANCE 0x820A
600 | MAPI_LINKED_TASK_ITEMS 0x820C
601 | MAPI_APPT_START_WHOLE 0x820D
602 | MAPI_APPT_END_WHOLE 0x820E
603 | MAPI_APPOINTMENT_START_TIME 0x820F
604 | MAPI_APPOINTMENT_END_TIME 0x8210
605 | MAPI_APPOINTMENT_END_DATE 0x8211
606 | MAPI_APPOINTMENT_START_DATE 0x8212
607 | MAPI_APPT_DURATION 0x8213
608 | MAPI_APPOINTMENT_COLOR 0x8214
609 | MAPI_APPOINTMENT_SUB_TYPE 0x8215
610 | MAPI_APPOINTMENT_RECUR 0x8216
611 | MAPI_APPOINTMENT_STATE_FLAGS 0x8217
612 | MAPI_RESPONSE_STATUS 0x8218
613 | MAPI_APPOINTMENT_REPLY_TIME 0x8220
614 | MAPI_RECURRING 0x8223
615 | MAPI_INTENDED_BUSY_STATUS 0x8224
616 | MAPI_APPOINTMENT_UPDATE_TIME 0x8226
617 | MAPI_EXCEPTION_REPLACE_TIME 0x8228
618 | MAPI_OWNER_NAME 0x822E
619 | MAPI_APPOINTMENT_REPLY_NAME 0x8230
620 | MAPI_RECURRENCE_TYPE 0x8231
621 | MAPI_RECURRENCE_PATTERN 0x8232
622 | MAPI_TIME_ZONE_STRUCT 0x8233
623 | MAPI_TIME_ZONE_DESCRIPTION 0x8234
624 | MAPI_CLIP_START 0x8235
625 | MAPI_CLIP_END 0x8236
626 | MAPI_ORIGINAL_STORE_ENTRY_ID 0x8237
627 | MAPI_ALL_ATTENDEES_STRING 0x8238
628 | MAPI_AUTO_FILL_LOCATION 0x823A
629 | MAPI_TO_ATTENDEES_STRING 0x823B
630 | MAPI_CCATTENDEES_STRING 0x823C
631 | MAPI_CONF_CHECK 0x8240
632 | MAPI_CONFERENCING_TYPE 0x8241
633 | MAPI_DIRECTORY 0x8242
634 | MAPI_ORGANIZER_ALIAS 0x8243
635 | MAPI_AUTO_START_CHECK 0x8244
636 | MAPI_AUTO_START_WHEN 0x8245
637 | MAPI_ALLOW_EXTERNAL_CHECK 0x8246
638 | MAPI_COLLABORATE_DOC 0x8247
639 | MAPI_NET_SHOW_URL 0x8248
640 | MAPI_ONLINE_PASSWORD 0x8249
641 | MAPI_APPOINTMENT_PROPOSED_DURATION 0x8256
642 | MAPI_APPT_COUNTER_PROPOSAL 0x8257
643 | MAPI_APPOINTMENT_PROPOSAL_NUMBER 0x8259
644 | MAPI_APPOINTMENT_NOT_ALLOW_PROPOSE 0x825A
645 | MAPI_APPT_TZDEF_START_DISPLAY 0x825E
646 | MAPI_APPT_TZDEF_END_DISPLAY 0x825F
647 | MAPI_APPT_TZDEF_RECUR 0x8260
648 | MAPI_REMINDER_MINUTES_BEFORE_START 0x8501
649 | MAPI_REMINDER_TIME 0x8502
650 | MAPI_REMINDER_SET 0x8503
651 | MAPI_PRIVATE 0x8506
652 | MAPI_AGING_DONT_AGE_ME 0x850E
653 | MAPI_FORM_STORAGE 0x850F
654 | MAPI_SIDE_EFFECTS 0x8510
655 | MAPI_REMOTE_STATUS 0x8511
656 | MAPI_PAGE_DIR_STREAM 0x8513
657 | MAPI_SMART_NO_ATTACH 0x8514
658 | MAPI_COMMON_START 0x8516
659 | MAPI_COMMON_END 0x8517
660 | MAPI_TASK_MODE 0x8518
661 | MAPI_FORM_PROP_STREAM 0x851B
662 | MAPI_REQUEST 0x8530
663 | MAPI_NON_SENDABLE_TO 0x8536
664 | MAPI_NON_SENDABLE_CC 0x8537
665 | MAPI_NON_SENDABLE_BCC 0x8538
666 | MAPI_COMPANIES 0x8539
667 | MAPI_CONTACTS 0x853A
668 | MAPI_PROP_DEF_STREAM 0x8540
669 | MAPI_SCRIPT_STREAM 0x8541
670 | MAPI_CUSTOM_FLAG 0x8542
671 | MAPI_OUTLOOK_CURRENT_VERSION 0x8552
672 | MAPI_CURRENT_VERSION_NAME 0x8554
673 | MAPI_REMINDER_NEXT_TIME 0x8560
674 | MAPI_HEADER_ITEM 0x8578
675 | MAPI_USE_TNEF 0x8582
676 | MAPI_TO_DO_TITLE 0x85A4
677 | MAPI_VALID_FLAG_STRING_PROOF 0x85BF
678 | MAPI_LOG_TYPE 0x8700
679 | MAPI_LOG_START 0x8706
680 | MAPI_LOG_DURATION 0x8707
681 | MAPI_LOG_END 0x8708
682 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/requirements.txt
--------------------------------------------------------------------------------
/scripts/make_props.py:
--------------------------------------------------------------------------------
1 | """
2 | Tool to regenerate tnefparse/properties.py
3 |
4 | The mapping of property names to numeric value is maintained in data/properties.txt
5 |
6 | Use:
7 | python scripts/make_props.py
8 |
9 | """
10 | from collections import OrderedDict
11 | from pathlib import Path
12 |
13 | properties = OrderedDict()
14 |
15 | for prop in Path('data/properties.txt').read_text().splitlines():
16 | prop = prop.strip()
17 | if not prop or prop.startswith('#'):
18 | continue
19 | name, val = prop.split(' ')
20 | properties[name] = val
21 | sort_by_val = OrderedDict(sorted(properties.items(), key=lambda t: t[1]))
22 |
23 | with Path('tnefparse/properties.py').open('w') as out:
24 |
25 | out.write('''"""
26 | Property reference docs:
27 |
28 | - https://docs.microsoft.com/en-us/office/client-developer/outlook/mapi/mapping-canonical-property-names-to-mapi-names#tagged-properties
29 | - https://interoperability.blob.core.windows.net/files/MS-OXPROPS/[MS-OXPROPS].pdf
30 | - https://fossies.org/linux/libpst/xml/MAPI_definitions.pdf
31 | - https://docs.microsoft.com/en-us/office/client-developer/outlook/mapi/mapi-constants
32 |
33 |
34 | +----------------+----------------+-------------------------------------------------------------------------------+
35 | | Range minimum | Range maximum | Description |
36 | +----------------+----------------+-------------------------------------------------------------------------------+
37 | | 0x0001 | 0x0BFF | Message object envelope property; reserved |
38 | | 0x0C00 | 0x0DFF | Recipient property; reserved |
39 | | 0x0E00 | 0x0FFF | Non-transmittable Message property; reserved |
40 | | 0x1000 | 0x2FFF | Message content property; reserved |
41 | | 0x3000 | 0x33FF | Multi-purpose property that can appear on all or most objects; reserved |
42 | | 0x3400 | 0x35FF | Message store property; reserved |
43 | | 0x3600 | 0x36FF | Folder and address book container property; reserved |
44 | | 0x3700 | 0x38FF | Attachment property; reserved |
45 | | 0x3900 | 0x39FF | Address Book object property; reserved |
46 | | 0x3A00 | 0x3BFF | Mail user object property; reserved |
47 | | 0x3C00 | 0x3CFF | Distribution list property; reserved |
48 | | 0x3D00 | 0x3DFF | Profile section property; reserved |
49 | | 0x3E00 | 0x3EFF | Status object property; reserved |
50 | | 0x4000 | 0x57FF | Transport-defined envelope property |
51 | | 0x5800 | 0x5FFF | Transport-defined recipient property |
52 | | 0x6000 | 0x65FF | User-defined non-transmittable property |
53 | | 0x6600 | 0x67FF | Provider-defined internal non-transmittable property |
54 | | 0x6800 | 0x7BFF | Message class-defined content property |
55 | | 0x7C00 | 0x7FFF | Message class-defined non-transmittable property |
56 | | 0x8000 | 0xFFFF | Reserved for mapping to named properties. The exceptions to this rule are |
57 | | | | some of the address book tagged properties (those with names beginning with |
58 | | | | PIDTagAddressBook). Many are static property IDs but are in this range. |
59 | +----------------+----------------+-------------------------------------------------------------------------------+
60 | """
61 |
62 |
63 | ''')
64 |
65 | for name, val in sort_by_val.items():
66 | out.write(f'{name} = {val}\n')
67 |
68 | out.write('\n')
69 | out.write('CODE_TO_NAME = {\n')
70 | for name, _ in sort_by_val.items():
71 | out.write(f' {name}: "{name}",\n')
72 | out.write('}\n')
73 |
--------------------------------------------------------------------------------
/setup.cfg:
--------------------------------------------------------------------------------
1 | [aliases]
2 | test=pytest
3 |
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | from pathlib import Path
2 | from setuptools import setup, find_packages
3 |
4 | version = '1.4.1-dev0'
5 |
6 | setup(name='tnefparse',
7 | version=version,
8 | description="a TNEF decoding library written in Python, without external dependencies",
9 | long_description=Path('README.rst').read_text() + '\n\n' + Path('HISTORY.rst').read_text(),
10 | classifiers=[
11 | 'Topic :: Communications :: Email',
12 | 'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)',
13 | 'Intended Audience :: Developers',
14 | 'Intended Audience :: End Users/Desktop',
15 | 'Programming Language :: Python',
16 | 'Programming Language :: Python :: 3',
17 | 'Programming Language :: Python :: 3.6',
18 | 'Programming Language :: Python :: 3.7',
19 | 'Programming Language :: Python :: 3.8',
20 | 'Programming Language :: Python :: 3.9',
21 | 'Programming Language :: Python :: Implementation :: CPython',
22 | 'Programming Language :: Python :: Implementation :: PyPy',
23 | 'Development Status :: 5 - Production/Stable',
24 | 'Environment :: Console',
25 | ],
26 | keywords='TNEF MAPI decoding mail email microsoft',
27 | author='Petri Savolainen',
28 | author_email='petri.savolainen@koodaamo.fi',
29 | url='https://github.com/koodaamo/tnefparse',
30 | license='LGPL',
31 | packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
32 | python_requires='>= 3.6',
33 | extras_require={'optional': ['compressed_rtf', ], },
34 | include_package_data=True,
35 | zip_safe=True,
36 | entry_points={
37 | 'console_scripts': ['tnefparse = tnefparse.cmdline:tnefparse']
38 | })
39 |
--------------------------------------------------------------------------------
/tests/examples/IPM-DistList.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/IPM-DistList.tnef
--------------------------------------------------------------------------------
/tests/examples/MAPI_ATTACH_DATA_OBJ.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/MAPI_ATTACH_DATA_OBJ.tnef
--------------------------------------------------------------------------------
/tests/examples/MAPI_OBJECT.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/MAPI_OBJECT.tnef
--------------------------------------------------------------------------------
/tests/examples/bad_checksum.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/bad_checksum.tnef
--------------------------------------------------------------------------------
/tests/examples/body.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/body.tnef
--------------------------------------------------------------------------------
/tests/examples/data-before-name.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/data-before-name.tnef
--------------------------------------------------------------------------------
/tests/examples/duplicate_filename.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/duplicate_filename.tnef
--------------------------------------------------------------------------------
/tests/examples/garbage-at-end.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/garbage-at-end.tnef
--------------------------------------------------------------------------------
/tests/examples/long-filename.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/long-filename.tnef
--------------------------------------------------------------------------------
/tests/examples/minimal_attachment.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/minimal_attachment.tnef
--------------------------------------------------------------------------------
/tests/examples/missing-filenames.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/missing-filenames.tnef
--------------------------------------------------------------------------------
/tests/examples/multi-name-property.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/multi-name-property.tnef
--------------------------------------------------------------------------------
/tests/examples/multi-value-attribute.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/multi-value-attribute.tnef
--------------------------------------------------------------------------------
/tests/examples/one-file.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/one-file.tnef
--------------------------------------------------------------------------------
/tests/examples/rtf.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/rtf.tnef
--------------------------------------------------------------------------------
/tests/examples/triples.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/triples.tnef
--------------------------------------------------------------------------------
/tests/examples/two-files.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/two-files.tnef
--------------------------------------------------------------------------------
/tests/examples/umlaut.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/umlaut.tnef
--------------------------------------------------------------------------------
/tests/examples/unicode-mapi-attr-name.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/unicode-mapi-attr-name.tnef
--------------------------------------------------------------------------------
/tests/examples/unicode-mapi-attr.tnef:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koodaamo/tnefparse/890854637f34af298a6ed2356c3c0d789b84bca1/tests/examples/unicode-mapi-attr.tnef
--------------------------------------------------------------------------------
/tests/test_attributes.py:
--------------------------------------------------------------------------------
1 | from datetime import datetime
2 | from decimal import Decimal
3 | from uuid import UUID
4 | import logging
5 |
6 | from tnefparse.mapi import TNEFMAPI_Attribute
7 |
8 | attributes = [
9 | (0x0000, [], b""),
10 | (0x0001, [], None),
11 | (0x0002, b"\00\01", 256),
12 | (0x0003, b"4\x01\x00\x00", 308),
13 | (0x0003, b"\x9fN\x00\x00", 20127),
14 | (0x0003, b"\xff\xff\xff\xff", -1),
15 | (0x0004, b"ABCD", 781.0352172851562),
16 | (0x0005, b"ABCDEFGH", 1.5839800103804824e+40),
17 | (0x0006, b"ABCDEFGH", Decimal('520820875738921.4273')),
18 | (0x0007, b"0\xe3\x1d\x0e\xef\x15\xbf\x01", datetime(1899, 12, 30, 0, 0)),
19 | (0x000A, b"\xff\xff\xff\xff", 4294967295),
20 | (0x000B, b"\x00\x00", False),
21 | (0x000B, b"\x01\x00", True),
22 | (0x000D, [b"00"], b"00"),
23 | (0x0014, b"\x01\x00", 1),
24 | (0x001E, ["<14341.17573.560761.368512@localhost.localdomain>\x00\x00\x00"],
25 | "<14341.17573.560761.368512@localhost.localdomain>"),
26 | (0x001E, ["AUTHORS\x00"], "AUTHORS"),
27 | (0x001F, ["\u200bhello world\x00\x00"], "\u200bhello world"),
28 | (0x001F, ["example.dat\x00"], "example.dat"),
29 | (0x0040, b"0\xe3\x1d\x0e\xef\x15\xbf\x01", datetime(1999, 10, 14, 2, 51, 46, 787000)),
30 | (0x0048, b"\x11\xf8\x30\x73\x7f\xf4\xbc\x41\xa4\xff\xe7\x92\xd0\x73\xf4\x1f",
31 | UUID('7330f811-f47f-41bc-a4ff-e792d073f41f')),
32 | (0x0102, [b""], b""),
33 | (0x0102, [b"<14341.17573.560761.368512@localhost.localdomain>\x00\x00\x00"],
34 | b"<14341.17573.560761.368512@localhost.localdomain>"),
35 | (0x0102, [b"EX:/O=COMPUWARE/OU=NUMEGA LAB/CN=RECIPIENTS/CN=MSIMPSON\x00"],
36 | b"EX:/O=COMPUWARE/OU=NUMEGA LAB/CN=RECIPIENTS/CN=MSIMPSON"),
37 | ]
38 |
39 |
40 | def test_decode_known(caplog):
41 | for typ, data, parsed in attributes:
42 | att = TNEFMAPI_Attribute(typ, 0, data, None, f"Type: 0x{typ:04x}")
43 | assert att.data == parsed, att.name_str
44 |
45 | assert caplog.record_tuples == []
46 |
47 |
48 | def test_decode_unknown(caplog):
49 | att = TNEFMAPI_Attribute(0xAAAA, 0, [b"123"], None)
50 | assert att.data == b'123'
51 |
52 | assert caplog.record_tuples == [
53 | ('tnefparse', logging.WARNING, 'Unknown data type: 0xaaaa'),
54 | ]
55 |
--------------------------------------------------------------------------------
/tests/test_cmdline.py:
--------------------------------------------------------------------------------
1 | import io
2 | import zipfile
3 | import json
4 | import logging
5 | import sys
6 | from pathlib import Path
7 | from unittest.mock import patch
8 |
9 | import pytest
10 |
11 | import tnefparse.cmdline
12 |
13 | EXAMPLES = (Path(__file__).resolve().parent / "examples").relative_to(Path('.').resolve())
14 |
15 |
16 | def test_cmdline_overview(script_runner):
17 | ret = script_runner.run('tnefparse', '-o', str(EXAMPLES / 'body.tnef'))
18 | assert ret.success
19 | assert "Overview of tests/examples/body.tnef" in ret.stdout
20 | assert ret.stderr == ''
21 | assert ret.success
22 |
23 |
24 | def test_cmdline_attch_extract(script_runner, tmp_path):
25 | ret = script_runner.run('tnefparse', '-a', '-p', str(tmp_path), str(EXAMPLES / 'one-file.tnef'))
26 | assert ret.stderr == 'Successfully wrote 1 files\n'
27 | assert ret.success
28 |
29 |
30 | def test_cmdline_zip_extract(script_runner, tmp_path):
31 | ret = script_runner.run('tnefparse', '-z', '-p', str(tmp_path), str(EXAMPLES / 'duplicate_filename.tnef'))
32 | assert (tmp_path / "attachments.zip").is_file()
33 | assert ret.stderr == 'Successfully wrote attachments.zip\n'
34 | zip_stream = io.BytesIO((tmp_path / "attachments.zip").read_bytes())
35 | zip_file = zipfile.ZipFile(zip_stream)
36 | assert zip_file.namelist() == ['file_abcdefgh.txt', 'file_abcdefgh-2.txt', 'VIA_Nytt_14021.htm']
37 | assert ret.success
38 |
39 |
40 | def test_cmdline_no_body(script_runner):
41 | ret = script_runner.run('tnefparse', '-b', str(EXAMPLES / 'one-file.tnef'))
42 | assert ret.stderr == 'No body found\n'
43 | assert not ret.success
44 |
45 |
46 | def test_cmdline_body(script_runner):
47 | ret = script_runner.run('tnefparse', '-b', str(EXAMPLES / 'unicode-mapi-attr.tnef'))
48 | assert len(ret.stdout) == 12
49 | assert ret.stderr == ''
50 | assert ret.success
51 |
52 |
53 | def test_cmdline_no_htmlbody(script_runner):
54 | ret = script_runner.run('tnefparse', '-hb', str(EXAMPLES / 'one-file.tnef'))
55 | assert ret.stderr == 'No HTML body found\n'
56 | assert not ret.success
57 |
58 |
59 | def test_cmdline_htmlbody(script_runner):
60 | ret = script_runner.run('tnefparse', '-hb', str(EXAMPLES / 'body.tnef'))
61 | assert len(ret.stdout) == 5358
62 | assert ret.stderr == ''
63 | assert ret.success
64 |
65 |
66 | def test_cmdline_no_rtfbody(script_runner):
67 | ret = script_runner.run('tnefparse', '-rb', str(EXAMPLES / 'one-file.tnef'))
68 | assert ret.stderr == 'No RTF body found\n'
69 | assert not ret.success
70 |
71 |
72 | def test_cmdline_rtfbody(script_runner):
73 | ret = script_runner.run('tnefparse', '-rb', str(EXAMPLES / 'rtf.tnef'))
74 | assert len(ret.stdout) == 593
75 | assert ret.stderr == ''
76 | assert ret.success
77 |
78 |
79 | def test_dump(script_runner):
80 | ret = script_runner.run('tnefparse', '-d', str(EXAMPLES / 'two-files.tnef'))
81 | assert ret.success
82 | dump = json.loads(ret.stdout)
83 | assert sorted(dump.keys()) == ['attachments', 'attributes', 'extended_attributes']
84 | assert len(dump['attachments']) == 2
85 |
86 |
87 | @patch.object(sys, 'argv', ['tnefparse', str(EXAMPLES / 'two-files.tnef')])
88 | @patch.object(tnefparse.cmdline, "TNEF")
89 | def test_handle_value_errors(mocked_TNEF):
90 | """Make sure e.g. invalid TNEF signatures are handled"""
91 | # If there is a suitable TNEF file with an e.g. invalid TNEF signature,
92 | # this test should be updated.
93 | mocked_TNEF.side_effect = ValueError("Value not allowed.")
94 | with pytest.raises(SystemExit):
95 | from tnefparse.cmdline import tnefparse
96 | tnefparse()
97 |
98 |
99 | def test_help_is_printed(script_runner):
100 | """calling `tnefparse` with no argument prints help text"""
101 | ret = script_runner.run('tnefparse')
102 | help_text = "Extract TNEF file contents. Show this help message if no arguments are given."
103 | assert help_text in ret.stdout
104 | assert "positional arguments" in ret.stdout
105 | assert "optional argument" in ret.stdout
106 |
107 |
108 | def test_print_overview(script_runner):
109 | ret = script_runner.run('tnefparse', '-o', str(EXAMPLES / 'one-file.tnef'))
110 | assert "Overview of tests/examples/one-file.tnef" in ret.stdout
111 | assert "Attachments" in ret.stdout
112 | assert "Objects" in ret.stdout
113 | assert "Properties" in ret.stdout
114 |
115 |
116 | def test_cmdline_logging_info(caplog, capsys):
117 | """Logging level set to INFO returns some INFO log messages"""
118 | retv = tnefparse.cmdline.tnefparse(('-l', 'INFO', '-rb', str(EXAMPLES / 'rtf.tnef')))
119 | assert not retv
120 | stdout, _ = capsys.readouterr()
121 | assert len(stdout) == 593
122 | assert caplog.record_tuples == [
123 | ('tnefparse', logging.INFO, 'Skipping checksum for performance'),
124 | ]
125 |
126 |
127 | def test_cmdline_logging_warn(caplog, capsys):
128 | """Logging level set to WARN returns no INFO log messages"""
129 | retv = tnefparse.cmdline.tnefparse(('-l', 'WARN', '-rb', str(EXAMPLES / 'rtf.tnef')))
130 | assert not retv
131 | stdout, _ = capsys.readouterr()
132 | assert len(stdout) == 593
133 | assert caplog.record_tuples == []
134 |
135 |
136 | def test_cmdline_logging_illegal():
137 | """Logging level set to ILLEGAL is illegal"""
138 | with pytest.raises(SystemExit):
139 | tnefparse.cmdline.tnefparse(('-l', 'ILLEGAL', '-rb', str(EXAMPLES / 'rtf.tnef')))
140 |
--------------------------------------------------------------------------------
/tests/test_codepage.py:
--------------------------------------------------------------------------------
1 | from tnefparse.codepage import Codepage
2 |
3 |
4 | def test_guesses():
5 | codes = [0, 437, 1200, 1252, 1255, 20127, 20866, 28591, 57011, 65001, 65002]
6 | best_guesses = [Codepage(c).best_guess() for c in codes]
7 | assert best_guesses == ['cp0', 'cp437', 'cp1200', 'cp1252', 'cp1255', 'ascii',
8 | 'koi8-r', 'iso-8859-1', None, 'utf-8', None]
9 |
10 |
11 | def test_codepage():
12 | codes = [20127, 1252, 57011]
13 | pages = [Codepage(c).codepage() for c in codes]
14 | assert pages == ['ascii', 'cp1252', 'cp57011']
15 |
16 |
17 | def test_decode_str():
18 | cp = Codepage(57011)
19 | assert '123' == cp.decode('123')
20 |
21 |
22 | def test_decode_bg():
23 | cp = Codepage(65001)
24 | assert "☺" == cp.decode(b"\xE2\x98\xBA")
25 |
26 |
27 | def test_decode_fallback():
28 | cp = Codepage(9999)
29 | assert 'ñ' == cp.decode(b'\xF1')
30 |
--------------------------------------------------------------------------------
/tests/test_decoding.py:
--------------------------------------------------------------------------------
1 | import logging
2 | import os
3 | from pathlib import Path
4 |
5 | import pytest
6 |
7 | from tnefparse import TNEF
8 | from tnefparse.tnef import to_zip
9 | from tnefparse.mapi import TNEFMAPI_Attribute
10 |
11 | logging.basicConfig()
12 |
13 | DATADIR = Path(__file__).resolve().parent / "examples"
14 |
15 | SPECS = (
16 | ("body.tnef", 0x1125, [], 'htmlbody',
17 | [0x9006, 0x9007, 0x800d, 0x8005, 0x8020, 0x8009, 0x9004, 0x9003]),
18 | ("two-files.tnef", 0x237, ["AUTHORS", "README"], None,
19 | [0x9006, 0x9007, 0x8008, 0x8009, 0x0006, 0x8020, 0x8005, 0x8004, 0x800d, 0x9003,
20 | 0x9002, 0x8012, 0x8013, 0x8010, 0x800f, 0x9005, 0x9002, 0x8012, 0x8013, 0x8010,
21 | 0x800f, 0x9005]),
22 | ("data-before-name.tnef", 0x0d, ["AUTOEXEC.BAT", "CONFIG.SYS", "boot.ini"], 'rtfbody',
23 | [0x9006, 0x9007, 0x8008, 0x800d, 0x8006, 0x9003, 0x9002, 0x8013, 0x800f, 0x8010,
24 | 0x8011, 0x9005, 0x9002, 0x8013, 0x800f, 0x8010, 0x8011, 0x9005, 0x9002, 0x8013,
25 | 0x800f, 0x8010, 0x8011, 0x9005]),
26 | ("multi-name-property.tnef", 0xc6c7, [], None,
27 | [0x9006, 0x9007, 0x9003]),
28 | ("MAPI_ATTACH_DATA_OBJ.tnef", 0x1af,
29 | ['VIA_Nytt_1402.doc', 'VIA_Nytt_1402.pdf', 'VIA_Nytt_14021.htm'], 'rtfbody',
30 | [0x9006, 0x9007, 0x9003, 0x9002, 0x9005, 0x9002, 0x9005, 0x9002, 0x9005]),
31 | ("MAPI_OBJECT.tnef", 0x08, ['Untitled_Attachment'], 'rtfbody',
32 | [0x9006, 0x9007, 0x8008, 0x8005, 0x8020, 0x8009, 0x8004, 0x800d,
33 | 0x9003, 0x9002, 0x8010, 0x8012, 0x8013, 0x9005]),
34 | ("garbage-at-end.tnef", 0x415, [], None,
35 | [0x9006, 0x9007, 0x8008, 0x800d, 0x800a, 0x9003]),
36 | ("long-filename.tnef", 0x1422, ['allproductsmar2000.dat'], 'rtfbody',
37 | [0x9006, 0x9007, 0x8008, 0x8005, 0x0006, 0x8020, 0x8009, 0x8004,
38 | 0x800d, 0x9003, 0x9002, 0x8012, 0x8013, 0x8011, 0x8010, 0x800f,
39 | 0x9005]),
40 | ("missing-filenames.tnef", 0x601,
41 | ['generpts.src', 'TechlibDEC99.doc', 'TechlibDEC99-JAN00.doc', 'TechlibNOV99.doc'], 'rtfbody',
42 | [0x9006, 0x9007, 0x8008, 0x8005, 0x8020, 0x8009, 0x8004, 0x800d, 0x9003, 0x9002,
43 | 0x8012, 0x8013, 0x8010, 0x8011, 0x800f, 0x9005, 0x9002, 0x8012, 0x8013, 0x8010,
44 | 0x800f, 0x9005, 0x9002, 0x8012, 0x8013, 0x8010, 0x800f, 0x9005, 0x9002, 0x8012,
45 | 0x8013, 0x8010, 0x800f, 0x9005]),
46 | ("multi-value-attribute.tnef", 0x1512, ['208225__5_seconds__Voice_Mail.mp3'], 'rtfbody', []),
47 | ("one-file.tnef", 0x237, ['AUTHORS'], None, []),
48 | ("rtf.tnef", 0xc02, [], 'rtfbody', []),
49 | ("triples.tnef", 0xea64, [], 'body', []),
50 | ("unicode-mapi-attr-name.tnef", 0x69ec,
51 | ['spaconsole2.cfg', 'image001.png', 'image002.png', 'image003.png'], 'htmlbody', []),
52 | ("unicode-mapi-attr.tnef", 0x408f, ['example.dat'], 'body', []),
53 | ("umlaut.tnef", 0xa2e, ['TBZ PARIV GmbH.jpg', 'image003.jpg', 'UmlautAnhang-\xe4\xfc\xf6.txt'], 'rtfbody', []),
54 | ("bad_checksum.tnef", 0x5784, ['image001.png'], 'body', []),
55 | ("IPM-DistList.tnef", 0x1708, ['Untitled Attachment'], 'rtfbody',
56 | [0x9006, 0x9007, 0x8008, 0x08, 0x09, 0x9003, 0x9002, 0x8010, 0x8013, 0x800F, 0x8011, 0x9005]),
57 | ("minimal_attachment.tnef", 0x0000, ['unknown.dat'], None, []),
58 | )
59 |
60 |
61 | # generate tests for all example files
62 | def pytest_generate_tests(metafunc):
63 | if "tnefspec" in metafunc.fixturenames:
64 | metafunc.parametrize("tnefspec", SPECS, ids=[s[0] for s in SPECS])
65 |
66 |
67 | def objcodes(tnef):
68 | return [o.name for o in tnef.objects]
69 |
70 |
71 | def test_decode(tnefspec):
72 | fn, key, attchs, body, objs = tnefspec
73 | t = TNEF((DATADIR / fn).read_bytes())
74 | assert t.key == key, f"wrong key: 0x{t.key:04x}"
75 |
76 | for m in t.mapiprops:
77 | assert m.__str__()
78 | assert m.data is not None
79 |
80 | for i, a in enumerate(t.attachments):
81 | assert a.long_filename() == attchs[i]
82 | assert type(a.data) is bytes
83 | for m in a.mapi_attrs:
84 | assert m.__str__()
85 | assert m.data is not None
86 |
87 | for m in t.msgprops:
88 | assert m.__str__()
89 | assert m.data is not None
90 | if m.name == TNEF.ATTRECIPTABLE:
91 | for n_m in m.data[0]:
92 | assert isinstance(n_m, TNEFMAPI_Attribute)
93 |
94 | if t.htmlbody:
95 | assert 'html' in t.htmlbody
96 |
97 | if body:
98 | assert getattr(t, body)
99 | assert t.has_body()
100 | else:
101 | assert not t.has_body()
102 |
103 | if t.rtfbody:
104 | assert t.rtfbody[0:5] == b'{\\rtf'
105 |
106 | if objs:
107 | assert objcodes(t) == objs, "wrong objs: " + str([f"0x{o.name:2.2x}" for o in t.objects])
108 |
109 | assert t.dump(True)
110 | assert t.dump(False)
111 |
112 |
113 | def test_zip(tmp_path):
114 | # remove this test once tnef.to_zip(bytes) is no longer supported
115 | with pytest.deprecated_call():
116 | zip_data = to_zip((DATADIR / "one-file.tnef").read_bytes())
117 | (tmp_path / "output").write_bytes(zip_data)
118 |
119 |
120 | def to_shortname(longname):
121 | if len(longname) < 15:
122 | return longname
123 | root, ext = os.path.splitext(longname)
124 | strip = len(ext)
125 | return root.upper()[0: 10 - strip] + '~1' + ext.upper()
126 |
--------------------------------------------------------------------------------
/tests/test_tnef.py:
--------------------------------------------------------------------------------
1 | from pathlib import Path
2 |
3 | import pytest
4 |
5 | from tnefparse.tnef import TNEF
6 |
7 | HERE = Path(__file__).resolve().parent
8 |
9 |
10 | def test_tnef_str_representation():
11 | tnef_data = (HERE / "examples" / "two-files.tnef").read_bytes()
12 | t = TNEF(tnef_data)
13 |
14 | assert str(t) == ""
15 |
16 |
17 | def test_tnef_msg_embed():
18 | tnef_data = (HERE / "examples" / "IPM-DistList.tnef").read_bytes()
19 | t = TNEF(tnef_data)
20 |
21 | assert str(t) == ""
22 |
23 | t2 = t.attachments[0].embed
24 |
25 | assert str(t2) == ""
26 |
27 |
28 | def test_bad_signature():
29 | tnef_data = Path(__file__).read_bytes()
30 |
31 | with pytest.raises(ValueError, match=r"Wrong TNEF signature: 0x\w+"):
32 | TNEF(tnef_data)
33 |
--------------------------------------------------------------------------------
/tnefparse/__init__.py:
--------------------------------------------------------------------------------
1 | import logging
2 | from .tnef import TNEF, TNEFAttachment, TNEFObject # noqa: F401
3 |
4 |
5 | logging.getLogger(__package__).addHandler(logging.NullHandler())
6 |
--------------------------------------------------------------------------------
/tnefparse/cmdline.py:
--------------------------------------------------------------------------------
1 | import argparse
2 | import json
3 | import logging
4 | import sys
5 | from pathlib import Path
6 |
7 | from . import properties
8 | from .tnef import TNEF, to_zip
9 |
10 | logging.basicConfig()
11 | logger = logging.getLogger(__package__)
12 |
13 |
14 | descr = 'Extract TNEF file contents. Show this help message if no arguments are given.'
15 | parser = argparse.ArgumentParser(description=descr)
16 | argument = parser.add_argument
17 |
18 | argument('file', type=argparse.FileType('rb'), nargs='+', action="append",
19 | help='space-separated list of paths to the TNEF files')
20 |
21 | argument('-o', '--overview', action='store_true',
22 | help='show (possibly long) overview of TNEF file contents')
23 |
24 | argument('-a', '--attachments', action='store_true',
25 | help='extract attachments, by default to current dir')
26 |
27 | argument('-z', '--zip', action='store_true',
28 | help='extract attachments into a single zip file, by default to current dir')
29 |
30 | argument('-p', '--path', type=Path, default=Path(),
31 | help='optional explicit path to extract attachments to')
32 |
33 | argument('-b', '--body', action='store_true',
34 | help='extract the body to stdout')
35 |
36 | argument('-hb', '--htmlbody', action='store_true',
37 | help='extract the HTML body to stdout')
38 |
39 | argument('-rb', '--rtfbody', action='store_true',
40 | help='extract the RTF body to stdout')
41 |
42 | argument('-l', '--logging', choices=["DEBUG", "INFO", "WARN", "ERROR"], default="ERROR",
43 | help="enable logging by setting a log level")
44 |
45 | argument('-c', '--checksum', action="store_true", default=False,
46 | help="calculate checksums (off by default)")
47 |
48 | argument('-d', '--dump', action="store_true", default=False,
49 | help="extract a json dump of the tnef contents")
50 |
51 |
52 | def tnefparse(argv=None) -> None:
53 | """command-line script"""
54 |
55 | if argv is None:
56 | argv = sys.argv[1:]
57 |
58 | if not argv:
59 | parser.print_help()
60 | sys.exit(1)
61 |
62 | args = parser.parse_args(argv)
63 |
64 | logger.setLevel(getattr(logging, args.logging))
65 |
66 | for tfp in args.file[0]:
67 | try:
68 | t = TNEF(tfp.read(), do_checksum=args.checksum)
69 | except ValueError as exc:
70 | sys.exit(str(exc))
71 | if args.overview:
72 | print(f"\nOverview of {tfp.name}: \n")
73 |
74 | # list TNEF attachments
75 | print(" Attachments:\n")
76 | for a in t.attachments:
77 | print(" " + a.long_filename())
78 |
79 | # list TNEF objects
80 | print("\n Objects:\n")
81 | print(" " + "\n ".join([TNEF.codes[o.name] for o in t.objects]))
82 |
83 | # list TNEF MAPI properties
84 | print("\n Properties:\n")
85 | for p in t.mapiprops:
86 | try:
87 | print(" " + properties.CODE_TO_NAME[p.name])
88 | except KeyError:
89 | logger.warning("Unknown MAPI Property: 0x%x", p.name)
90 | print("")
91 |
92 | elif args.dump:
93 | print(json.dumps(t.dump(force_strings=True), sort_keys=True, indent=4))
94 |
95 | elif args.attachments:
96 | for attachment in t.attachments:
97 | (args.path / attachment.long_filename()).write_bytes(attachment.data)
98 | sys.stderr.write(f"Successfully wrote {len(t.attachments)} files\n")
99 | sys.exit()
100 |
101 | elif args.zip:
102 | zipped = to_zip(t)
103 | (args.path / 'attachments.zip').write_bytes(zipped)
104 | sys.stderr.write("Successfully wrote attachments.zip\n")
105 | sys.exit()
106 |
107 | def print_body(attr: str, description: str) -> None:
108 | body = getattr(t, attr)
109 | if body is None:
110 | sys.exit(f"No {description} found")
111 | elif isinstance(body, bytes):
112 | sys.stdout.write(body.decode('latin-1'))
113 | else:
114 | sys.stdout.write(body)
115 |
116 | if args.body:
117 | print_body("body", "body")
118 | if args.htmlbody:
119 | print_body("htmlbody", "HTML body")
120 | if args.rtfbody:
121 | print_body("rtfbody", "RTF body")
122 |
--------------------------------------------------------------------------------
/tnefparse/codepage.py:
--------------------------------------------------------------------------------
1 | from typing import Optional, Union
2 |
3 | # https://docs.microsoft.com/en-us/windows/desktop/intl/code-page-identifiers
4 | CODEPAGE_MAP = {
5 | 20127: 'ascii',
6 | 20866: 'koi8-r',
7 | 28591: 'iso-8859-1',
8 | 65001: 'utf-8',
9 | }
10 | FALLBACK = 'cp1252'
11 |
12 |
13 | class Codepage:
14 | def __init__(self, codepage: int) -> None:
15 | self.cp = codepage
16 |
17 | def best_guess(self) -> Optional[str]:
18 | if CODEPAGE_MAP.get(self.cp):
19 | return CODEPAGE_MAP.get(self.cp)
20 | elif self.cp <= 1258: # max cpXXXX page in python
21 | return f"cp{self.cp}"
22 | else:
23 | return None
24 |
25 | def codepage(self) -> str:
26 | bg = self.best_guess()
27 | if bg:
28 | return bg
29 | else:
30 | return f"cp{self.cp}"
31 |
32 | def decode(self, byte_str: Union[str, bytes]) -> str:
33 | if isinstance(byte_str, bytes):
34 | return byte_str.decode(self.best_guess() or FALLBACK)
35 | else:
36 | return byte_str
37 |
--------------------------------------------------------------------------------
/tnefparse/mapi.py:
--------------------------------------------------------------------------------
1 | """MAPI attribute definitions"""
2 |
3 | import logging
4 | from decimal import Decimal
5 |
6 | from .util import (
7 | apptime,
8 | dbl64,
9 | float32,
10 | guid,
11 | int8,
12 | int16,
13 | int32,
14 | int64,
15 | systime,
16 | uint16,
17 | uint32,
18 | )
19 | from . import properties
20 |
21 | logger = logging.getLogger(__package__)
22 |
23 |
24 | SZMAPI_UNSPECIFIED = 0x0000 # MAPI Unspecified # noqa: E221
25 | SZMAPI_NULL = 0x0001 # MAPI null property # noqa: E221
26 | SZMAPI_SHORT = 0x0002 # MAPI short (signed 16 bits) # noqa: E221
27 | SZMAPI_INT = 0x0003 # MAPI integer (signed 32 bits) # noqa: E221
28 | SZMAPI_FLOAT = 0x0004 # MAPI float (4 bytes) # noqa: E221
29 | SZMAPI_DOUBLE = 0x0005 # MAPI double # noqa: E221
30 | SZMAPI_CURRENCY = 0x0006 # MAPI currency (64 bits) # noqa: E221
31 | SZMAPI_APPTIME = 0x0007 # MAPI application time # noqa: E221
32 | SZMAPI_ERROR = 0x000A # MAPI error (32 bits) # noqa: E221
33 | SZMAPI_BOOLEAN = 0x000B # MAPI boolean (16 bits) # noqa: E221
34 | SZMAPI_OBJECT = 0x000D # MAPI embedded object # noqa: E221
35 | SZMAPI_INT8BYTE = 0x0014 # MAPI 8 byte signed int # noqa: E221
36 | SZMAPI_STRING = 0x001E # MAPI string # noqa: E221
37 | SZMAPI_UNICODE_STRING = 0x001F # MAPI unicode-string (null terminated) # noqa: E221
38 | SZMAPI_SYSTIME = 0x0040 # MAPI time (64 bits) # noqa: E221
39 | SZMAPI_CLSID = 0x0048 # MAPI OLE GUID # noqa: E221
40 | SZMAPI_BINARY = 0x0102 # MAPI binary # noqa: E221
41 |
42 | MULTI_VALUE_FLAG = 0x1000
43 | GUID_EXISTS_FLAG = 0x8000
44 |
45 | IMESSAGE_SIG = b"\x07\x03\x02\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x46"
46 | IMESSAGE_SIG_LEN = len(IMESSAGE_SIG)
47 |
48 |
49 | def decode_mapi(data, codepage='cp1252', starting_offset=None):
50 | """decode MAPI types"""
51 |
52 | data_len = len(data)
53 | attrs = []
54 | offset = starting_offset or 0
55 | num_properties = uint32(data, offset)
56 | offset += 4
57 |
58 | try:
59 | for i in range(num_properties):
60 | if offset >= data_len:
61 | logger.warning("Skipping property %r", i)
62 | continue
63 |
64 | attr_type = uint16(data, offset)
65 | offset += 2
66 | attr_name = uint16(data, offset)
67 | offset += 2
68 |
69 | # logger.debug("Attribute type: 0x%4.4x", attr_type)
70 | # logger.debug("Attribute name: 0x%4.4x", attr_name)
71 | guid_id = ''
72 | guid_name = None
73 | guid_prop = None
74 | if attr_name >= GUID_EXISTS_FLAG:
75 | guid_id = guid(data, offset)
76 | offset += 16
77 | kind = uint32(data, offset)
78 | offset += 4
79 | if kind == 0:
80 | guid_prop = uint32(data, offset)
81 | offset += 4
82 | else:
83 | iid_len = uint32(data, offset)
84 | offset += 4
85 | r = iid_len % 4
86 | if r != 0:
87 | iid_len += 4 - r
88 | guid_name = data[offset: offset + iid_len].decode('utf-16')
89 | offset += iid_len
90 |
91 | num_mv_properties = None
92 | if MULTI_VALUE_FLAG & attr_type:
93 | attr_type ^= MULTI_VALUE_FLAG
94 | num_mv_properties = uint32(data, offset)
95 | offset += 4
96 |
97 | for mv in range(num_mv_properties or 1):
98 | try:
99 | attr_data, offset = parse_property(data, offset, attr_name, attr_type, codepage, num_mv_properties)
100 | attr = TNEFMAPI_Attribute(attr_type, attr_name, attr_data, guid_id, guid_name, guid_prop)
101 | attrs.append(attr)
102 | # print(attr)
103 | except Exception:
104 | logger.debug("Attribute type: 0x%4.4x", attr_type)
105 | logger.debug("Attribute name: 0x%4.4x (%s)", attr_name, TNEFMAPI_Attribute.codes.get(attr_name))
106 | raise
107 |
108 | if (num_mv_properties or 1) % 2 and attr_type in (SZMAPI_SHORT, SZMAPI_BOOLEAN):
109 | offset += 2
110 |
111 | except Exception as exc:
112 | logger.error('decode_mapi exception: %s', exc)
113 | logger.debug('exception details:', exc_info=True)
114 |
115 | if starting_offset is not None:
116 | return (offset, attrs)
117 | else:
118 | return attrs
119 |
120 |
121 | def parse_property(data, offset, attr_name, attr_type, codepage, is_multi):
122 | attr_data = None
123 |
124 | if attr_type in (SZMAPI_SHORT, SZMAPI_BOOLEAN):
125 | attr_data = data[offset: offset + 2]
126 | offset += 2
127 | elif attr_type in (SZMAPI_INT, SZMAPI_FLOAT, SZMAPI_ERROR):
128 | attr_data = data[offset: offset + 4]
129 | offset += 4
130 | elif attr_type in (SZMAPI_DOUBLE, SZMAPI_APPTIME, SZMAPI_CURRENCY, SZMAPI_INT8BYTE, SZMAPI_SYSTIME):
131 | attr_data = data[offset: offset + 8]
132 | offset += 8
133 | elif attr_type == SZMAPI_CLSID:
134 | attr_data = data[offset: offset + 16]
135 | offset += 16
136 | elif attr_type in (SZMAPI_STRING, SZMAPI_UNICODE_STRING, SZMAPI_OBJECT, SZMAPI_BINARY, SZMAPI_UNSPECIFIED):
137 | if is_multi:
138 | num_vals = 1
139 | else:
140 | num_vals = uint32(data, offset)
141 | offset += 4
142 |
143 | attr_data = []
144 | for j in range(num_vals):
145 | length = uint32(data, offset)
146 | offset += 4
147 | r = length % 4
148 | if r != 0:
149 | length += 4 - r
150 |
151 | item = data[offset: offset + length]
152 | if attr_type == SZMAPI_UNICODE_STRING:
153 | item = item.decode('utf-16')
154 | elif attr_type == SZMAPI_STRING:
155 | item = item.decode(codepage)
156 | attr_data.append(item)
157 | offset += length
158 |
159 | else:
160 | raise ValueError(f"Unknown MAPI type {attr_type:#06x}")
161 |
162 | return attr_data, offset
163 |
164 |
165 | class TNEFMAPI_Attribute:
166 | """represents a mapi attribute
167 |
168 | Property reference docs:
169 |
170 | https://docs.microsoft.com/en-us/office/client-developer/outlook/mapi/mapping-canonical-property-names-to-mapi-names#tagged-properties
171 | https://fossies.org/linux/libpst/xml/MAPI_definitions.pdf
172 |
173 | Most these properties represent PidTag properties
174 | """
175 | codes = properties.CODE_TO_NAME
176 |
177 | OutlookGuid = '05133f00aa00da98101b450b6ed8da90'
178 | AppointmentGuid = '46000000000000c00000000000062002'
179 |
180 | def __init__(self, attr_type, name, data, guid_id, guid_name=None, guid_prop=None):
181 | self.attr_type = attr_type
182 | self.name = name
183 | self.raw_data = data
184 | self.guid = guid_id
185 | self.guid_name = guid_name
186 | self.guid_prop = guid_prop
187 | if self.guid_name:
188 | self.guid_name = self.guid_name.rstrip('\x00')
189 |
190 | @property
191 | def data(self):
192 | if self.attr_type == SZMAPI_NULL:
193 | return None
194 | elif self.attr_type == SZMAPI_SHORT:
195 | return int16(self.raw_data)
196 | elif self.attr_type == SZMAPI_INT:
197 | return int32(self.raw_data)
198 | elif self.attr_type == SZMAPI_FLOAT:
199 | return float32(self.raw_data)
200 | elif self.attr_type == SZMAPI_DOUBLE:
201 | return dbl64(self.raw_data)
202 | elif self.attr_type == SZMAPI_CURRENCY:
203 | return Decimal(int64(self.raw_data)) / Decimal(10000)
204 | elif self.attr_type == SZMAPI_APPTIME:
205 | return apptime(self.raw_data)
206 | elif self.attr_type == SZMAPI_ERROR:
207 | return uint32(self.raw_data)
208 | elif self.attr_type == SZMAPI_BOOLEAN:
209 | return bool(uint16(self.raw_data))
210 | elif self.attr_type == SZMAPI_INT8BYTE:
211 | return int8(self.raw_data)
212 | elif self.attr_type == SZMAPI_SYSTIME:
213 | return systime(self.raw_data)
214 | elif self.attr_type == SZMAPI_CLSID:
215 | return guid(self.raw_data)
216 | elif self.attr_type in (SZMAPI_STRING, SZMAPI_UNICODE_STRING):
217 | return ''.join([s.rstrip('\x00') for s in self.raw_data])
218 |
219 | if self.attr_type not in (SZMAPI_UNSPECIFIED, SZMAPI_BINARY, SZMAPI_OBJECT):
220 | logger.warning(f"Unknown data type: 0x{self.attr_type:04x}")
221 |
222 | return b''.join([s.rstrip(b'\x00') for s in self.raw_data])
223 |
224 | @property
225 | def name_str(self):
226 | return (
227 | self.guid_name or
228 | TNEFMAPI_Attribute.codes.get(self.name) or
229 | TNEFMAPI_Attribute.codes.get(self.guid_prop) or
230 | hex(self.guid_prop or self.name)
231 | )
232 |
233 | def __str__(self):
234 | return f""
235 |
--------------------------------------------------------------------------------
/tnefparse/properties.py:
--------------------------------------------------------------------------------
1 | """
2 | Property reference docs:
3 |
4 | - https://docs.microsoft.com/en-us/office/client-developer/outlook/mapi/mapping-canonical-property-names-to-mapi-names#tagged-properties
5 | - https://interoperability.blob.core.windows.net/files/MS-OXPROPS/[MS-OXPROPS].pdf
6 | - https://fossies.org/linux/libpst/xml/MAPI_definitions.pdf
7 | - https://docs.microsoft.com/en-us/office/client-developer/outlook/mapi/mapi-constants
8 |
9 |
10 | +----------------+----------------+-------------------------------------------------------------------------------+
11 | | Range minimum | Range maximum | Description |
12 | +----------------+----------------+-------------------------------------------------------------------------------+
13 | | 0x0001 | 0x0BFF | Message object envelope property; reserved |
14 | | 0x0C00 | 0x0DFF | Recipient property; reserved |
15 | | 0x0E00 | 0x0FFF | Non-transmittable Message property; reserved |
16 | | 0x1000 | 0x2FFF | Message content property; reserved |
17 | | 0x3000 | 0x33FF | Multi-purpose property that can appear on all or most objects; reserved |
18 | | 0x3400 | 0x35FF | Message store property; reserved |
19 | | 0x3600 | 0x36FF | Folder and address book container property; reserved |
20 | | 0x3700 | 0x38FF | Attachment property; reserved |
21 | | 0x3900 | 0x39FF | Address Book object property; reserved |
22 | | 0x3A00 | 0x3BFF | Mail user object property; reserved |
23 | | 0x3C00 | 0x3CFF | Distribution list property; reserved |
24 | | 0x3D00 | 0x3DFF | Profile section property; reserved |
25 | | 0x3E00 | 0x3EFF | Status object property; reserved |
26 | | 0x4000 | 0x57FF | Transport-defined envelope property |
27 | | 0x5800 | 0x5FFF | Transport-defined recipient property |
28 | | 0x6000 | 0x65FF | User-defined non-transmittable property |
29 | | 0x6600 | 0x67FF | Provider-defined internal non-transmittable property |
30 | | 0x6800 | 0x7BFF | Message class-defined content property |
31 | | 0x7C00 | 0x7FFF | Message class-defined non-transmittable property |
32 | | 0x8000 | 0xFFFF | Reserved for mapping to named properties. The exceptions to this rule are |
33 | | | | some of the address book tagged properties (those with names beginning with |
34 | | | | PIDTagAddressBook). Many are static property IDs but are in this range. |
35 | +----------------+----------------+-------------------------------------------------------------------------------+
36 | """ # noqa: E501
37 |
38 |
39 | MAPI_ACKNOWLEDGEMENT_MODE = 0x0001
40 | MAPI_ALTERNATE_RECIPIENT_ALLOWED = 0x0002
41 | MAPI_AUTHORIZING_USERS = 0x0003
42 | MAPI_AUTO_FORWARD_COMMENT = 0x0004
43 | MAPI_AUTO_FORWARDED = 0x0005
44 | MAPI_CONTENT_CONFIDENTIALITY_ALGORITHM_ID = 0x0006
45 | MAPI_CONTENT_CORRELATOR = 0x0007
46 | MAPI_CONTENT_IDENTIFIER = 0x0008
47 | MAPI_CONTENT_LENGTH = 0x0009
48 | MAPI_CONTENT_RETURN_REQUESTED = 0x000A
49 | MAPI_CONVERSATION_KEY = 0x000B
50 | MAPI_CONVERSION_EITS = 0x000C
51 | MAPI_CONVERSION_WITH_LOSS_PROHIBITED = 0x000D
52 | MAPI_CONVERTED_EITS = 0x000E
53 | MAPI_DEFERRED_DELIVERY_TIME = 0x000F
54 | MAPI_DELIVER_TIME = 0x0010
55 | MAPI_DISCARD_REASON = 0x0011
56 | MAPI_DISCLOSURE_OF_RECIPIENTS = 0x0012
57 | MAPI_DL_EXPANSION_HISTORY = 0x0013
58 | MAPI_DL_EXPANSION_PROHIBITED = 0x0014
59 | MAPI_EXPIRY_TIME = 0x0015
60 | MAPI_IMPLICIT_CONVERSION_PROHIBITED = 0x0016
61 | MAPI_IMPORTANCE = 0x0017
62 | MAPI_IPM_ID = 0x0018
63 | MAPI_LATEST_DELIVERY_TIME = 0x0019
64 | MAPI_MESSAGE_CLASS = 0x001A
65 | MAPI_MESSAGE_DELIVERY_ID = 0x001B
66 | MAPI_MESSAGE_SECURITY_LABEL = 0x001E
67 | MAPI_OBSOLETED_IPMS = 0x001F
68 | MAPI_ORIGINALLY_INTENDED_RECIPIENT_NAME = 0x0020
69 | MAPI_ORIGINAL_EITS = 0x0021
70 | MAPI_ORIGINATOR_CERTIFICATE = 0x0022
71 | MAPI_ORIGINATOR_DELIVERY_REPORT_REQUESTED = 0x0023
72 | MAPI_ORIGINATOR_RETURN_ADDRESS = 0x0024
73 | MAPI_PARENT_KEY = 0x0025
74 | MAPI_PRIORITY = 0x0026
75 | MAPI_ORIGIN_CHECK = 0x0027
76 | MAPI_PROOF_OF_SUBMISSION_REQUESTED = 0x0028
77 | MAPI_READ_RECEIPT_REQUESTED = 0x0029
78 | MAPI_RECEIPT_TIME = 0x002A
79 | MAPI_RECIPIENT_REASSIGNMENT_PROHIBITED = 0x002B
80 | MAPI_REDIRECTION_HISTORY = 0x002C
81 | MAPI_RELATED_IPMS = 0x002D
82 | MAPI_ORIGINAL_SENSITIVITY = 0x002E
83 | MAPI_LANGUAGES = 0x002F
84 | MAPI_REPLY_TIME = 0x0030
85 | MAPI_REPORT_TAG = 0x0031
86 | MAPI_REPORT_TIME = 0x0032
87 | MAPI_RETURNED_IPM = 0x0033
88 | MAPI_SECURITY = 0x0034
89 | MAPI_INCOMPLETE_COPY = 0x0035
90 | MAPI_SENSITIVITY = 0x0036
91 | MAPI_SUBJECT = 0x0037
92 | MAPI_SUBJECT_IPM = 0x0038
93 | MAPI_CLIENT_SUBMIT_TIME = 0x0039
94 | MAPI_REPORT_NAME = 0x003A
95 | MAPI_SENT_REPRESENTING_SEARCH_KEY = 0x003B
96 | MAPI_X400_CONTENT_TYPE = 0x003C
97 | MAPI_SUBJECT_PREFIX = 0x003D
98 | MAPI_NON_RECEIPT_REASON = 0x003E
99 | MAPI_RECEIVED_BY_ENTRYID = 0x003F
100 | MAPI_RECEIVED_BY_NAME = 0x0040
101 | MAPI_SENT_REPRESENTING_ENTRYID = 0x0041
102 | MAPI_SENT_REPRESENTING_NAME = 0x0042
103 | MAPI_RCVD_REPRESENTING_ENTRYID = 0x0043
104 | MAPI_RCVD_REPRESENTING_NAME = 0x0044
105 | MAPI_REPORT_ENTRYID = 0x0045
106 | MAPI_READ_RECEIPT_ENTRYID = 0x0046
107 | MAPI_MESSAGE_SUBMISSION_ID = 0x0047
108 | MAPI_PROVIDER_SUBMIT_TIME = 0x0048
109 | MAPI_ORIGINAL_SUBJECT = 0x0049
110 | MAPI_DISC_VAL = 0x004A
111 | MAPI_ORIG_MESSAGE_CLASS = 0x004B
112 | MAPI_ORIGINAL_AUTHOR_ENTRYID = 0x004C
113 | MAPI_ORIGINAL_AUTHOR_NAME = 0x004D
114 | MAPI_ORIGINAL_SUBMIT_TIME = 0x004E
115 | MAPI_REPLY_RECIPIENT_ENTRIES = 0x004F
116 | MAPI_REPLY_RECIPIENT_NAMES = 0x0050
117 | MAPI_RECEIVED_BY_SEARCH_KEY = 0x0051
118 | MAPI_RCVD_REPRESENTING_SEARCH_KEY = 0x0052
119 | MAPI_READ_RECEIPT_SEARCH_KEY = 0x0053
120 | MAPI_REPORT_SEARCH_KEY = 0x0054
121 | MAPI_ORIGINAL_DELIVERY_TIME = 0x0055
122 | MAPI_ORIGINAL_AUTHOR_SEARCH_KEY = 0x0056
123 | MAPI_MESSAGE_TO_ME = 0x0057
124 | MAPI_MESSAGE_CC_ME = 0x0058
125 | MAPI_MESSAGE_RECIP_ME = 0x0059
126 | MAPI_ORIGINAL_SENDER_NAME = 0x005A
127 | MAPI_ORIGINAL_SENDER_ENTRYID = 0x005B
128 | MAPI_ORIGINAL_SENDER_SEARCH_KEY = 0x005C
129 | MAPI_ORIGINAL_SENT_REPRESENTING_NAME = 0x005D
130 | MAPI_ORIGINAL_SENT_REPRESENTING_ENTRYID = 0x005E
131 | MAPI_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY = 0x005F
132 | MAPI_START_DATE = 0x0060
133 | MAPI_END_DATE = 0x0061
134 | MAPI_OWNER_APPT_ID = 0x0062
135 | MAPI_RESPONSE_REQUESTED = 0x0063
136 | MAPI_SENT_REPRESENTING_ADDRTYPE = 0x0064
137 | MAPI_SENT_REPRESENTING_EMAIL_ADDRESS = 0x0065
138 | MAPI_ORIGINAL_SENDER_ADDRTYPE = 0x0066
139 | MAPI_ORIGINAL_SENDER_EMAIL_ADDRESS = 0x0067
140 | MAPI_ORIGINAL_SENT_REPRESENTING_ADDRTYPE = 0x0068
141 | MAPI_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS = 0x0069
142 | MAPI_CONVERSATION_TOPIC = 0x0070
143 | MAPI_CONVERSATION_INDEX = 0x0071
144 | MAPI_ORIGINAL_DISPLAY_BCC = 0x0072
145 | MAPI_ORIGINAL_DISPLAY_CC = 0x0073
146 | MAPI_ORIGINAL_DISPLAY_TO = 0x0074
147 | MAPI_RECEIVED_BY_ADDRTYPE = 0x0075
148 | MAPI_RECEIVED_BY_EMAIL_ADDRESS = 0x0076
149 | MAPI_RCVD_REPRESENTING_ADDRTYPE = 0x0077
150 | MAPI_RCVD_REPRESENTING_EMAIL_ADDRESS = 0x0078
151 | MAPI_ORIGINAL_AUTHOR_ADDRTYPE = 0x0079
152 | MAPI_ORIGINAL_AUTHOR_EMAIL_ADDRESS = 0x007A
153 | MAPI_ORIGINALLY_INTENDED_RECIP_ADDRTYPE = 0x007B
154 | MAPI_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS = 0x007C
155 | MAPI_TRANSPORT_MESSAGE_HEADERS = 0x007D
156 | MAPI_DELEGATION = 0x007E
157 | MAPI_TNEF_CORRELATION_KEY = 0x007F
158 | MAPI_CONTENT_INTEGRITY_CHECK = 0x0C00
159 | MAPI_EXPLICIT_CONVERSION = 0x0C01
160 | MAPI_IPM_RETURN_REQUESTED = 0x0C02
161 | MAPI_MESSAGE_TOKEN = 0x0C03
162 | MAPI_NDR_REASON_CODE = 0x0C04
163 | MAPI_NDR_DIAG_CODE = 0x0C05
164 | MAPI_NON_RECEIPT_NOTIFICATION_REQUESTED = 0x0C06
165 | MAPI_DELIVERY_POINT = 0x0C07
166 | MAPI_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED = 0x0C08
167 | MAPI_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT = 0x0C09
168 | MAPI_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY = 0x0C0A
169 | MAPI_PHYSICAL_DELIVERY_MODE = 0x0C0B
170 | MAPI_PHYSICAL_DELIVERY_REPORT_REQUEST = 0x0C0C
171 | MAPI_PHYSICAL_FORWARDING_ADDRESS = 0x0C0D
172 | MAPI_PHYSICAL_FORWARDING_ADDRESS_REQUESTED = 0x0C0E
173 | MAPI_PHYSICAL_FORWARDING_PROHIBITED = 0x0C0F
174 | MAPI_PHYSICAL_RENDITION_ATTRIBUTES = 0x0C10
175 | MAPI_PROOF_OF_DELIVERY = 0x0C11
176 | MAPI_PROOF_OF_DELIVERY_REQUESTED = 0x0C12
177 | MAPI_RECIPIENT_CERTIFICATE = 0x0C13
178 | MAPI_RECIPIENT_NUMBER_FOR_ADVICE = 0x0C14
179 | MAPI_RECIPIENT_TYPE = 0x0C15
180 | MAPI_REGISTERED_MAIL_TYPE = 0x0C16
181 | MAPI_REPLY_REQUESTED = 0x0C17
182 | MAPI_REQUESTED_DELIVERY_METHOD = 0x0C18
183 | MAPI_SENDER_ENTRYID = 0x0C19
184 | MAPI_SENDER_NAME = 0x0C1A
185 | MAPI_SUPPLEMENTARY_INFO = 0x0C1B
186 | MAPI_TYPE_OF_MTS_USER = 0x0C1C
187 | MAPI_SENDER_SEARCH_KEY = 0x0C1D
188 | MAPI_SENDER_ADDRTYPE = 0x0C1E
189 | MAPI_SENDER_EMAIL_ADDRESS = 0x0C1F
190 | MAPI_CURRENT_VERSION = 0x0E00
191 | MAPI_DELETE_AFTER_SUBMIT = 0x0E01
192 | MAPI_DISPLAY_BCC = 0x0E02
193 | MAPI_DISPLAY_CC = 0x0E03
194 | MAPI_DISPLAY_TO = 0x0E04
195 | MAPI_PARENT_DISPLAY = 0x0E05
196 | MAPI_MESSAGE_DELIVERY_TIME = 0x0E06
197 | MAPI_MESSAGE_FLAGS = 0x0E07
198 | MAPI_MESSAGE_SIZE = 0x0E08
199 | MAPI_PARENT_ENTRYID = 0x0E09
200 | MAPI_SENTMAIL_ENTRYID = 0x0E0A
201 | MAPI_CORRELATE = 0x0E0C
202 | MAPI_CORRELATE_MTSID = 0x0E0D
203 | MAPI_DISCRETE_VALUES = 0x0E0E
204 | MAPI_RESPONSIBILITY = 0x0E0F
205 | MAPI_SPOOLER_STATUS = 0x0E10
206 | MAPI_TRANSPORT_STATUS = 0x0E11
207 | MAPI_MESSAGE_RECIPIENTS = 0x0E12
208 | MAPI_MESSAGE_ATTACHMENTS = 0x0E13
209 | MAPI_SUBMIT_FLAGS = 0x0E14
210 | MAPI_RECIPIENT_STATUS = 0x0E15
211 | MAPI_TRANSPORT_KEY = 0x0E16
212 | MAPI_MSG_STATUS = 0x0E17
213 | MAPI_MESSAGE_DOWNLOAD_TIME = 0x0E18
214 | MAPI_CREATION_VERSION = 0x0E19
215 | MAPI_MODIFY_VERSION = 0x0E1A
216 | MAPI_HASATTACH = 0x0E1B
217 | MAPI_BODY_CRC = 0x0E1C
218 | MAPI_NORMALIZED_SUBJECT = 0x0E1D
219 | MAPI_RTF_IN_SYNC = 0x0E1F
220 | MAPI_ATTACH_SIZE = 0x0E20
221 | MAPI_ATTACH_NUM = 0x0E21
222 | MAPI_PREPROCESS = 0x0E22
223 | MAPI_ORIGINATING_MTA_CERTIFICATE = 0x0E25
224 | MAPI_PROOF_OF_SUBMISSION = 0x0E26
225 | MAPI_PRIMARY_SEND_ACCOUNT = 0x0E28
226 | MAPI_NEXT_SEND_ACCT = 0x0E29
227 | MAPI_ACCESS = 0x0FF4
228 | MAPI_ROW_TYPE = 0x0FF5
229 | MAPI_INSTANCE_KEY = 0x0FF6
230 | MAPI_ACCESS_LEVEL = 0x0FF7
231 | MAPI_MAPPING_SIGNATURE = 0x0FF8
232 | MAPI_RECORD_KEY = 0x0FF9
233 | MAPI_STORE_RECORD_KEY = 0x0FFA
234 | MAPI_STORE_ENTRYID = 0x0FFB
235 | MAPI_MINI_ICON = 0x0FFC
236 | MAPI_ICON = 0x0FFD
237 | MAPI_OBJECT_TYPE = 0x0FFE
238 | MAPI_ENTRYID = 0x0FFF
239 | MAPI_BODY = 0x1000
240 | MAPI_REPORT_TEXT = 0x1001
241 | MAPI_ORIGINATOR_AND_DL_EXPANSION_HISTORY = 0x1002
242 | MAPI_REPORTING_DL_NAME = 0x1003
243 | MAPI_REPORTING_MTA_CERTIFICATE = 0x1004
244 | MAPI_RTF_SYNC_BODY_CRC = 0x1006
245 | MAPI_RTF_SYNC_BODY_COUNT = 0x1007
246 | MAPI_RTF_SYNC_BODY_TAG = 0x1008
247 | MAPI_RTF_COMPRESSED = 0x1009
248 | MAPI_RTF_SYNC_PREFIX_COUNT = 0x1010
249 | MAPI_RTF_SYNC_TRAILING_COUNT = 0x1011
250 | MAPI_ORIGINALLY_INTENDED_RECIP_ENTRYID = 0x1012
251 | MAPI_BODY_HTML = 0x1013
252 | MAPI_NATIVE_BODY = 0x1016
253 | MAPI_SMTP_MESSAGE_ID = 0x1035
254 | MAPI_INTERNET_REFERENCES = 0x1039
255 | MAPI_IN_REPLY_TO_ID = 0x1042
256 | MAPI_INTERNET_RETURN_PATH = 0x1046
257 | MAPI_ICON_INDEX = 0x1080
258 | MAPI_LAST_VERB_EXECUTED = 0x1081
259 | MAPI_LAST_VERB_EXECUTION_TIME = 0x1082
260 | MAPI_URL_COMP_NAME = 0x10F3
261 | MAPI_ATTRIBUTE_HIDDEN = 0x10F4
262 | MAPI_ATTRIBUTE_SYSTEM = 0x10F5
263 | MAPI_ATTRIBUTE_READ_ONLY = 0x10F6
264 | MAPI_ROWID = 0x3000
265 | MAPI_DISPLAY_NAME = 0x3001
266 | MAPI_ADDRTYPE = 0x3002
267 | MAPI_EMAIL_ADDRESS = 0x3003
268 | MAPI_COMMENT = 0x3004
269 | MAPI_DEPTH = 0x3005
270 | MAPI_PROVIDER_DISPLAY = 0x3006
271 | MAPI_CREATION_TIME = 0x3007
272 | MAPI_LAST_MODIFICATION_TIME = 0x3008
273 | MAPI_RESOURCE_FLAGS = 0x3009
274 | MAPI_PROVIDER_DLL_NAME = 0x300A
275 | MAPI_SEARCH_KEY = 0x300B
276 | MAPI_PROVIDER_UID = 0x300C
277 | MAPI_PROVIDER_ORDINAL = 0x300D
278 | MAPI_TARGET_ENTRY_ID = 0x3010
279 | MAPI_CONVERSATION_ID = 0x3013
280 | MAPI_CONVERSATION_INDEX_TRACKING = 0x3016
281 | MAPI_FORM_VERSION = 0x3301
282 | MAPI_FORM_CLSID = 0x3302
283 | MAPI_FORM_CONTACT_NAME = 0x3303
284 | MAPI_FORM_CATEGORY = 0x3304
285 | MAPI_FORM_CATEGORY_SUB = 0x3305
286 | MAPI_FORM_HOST_MAP = 0x3306
287 | MAPI_FORM_HIDDEN = 0x3307
288 | MAPI_FORM_DESIGNER_NAME = 0x3308
289 | MAPI_FORM_DESIGNER_GUID = 0x3309
290 | MAPI_FORM_MESSAGE_BEHAVIOR = 0x330A
291 | MAPI_DEFAULT_STORE = 0x3400
292 | MAPI_STORE_SUPPORT_MASK = 0x340D
293 | MAPI_STORE_STATE = 0x340E
294 | MAPI_STORE_UNICODE_MASK = 0x340F
295 | MAPI_IPM_SUBTREE_SEARCH_KEY = 0x3410
296 | MAPI_IPM_OUTBOX_SEARCH_KEY = 0x3411
297 | MAPI_IPM_WASTEBASKET_SEARCH_KEY = 0x3412
298 | MAPI_IPM_SENTMAIL_SEARCH_KEY = 0x3413
299 | MAPI_MDB_PROVIDER = 0x3414
300 | MAPI_RECEIVE_FOLDER_SETTINGS = 0x3415
301 | MAPI_VALID_FOLDER_MASK = 0x35DF
302 | MAPI_IPM_SUBTREE_ENTRYID = 0x35E0
303 | MAPI_IPM_OUTBOX_ENTRYID = 0x35E2
304 | MAPI_IPM_WASTEBASKET_ENTRYID = 0x35E3
305 | MAPI_IPM_SENTMAIL_ENTRYID = 0x35E4
306 | MAPI_VIEWS_ENTRYID = 0x35E5
307 | MAPI_COMMON_VIEWS_ENTRYID = 0x35E6
308 | MAPI_FINDER_ENTRYID = 0x35E7
309 | MAPI_CONTAINER_FLAGS = 0x3600
310 | MAPI_FOLDER_TYPE = 0x3601
311 | MAPI_CONTENT_COUNT = 0x3602
312 | MAPI_CONTENT_UNREAD = 0x3603
313 | MAPI_CREATE_TEMPLATES = 0x3604
314 | MAPI_DETAILS_TABLE = 0x3605
315 | MAPI_SEARCH = 0x3607
316 | MAPI_SELECTABLE = 0x3609
317 | MAPI_SUBFOLDERS = 0x360A
318 | MAPI_STATUS = 0x360B
319 | MAPI_ANR = 0x360C
320 | MAPI_CONTENTS_SORT_ORDER = 0x360D
321 | MAPI_CONTAINER_HIERARCHY = 0x360E
322 | MAPI_CONTAINER_CONTENTS = 0x360F
323 | MAPI_FOLDER_ASSOCIATED_CONTENTS = 0x3610
324 | MAPI_DEF_CREATE_DL = 0x3611
325 | MAPI_DEF_CREATE_MAILUSER = 0x3612
326 | MAPI_CONTAINER_CLASS = 0x3613
327 | MAPI_CONTAINER_MODIFY_VERSION = 0x3614
328 | MAPI_AB_PROVIDER_ID = 0x3615
329 | MAPI_DEFAULT_VIEW_ENTRYID = 0x3616
330 | MAPI_ASSOC_CONTENT_COUNT = 0x3617
331 | MAPI_ATTACHMENT_X400_PARAMETERS = 0x3700
332 | MAPI_ATTACH_DATA_OBJ = 0x3701
333 | MAPI_ATTACH_ENCODING = 0x3702
334 | MAPI_ATTACH_EXTENSION = 0x3703
335 | MAPI_ATTACH_FILENAME = 0x3704
336 | MAPI_ATTACH_METHOD = 0x3705
337 | MAPI_ATTACH_LONG_FILENAME = 0x3707
338 | MAPI_ATTACH_PATHNAME = 0x3708
339 | MAPI_ATTACH_RENDERING = 0x3709
340 | MAPI_ATTACH_TAG = 0x370A
341 | MAPI_RENDERING_POSITION = 0x370B
342 | MAPI_ATTACH_TRANSPORT_NAME = 0x370C
343 | MAPI_ATTACH_LONG_PATHNAME = 0x370D
344 | MAPI_ATTACH_MIME_TAG = 0x370E
345 | MAPI_ATTACH_ADDITIONAL_INFO = 0x370F
346 | MAPI_ATTACH_MIME_SEQUENCE = 0x3710
347 | MAPI_ATTACH_CONTENT_ID = 0x3712
348 | MAPI_ATTACH_CONTENT_LOCATION = 0x3713
349 | MAPI_ATTACH_FLAGS = 0x3714
350 | MAPI_DISPLAY_TYPE = 0x3900
351 | MAPI_TEMPLATEID = 0x3902
352 | MAPI_PRIMARY_CAPABILITY = 0x3904
353 | MAPI_SMTP_ADDRESS = 0x39FE
354 | MAPI_7BIT_DISPLAY_NAME = 0x39FF
355 | MAPI_ACCOUNT = 0x3A00
356 | MAPI_ALTERNATE_RECIPIENT = 0x3A01
357 | MAPI_CALLBACK_TELEPHONE_NUMBER = 0x3A02
358 | MAPI_CONVERSION_PROHIBITED = 0x3A03
359 | MAPI_DISCLOSE_RECIPIENTS = 0x3A04
360 | MAPI_GENERATION = 0x3A05
361 | MAPI_GIVEN_NAME = 0x3A06
362 | MAPI_GOVERNMENT_ID_NUMBER = 0x3A07
363 | MAPI_BUSINESS_TELEPHONE_NUMBER = 0x3A08
364 | MAPI_HOME_TELEPHONE_NUMBER = 0x3A09
365 | MAPI_INITIALS = 0x3A0A
366 | MAPI_KEYWORD = 0x3A0B
367 | MAPI_LANGUAGE = 0x3A0C
368 | MAPI_LOCATION = 0x3A0D
369 | MAPI_MAIL_PERMISSION = 0x3A0E
370 | MAPI_MHS_COMMON_NAME = 0x3A0F
371 | MAPI_ORGANIZATIONAL_ID_NUMBER = 0x3A10
372 | MAPI_SURNAME = 0x3A11
373 | MAPI_ORIGINAL_ENTRYID = 0x3A12
374 | MAPI_ORIGINAL_DISPLAY_NAME = 0x3A13
375 | MAPI_ORIGINAL_SEARCH_KEY = 0x3A14
376 | MAPI_POSTAL_ADDRESS = 0x3A15
377 | MAPI_COMPANY_NAME = 0x3A16
378 | MAPI_TITLE = 0x3A17
379 | MAPI_DEPARTMENT_NAME = 0x3A18
380 | MAPI_OFFICE_LOCATION = 0x3A19
381 | MAPI_PRIMARY_TELEPHONE_NUMBER = 0x3A1A
382 | MAPI_BUSINESS2_TELEPHONE_NUMBER = 0x3A1B
383 | MAPI_MOBILE_TELEPHONE_NUMBER = 0x3A1C
384 | MAPI_RADIO_TELEPHONE_NUMBER = 0x3A1D
385 | MAPI_CAR_TELEPHONE_NUMBER = 0x3A1E
386 | MAPI_OTHER_TELEPHONE_NUMBER = 0x3A1F
387 | MAPI_TRANSMITABLE_DISPLAY_NAME = 0x3A20
388 | MAPI_PAGER_TELEPHONE_NUMBER = 0x3A21
389 | MAPI_USER_CERTIFICATE = 0x3A22
390 | MAPI_PRIMARY_FAX_NUMBER = 0x3A23
391 | MAPI_BUSINESS_FAX_NUMBER = 0x3A24
392 | MAPI_HOME_FAX_NUMBER = 0x3A25
393 | MAPI_COUNTRY = 0x3A26
394 | MAPI_LOCALITY = 0x3A27
395 | MAPI_STATE_OR_PROVINCE = 0x3A28
396 | MAPI_STREET_ADDRESS = 0x3A29
397 | MAPI_POSTAL_CODE = 0x3A2A
398 | MAPI_POST_OFFICE_BOX = 0x3A2B
399 | MAPI_TELEX_NUMBER = 0x3A2C
400 | MAPI_ISDN_NUMBER = 0x3A2D
401 | MAPI_ASSISTANT_TELEPHONE_NUMBER = 0x3A2E
402 | MAPI_HOME2_TELEPHONE_NUMBER = 0x3A2F
403 | MAPI_ASSISTANT = 0x3A30
404 | MAPI_SEND_RICH_INFO = 0x3A40
405 | MAPI_WEDDING_ANNIVERSARY = 0x3A41
406 | MAPI_BIRTHDAY = 0x3A42
407 | MAPI_HOBBIES = 0x3A43
408 | MAPI_MIDDLE_NAME = 0x3A44
409 | MAPI_DISPLAY_NAME_PREFIX = 0x3A45
410 | MAPI_PROFESSION = 0x3A46
411 | MAPI_PREFERRED_BY_NAME = 0x3A47
412 | MAPI_SPOUSE_NAME = 0x3A48
413 | MAPI_COMPUTER_NETWORK_NAME = 0x3A49
414 | MAPI_CUSTOMER_ID = 0x3A4A
415 | MAPI_TTYTDD_PHONE_NUMBER = 0x3A4B
416 | MAPI_FTP_SITE = 0x3A4C
417 | MAPI_GENDER = 0x3A4D
418 | MAPI_MANAGER_NAME = 0x3A4E
419 | MAPI_NICKNAME = 0x3A4F
420 | MAPI_PERSONAL_HOME_PAGE = 0x3A50
421 | MAPI_BUSINESS_HOME_PAGE = 0x3A51
422 | MAPI_CONTACT_VERSION = 0x3A52
423 | MAPI_CONTACT_ENTRYIDS = 0x3A53
424 | MAPI_CONTACT_ADDRTYPES = 0x3A54
425 | MAPI_CONTACT_DEFAULT_ADDRESS_INDEX = 0x3A55
426 | MAPI_CONTACT_EMAIL_ADDRESSES = 0x3A56
427 | MAPI_COMPANY_MAIN_PHONE_NUMBER = 0x3A57
428 | MAPI_CHILDRENS_NAMES = 0x3A58
429 | MAPI_HOME_ADDRESS_CITY = 0x3A59
430 | MAPI_HOME_ADDRESS_COUNTRY = 0x3A5A
431 | MAPI_HOME_ADDRESS_POSTAL_CODE = 0x3A5B
432 | MAPI_HOME_ADDRESS_STATE_OR_PROVINCE = 0x3A5C
433 | MAPI_HOME_ADDRESS_STREET = 0x3A5D
434 | MAPI_HOME_ADDRESS_POST_OFFICE_BOX = 0x3A5E
435 | MAPI_OTHER_ADDRESS_CITY = 0x3A5F
436 | MAPI_OTHER_ADDRESS_COUNTRY = 0x3A60
437 | MAPI_OTHER_ADDRESS_POSTAL_CODE = 0x3A61
438 | MAPI_OTHER_ADDRESS_STATE_OR_PROVINCE = 0x3A62
439 | MAPI_OTHER_ADDRESS_STREET = 0x3A63
440 | MAPI_OTHER_ADDRESS_POST_OFFICE_BOX = 0x3A64
441 | MAPI_SEND_INTERNET_ENCODING = 0x3A71
442 | MAPI_STORE_PROVIDERS = 0x3D00
443 | MAPI_AB_PROVIDERS = 0x3D01
444 | MAPI_TRANSPORT_PROVIDERS = 0x3D02
445 | MAPI_DEFAULT_PROFILE = 0x3D04
446 | MAPI_AB_SEARCH_PATH = 0x3D05
447 | MAPI_AB_DEFAULT_DIR = 0x3D06
448 | MAPI_AB_DEFAULT_PAB = 0x3D07
449 | MAPI_FILTERING_HOOKS = 0x3D08
450 | MAPI_SERVICE_NAME = 0x3D09
451 | MAPI_SERVICE_DLL_NAME = 0x3D0A
452 | MAPI_SERVICE_ENTRY_NAME = 0x3D0B
453 | MAPI_SERVICE_UID = 0x3D0C
454 | MAPI_SERVICE_EXTRA_UIDS = 0x3D0D
455 | MAPI_SERVICES = 0x3D0E
456 | MAPI_SERVICE_SUPPORT_FILES = 0x3D0F
457 | MAPI_SERVICE_DELETE_FILES = 0x3D10
458 | MAPI_AB_SEARCH_PATH_UPDATE = 0x3D11
459 | MAPI_PROFILE_NAME = 0x3D12
460 | MAPI_IDENTITY_DISPLAY = 0x3E00
461 | MAPI_IDENTITY_ENTRYID = 0x3E01
462 | MAPI_RESOURCE_METHODS = 0x3E02
463 | MAPI_RESOURCE_TYPE = 0x3E03
464 | MAPI_STATUS_CODE = 0x3E04
465 | MAPI_IDENTITY_SEARCH_KEY = 0x3E05
466 | MAPI_OWN_STORE_ENTRYID = 0x3E06
467 | MAPI_RESOURCE_PATH = 0x3E07
468 | MAPI_STATUS_STRING = 0x3E08
469 | MAPI_X400_DEFERRED_DELIVERY_CANCEL = 0x3E09
470 | MAPI_HEADER_FOLDER_ENTRYID = 0x3E0A
471 | MAPI_REMOTE_PROGRESS = 0x3E0B
472 | MAPI_REMOTE_PROGRESS_TEXT = 0x3E0C
473 | MAPI_REMOTE_VALIDATE_OK = 0x3E0D
474 | MAPI_CONTROL_FLAGS = 0x3F00
475 | MAPI_CONTROL_STRUCTURE = 0x3F01
476 | MAPI_CONTROL_TYPE = 0x3F02
477 | MAPI_DELTAX = 0x3F03
478 | MAPI_DELTAY = 0x3F04
479 | MAPI_XPOS = 0x3F05
480 | MAPI_YPOS = 0x3F06
481 | MAPI_CONTROL_ID = 0x3F07
482 | MAPI_INITIAL_DETAILS_PANE = 0x3F08
483 | MAPI_UNCOMPRESSED_BODY = 0x3FD9
484 | MAPI_INTERNET_CODEPAGE = 0x3FDE
485 | MAPI_AUTO_RESPONSE_SUPPRESS = 0x3FDF
486 | MAPI_MESSAGE_LOCALE_ID = 0x3FF1
487 | MAPI_RULE_TRIGGER_HISTORY = 0x3FF2
488 | MAPI_MOVE_TO_STORE_ENTRYID = 0x3FF3
489 | MAPI_MOVE_TO_FOLDER_ENTRYID = 0x3FF4
490 | MAPI_STORAGE_QUOTA_LIMIT = 0x3FF5
491 | MAPI_EXCESS_STORAGE_USED = 0x3FF6
492 | MAPI_SVR_GENERATING_QUOTA_MSG = 0x3FF7
493 | MAPI_CREATOR_NAME = 0x3FF8
494 | MAPI_CREATOR_ENTRY_ID = 0x3FF9
495 | MAPI_LAST_MODIFIER_NAME = 0x3FFA
496 | MAPI_LAST_MODIFIER_ENTRY_ID = 0x3FFB
497 | MAPI_REPLY_RECIPIENT_SMTP_PROXIES = 0x3FFC
498 | MAPI_MESSAGE_CODEPAGE = 0x3FFD
499 | MAPI_EXTENDED_ACL_DATA = 0x3FFE
500 | MAPI_SENDER_FLAGS = 0x4019
501 | MAPI_SENT_REPRESENTING_FLAGS = 0x401A
502 | MAPI_RECEIVED_BY_FLAGS = 0x401B
503 | MAPI_RECEIVED_REPRESENTING_FLAGS = 0x401C
504 | MAPI_CREATOR_ADDRESS_TYPE = 0x4022
505 | MAPI_CREATOR_EMAIL_ADDRESS = 0x4023
506 | MAPI_SENDER_SIMPLE_DISPLAY_NAME = 0x4030
507 | MAPI_SENT_REPRESENTING_SIMPLE_DISPLAY_NAME = 0x4031
508 | MAPI_RECEIVED_REPRESENTING_SIMPLE_DISPLAY_NAME = 0x4035
509 | MAPI_CREATOR_SIMPLE_DISP_NAME = 0x4038
510 | MAPI_LAST_MODIFIER_SIMPLE_DISPLAY_NAME = 0x4039
511 | MAPI_CONTENT_FILTER_SPAM_CONFIDENCE_LEVEL = 0x4076
512 | MAPI_INTERNET_MAIL_OVERRIDE_FORMAT = 0x5902
513 | MAPI_MESSAGE_EDITOR_FORMAT = 0x5909
514 | MAPI_SENDER_SMTP_ADDRESS = 0x5D01
515 | MAPI_SENT_REPRESENTING_SMTP_ADDRESS = 0x5D02
516 | MAPI_READ_RECEIPT_SMTP_ADDRESS = 0x5D05
517 | MAPI_RECEIVED_BY_SMTP_ADDRESS = 0x5D07
518 | MAPI_RECEIVED_REPRESENTING_SMTP_ADDRESS = 0x5D08
519 | MAPI_SENDING_SMTP_ADDRESS = 0x5D09
520 | MAPI_SIP_ADDRESS = 0x5FE5
521 | MAPI_RECIPIENT_DISPLAY_NAME = 0x5FF6
522 | MAPI_RECIPIENT_ENTRYID = 0x5FF7
523 | MAPI_RECIPIENT_FLAGS = 0x5FFD
524 | MAPI_RECIPIENT_TRACKSTATUS = 0x5FFF
525 | MAPI_CHANGE_KEY = 0x65E2
526 | MAPI_PREDECESSOR_CHANGE_LIST = 0x65E3
527 | MAPI_ID_SECURE_MIN = 0x67F0
528 | MAPI_ID_SECURE_MAX = 0x67FF
529 | MAPI_VOICE_MESSAGE_DURATION = 0x6801
530 | MAPI_SENDER_TELEPHONE_NUMBER = 0x6802
531 | MAPI_VOICE_MESSAGE_SENDER_NAME = 0x6803
532 | MAPI_FAX_NUMBER_OF_PAGES = 0x6804
533 | MAPI_VOICE_MESSAGE_ATTACHMENT_ORDER = 0x6805
534 | MAPI_CALL_ID = 0x6806
535 | MAPI_ATTACHMENT_LINK_ID = 0x7FFA
536 | MAPI_EXCEPTION_START_TIME = 0x7FFB
537 | MAPI_EXCEPTION_END_TIME = 0x7FFC
538 | MAPI_ATTACHMENT_FLAGS = 0x7FFD
539 | MAPI_ATTACHMENT_HIDDEN = 0x7FFE
540 | MAPI_ATTACHMENT_CONTACT_PHOTO = 0x7FFF
541 | MAPI_FILE_UNDER = 0x8005
542 | MAPI_FILE_UNDER_ID = 0x8006
543 | MAPI_CONTACT_ITEM_DATA = 0x8007
544 | MAPI_REFERRED_BY = 0x800E
545 | MAPI_DEPARTMENT = 0x8010
546 | MAPI_HAS_PICTURE = 0x8015
547 | MAPI_HOME_ADDRESS = 0x801A
548 | MAPI_WORK_ADDRESS = 0x801B
549 | MAPI_OTHER_ADDRESS = 0x801C
550 | MAPI_POSTAL_ADDRESS_ID = 0x8022
551 | MAPI_CONTACT_CHARACTER_SET = 0x8023
552 | MAPI_AUTO_LOG = 0x8025
553 | MAPI_FILE_UNDER_LIST = 0x8026
554 | MAPI_EMAIL_LIST = 0x8027
555 | MAPI_ADDRESS_BOOK_PROVIDER_EMAIL_LIST = 0x8028
556 | MAPI_ADDRESS_BOOK_PROVIDER_ARRAY_TYPE = 0x8029
557 | MAPI_HTML = 0x802B
558 | MAPI_YOMI_FIRST_NAME = 0x802C
559 | MAPI_YOMI_LAST_NAME = 0x802D
560 | MAPI_YOMI_COMPANY_NAME = 0x802E
561 | MAPI_BUSINESS_CARD_DISPLAY_DEFINITION = 0x8040
562 | MAPI_BUSINESS_CARD_CARD_PICTURE = 0x8041
563 | MAPI_WORK_ADDRESS_STREET = 0x8045
564 | MAPI_WORK_ADDRESS_CITY = 0x8046
565 | MAPI_WORK_ADDRESS_STATE = 0x8047
566 | MAPI_WORK_ADDRESS_POSTAL_CODE = 0x8048
567 | MAPI_WORK_ADDRESS_COUNTRY = 0x8049
568 | MAPI_WORK_ADDRESS_POST_OFFICE_BOX = 0x804A
569 | MAPI_DISTRIBUTION_LIST_CHECKSUM = 0x804C
570 | MAPI_BIRTHDAY_EVENT_ENTRY_ID = 0x804D
571 | MAPI_ANNIVERSARY_EVENT_ENTRY_ID = 0x804E
572 | MAPI_CONTACT_USER_FIELD1 = 0x804F
573 | MAPI_CONTACT_USER_FIELD2 = 0x8050
574 | MAPI_CONTACT_USER_FIELD3 = 0x8051
575 | MAPI_CONTACT_USER_FIELD4 = 0x8052
576 | MAPI_DISTRIBUTION_LIST_NAME = 0x8053
577 | MAPI_DISTRIBUTION_LIST_ONE_OFF_MEMBERS = 0x8054
578 | MAPI_DISTRIBUTION_LIST_MEMBERS = 0x8055
579 | MAPI_INSTANT_MESSAGING_ADDRESS = 0x8062
580 | MAPI_DISTRIBUTION_LIST_STREAM = 0x8064
581 | MAPI_EMAIL_DISPLAY_NAME = 0x8080
582 | MAPI_EMAIL_ADDR_TYPE = 0x8082
583 | MAPI_EMAIL_EMAIL_ADDRESS = 0x8083
584 | MAPI_EMAIL_ORIGINAL_DISPLAY_NAME = 0x8084
585 | MAPI_EMAIL1ORIGINAL_ENTRY_ID = 0x8085
586 | MAPI_EMAIL1RICH_TEXT_FORMAT = 0x8086
587 | MAPI_EMAIL1EMAIL_TYPE = 0x8087
588 | MAPI_EMAIL2DISPLAY_NAME = 0x8090
589 | MAPI_EMAIL2ENTRY_ID = 0x8091
590 | MAPI_EMAIL2ADDR_TYPE = 0x8092
591 | MAPI_EMAIL2EMAIL_ADDRESS = 0x8093
592 | MAPI_EMAIL2ORIGINAL_DISPLAY_NAME = 0x8094
593 | MAPI_EMAIL2ORIGINAL_ENTRY_ID = 0x8095
594 | MAPI_EMAIL2RICH_TEXT_FORMAT = 0x8096
595 | MAPI_EMAIL3DISPLAY_NAME = 0x80A0
596 | MAPI_EMAIL3ENTRY_ID = 0x80A1
597 | MAPI_EMAIL3ADDR_TYPE = 0x80A2
598 | MAPI_EMAIL3EMAIL_ADDRESS = 0x80A3
599 | MAPI_EMAIL3ORIGINAL_DISPLAY_NAME = 0x80A4
600 | MAPI_EMAIL3ORIGINAL_ENTRY_ID = 0x80A5
601 | MAPI_EMAIL3RICH_TEXT_FORMAT = 0x80A6
602 | MAPI_FAX1ADDRESS_TYPE = 0x80B2
603 | MAPI_FAX1EMAIL_ADDRESS = 0x80B3
604 | MAPI_FAX1ORIGINAL_DISPLAY_NAME = 0x80B4
605 | MAPI_FAX1ORIGINAL_ENTRY_ID = 0x80B5
606 | MAPI_FAX2ADDRESS_TYPE = 0x80C2
607 | MAPI_FAX2EMAIL_ADDRESS = 0x80C3
608 | MAPI_FAX2ORIGINAL_DISPLAY_NAME = 0x80C4
609 | MAPI_FAX2ORIGINAL_ENTRY_ID = 0x80C5
610 | MAPI_FAX3ADDRESS_TYPE = 0x80D2
611 | MAPI_FAX3EMAIL_ADDRESS = 0x80D3
612 | MAPI_FAX3ORIGINAL_DISPLAY_NAME = 0x80D4
613 | MAPI_FAX3ORIGINAL_ENTRY_ID = 0x80D5
614 | MAPI_FREE_BUSY_LOCATION = 0x80D8
615 | MAPI_HOME_ADDRESS_COUNTRY_CODE = 0x80DA
616 | MAPI_WORK_ADDRESS_COUNTRY_CODE = 0x80DB
617 | MAPI_OTHER_ADDRESS_COUNTRY_CODE = 0x80DC
618 | MAPI_ADDRESS_COUNTRY_CODE = 0x80DD
619 | MAPI_BIRTHDAY_LOCAL = 0x80DE
620 | MAPI_WEDDING_ANNIVERSARY_LOCAL = 0x80DF
621 | MAPI_TASK_STATUS = 0x8101
622 | MAPI_TASK_START_DATE = 0x8104
623 | MAPI_TASK_DUE_DATE = 0x8105
624 | MAPI_TASK_ACTUAL_EFFORT = 0x8110
625 | MAPI_TASK_ESTIMATED_EFFORT = 0x8111
626 | MAPI_TASK_FRECUR = 0x8126
627 | MAPI_SEND_MEETING_AS_ICAL = 0x8200
628 | MAPI_APPOINTMENT_SEQUENCE = 0x8201
629 | MAPI_APPOINTMENT_SEQUENCE_TIME = 0x8202
630 | MAPI_APPOINTMENT_LAST_SEQUENCE = 0x8203
631 | MAPI_CHANGE_HIGHLIGHT = 0x8204
632 | MAPI_BUSY_STATUS = 0x8205
633 | MAPI_FEXCEPTIONAL_BODY = 0x8206
634 | MAPI_APPOINTMENT_AUXILIARY_FLAGS = 0x8207
635 | MAPI_OUTLOOK_LOCATION = 0x8208
636 | MAPI_MEETING_WORKSPACE_URL = 0x8209
637 | MAPI_FORWARD_INSTANCE = 0x820A
638 | MAPI_LINKED_TASK_ITEMS = 0x820C
639 | MAPI_APPT_START_WHOLE = 0x820D
640 | MAPI_APPT_END_WHOLE = 0x820E
641 | MAPI_APPOINTMENT_START_TIME = 0x820F
642 | MAPI_APPOINTMENT_END_TIME = 0x8210
643 | MAPI_APPOINTMENT_END_DATE = 0x8211
644 | MAPI_APPOINTMENT_START_DATE = 0x8212
645 | MAPI_APPT_DURATION = 0x8213
646 | MAPI_APPOINTMENT_COLOR = 0x8214
647 | MAPI_APPOINTMENT_SUB_TYPE = 0x8215
648 | MAPI_APPOINTMENT_RECUR = 0x8216
649 | MAPI_APPOINTMENT_STATE_FLAGS = 0x8217
650 | MAPI_RESPONSE_STATUS = 0x8218
651 | MAPI_APPOINTMENT_REPLY_TIME = 0x8220
652 | MAPI_RECURRING = 0x8223
653 | MAPI_INTENDED_BUSY_STATUS = 0x8224
654 | MAPI_APPOINTMENT_UPDATE_TIME = 0x8226
655 | MAPI_EXCEPTION_REPLACE_TIME = 0x8228
656 | MAPI_OWNER_NAME = 0x822E
657 | MAPI_APPOINTMENT_REPLY_NAME = 0x8230
658 | MAPI_RECURRENCE_TYPE = 0x8231
659 | MAPI_RECURRENCE_PATTERN = 0x8232
660 | MAPI_TIME_ZONE_STRUCT = 0x8233
661 | MAPI_TIME_ZONE_DESCRIPTION = 0x8234
662 | MAPI_CLIP_START = 0x8235
663 | MAPI_CLIP_END = 0x8236
664 | MAPI_ORIGINAL_STORE_ENTRY_ID = 0x8237
665 | MAPI_ALL_ATTENDEES_STRING = 0x8238
666 | MAPI_AUTO_FILL_LOCATION = 0x823A
667 | MAPI_TO_ATTENDEES_STRING = 0x823B
668 | MAPI_CCATTENDEES_STRING = 0x823C
669 | MAPI_CONF_CHECK = 0x8240
670 | MAPI_CONFERENCING_TYPE = 0x8241
671 | MAPI_DIRECTORY = 0x8242
672 | MAPI_ORGANIZER_ALIAS = 0x8243
673 | MAPI_AUTO_START_CHECK = 0x8244
674 | MAPI_AUTO_START_WHEN = 0x8245
675 | MAPI_ALLOW_EXTERNAL_CHECK = 0x8246
676 | MAPI_COLLABORATE_DOC = 0x8247
677 | MAPI_NET_SHOW_URL = 0x8248
678 | MAPI_ONLINE_PASSWORD = 0x8249
679 | MAPI_APPOINTMENT_PROPOSED_DURATION = 0x8256
680 | MAPI_APPT_COUNTER_PROPOSAL = 0x8257
681 | MAPI_APPOINTMENT_PROPOSAL_NUMBER = 0x8259
682 | MAPI_APPOINTMENT_NOT_ALLOW_PROPOSE = 0x825A
683 | MAPI_APPT_TZDEF_START_DISPLAY = 0x825E
684 | MAPI_APPT_TZDEF_END_DISPLAY = 0x825F
685 | MAPI_APPT_TZDEF_RECUR = 0x8260
686 | MAPI_REMINDER_MINUTES_BEFORE_START = 0x8501
687 | MAPI_REMINDER_TIME = 0x8502
688 | MAPI_REMINDER_SET = 0x8503
689 | MAPI_PRIVATE = 0x8506
690 | MAPI_AGING_DONT_AGE_ME = 0x850E
691 | MAPI_FORM_STORAGE = 0x850F
692 | MAPI_SIDE_EFFECTS = 0x8510
693 | MAPI_REMOTE_STATUS = 0x8511
694 | MAPI_PAGE_DIR_STREAM = 0x8513
695 | MAPI_SMART_NO_ATTACH = 0x8514
696 | MAPI_COMMON_START = 0x8516
697 | MAPI_COMMON_END = 0x8517
698 | MAPI_TASK_MODE = 0x8518
699 | MAPI_FORM_PROP_STREAM = 0x851B
700 | MAPI_REQUEST = 0x8530
701 | MAPI_NON_SENDABLE_TO = 0x8536
702 | MAPI_NON_SENDABLE_CC = 0x8537
703 | MAPI_NON_SENDABLE_BCC = 0x8538
704 | MAPI_COMPANIES = 0x8539
705 | MAPI_CONTACTS = 0x853A
706 | MAPI_PROP_DEF_STREAM = 0x8540
707 | MAPI_SCRIPT_STREAM = 0x8541
708 | MAPI_CUSTOM_FLAG = 0x8542
709 | MAPI_OUTLOOK_CURRENT_VERSION = 0x8552
710 | MAPI_CURRENT_VERSION_NAME = 0x8554
711 | MAPI_REMINDER_NEXT_TIME = 0x8560
712 | MAPI_HEADER_ITEM = 0x8578
713 | MAPI_USE_TNEF = 0x8582
714 | MAPI_TO_DO_TITLE = 0x85A4
715 | MAPI_VALID_FLAG_STRING_PROOF = 0x85BF
716 | MAPI_LOG_TYPE = 0x8700
717 | MAPI_LOG_START = 0x8706
718 | MAPI_LOG_DURATION = 0x8707
719 | MAPI_LOG_END = 0x8708
720 |
721 | CODE_TO_NAME = {
722 | MAPI_ACKNOWLEDGEMENT_MODE: "MAPI_ACKNOWLEDGEMENT_MODE",
723 | MAPI_ALTERNATE_RECIPIENT_ALLOWED: "MAPI_ALTERNATE_RECIPIENT_ALLOWED",
724 | MAPI_AUTHORIZING_USERS: "MAPI_AUTHORIZING_USERS",
725 | MAPI_AUTO_FORWARD_COMMENT: "MAPI_AUTO_FORWARD_COMMENT",
726 | MAPI_AUTO_FORWARDED: "MAPI_AUTO_FORWARDED",
727 | MAPI_CONTENT_CONFIDENTIALITY_ALGORITHM_ID: "MAPI_CONTENT_CONFIDENTIALITY_ALGORITHM_ID",
728 | MAPI_CONTENT_CORRELATOR: "MAPI_CONTENT_CORRELATOR",
729 | MAPI_CONTENT_IDENTIFIER: "MAPI_CONTENT_IDENTIFIER",
730 | MAPI_CONTENT_LENGTH: "MAPI_CONTENT_LENGTH",
731 | MAPI_CONTENT_RETURN_REQUESTED: "MAPI_CONTENT_RETURN_REQUESTED",
732 | MAPI_CONVERSATION_KEY: "MAPI_CONVERSATION_KEY",
733 | MAPI_CONVERSION_EITS: "MAPI_CONVERSION_EITS",
734 | MAPI_CONVERSION_WITH_LOSS_PROHIBITED: "MAPI_CONVERSION_WITH_LOSS_PROHIBITED",
735 | MAPI_CONVERTED_EITS: "MAPI_CONVERTED_EITS",
736 | MAPI_DEFERRED_DELIVERY_TIME: "MAPI_DEFERRED_DELIVERY_TIME",
737 | MAPI_DELIVER_TIME: "MAPI_DELIVER_TIME",
738 | MAPI_DISCARD_REASON: "MAPI_DISCARD_REASON",
739 | MAPI_DISCLOSURE_OF_RECIPIENTS: "MAPI_DISCLOSURE_OF_RECIPIENTS",
740 | MAPI_DL_EXPANSION_HISTORY: "MAPI_DL_EXPANSION_HISTORY",
741 | MAPI_DL_EXPANSION_PROHIBITED: "MAPI_DL_EXPANSION_PROHIBITED",
742 | MAPI_EXPIRY_TIME: "MAPI_EXPIRY_TIME",
743 | MAPI_IMPLICIT_CONVERSION_PROHIBITED: "MAPI_IMPLICIT_CONVERSION_PROHIBITED",
744 | MAPI_IMPORTANCE: "MAPI_IMPORTANCE",
745 | MAPI_IPM_ID: "MAPI_IPM_ID",
746 | MAPI_LATEST_DELIVERY_TIME: "MAPI_LATEST_DELIVERY_TIME",
747 | MAPI_MESSAGE_CLASS: "MAPI_MESSAGE_CLASS",
748 | MAPI_MESSAGE_DELIVERY_ID: "MAPI_MESSAGE_DELIVERY_ID",
749 | MAPI_MESSAGE_SECURITY_LABEL: "MAPI_MESSAGE_SECURITY_LABEL",
750 | MAPI_OBSOLETED_IPMS: "MAPI_OBSOLETED_IPMS",
751 | MAPI_ORIGINALLY_INTENDED_RECIPIENT_NAME: "MAPI_ORIGINALLY_INTENDED_RECIPIENT_NAME",
752 | MAPI_ORIGINAL_EITS: "MAPI_ORIGINAL_EITS",
753 | MAPI_ORIGINATOR_CERTIFICATE: "MAPI_ORIGINATOR_CERTIFICATE",
754 | MAPI_ORIGINATOR_DELIVERY_REPORT_REQUESTED: "MAPI_ORIGINATOR_DELIVERY_REPORT_REQUESTED",
755 | MAPI_ORIGINATOR_RETURN_ADDRESS: "MAPI_ORIGINATOR_RETURN_ADDRESS",
756 | MAPI_PARENT_KEY: "MAPI_PARENT_KEY",
757 | MAPI_PRIORITY: "MAPI_PRIORITY",
758 | MAPI_ORIGIN_CHECK: "MAPI_ORIGIN_CHECK",
759 | MAPI_PROOF_OF_SUBMISSION_REQUESTED: "MAPI_PROOF_OF_SUBMISSION_REQUESTED",
760 | MAPI_READ_RECEIPT_REQUESTED: "MAPI_READ_RECEIPT_REQUESTED",
761 | MAPI_RECEIPT_TIME: "MAPI_RECEIPT_TIME",
762 | MAPI_RECIPIENT_REASSIGNMENT_PROHIBITED: "MAPI_RECIPIENT_REASSIGNMENT_PROHIBITED",
763 | MAPI_REDIRECTION_HISTORY: "MAPI_REDIRECTION_HISTORY",
764 | MAPI_RELATED_IPMS: "MAPI_RELATED_IPMS",
765 | MAPI_ORIGINAL_SENSITIVITY: "MAPI_ORIGINAL_SENSITIVITY",
766 | MAPI_LANGUAGES: "MAPI_LANGUAGES",
767 | MAPI_REPLY_TIME: "MAPI_REPLY_TIME",
768 | MAPI_REPORT_TAG: "MAPI_REPORT_TAG",
769 | MAPI_REPORT_TIME: "MAPI_REPORT_TIME",
770 | MAPI_RETURNED_IPM: "MAPI_RETURNED_IPM",
771 | MAPI_SECURITY: "MAPI_SECURITY",
772 | MAPI_INCOMPLETE_COPY: "MAPI_INCOMPLETE_COPY",
773 | MAPI_SENSITIVITY: "MAPI_SENSITIVITY",
774 | MAPI_SUBJECT: "MAPI_SUBJECT",
775 | MAPI_SUBJECT_IPM: "MAPI_SUBJECT_IPM",
776 | MAPI_CLIENT_SUBMIT_TIME: "MAPI_CLIENT_SUBMIT_TIME",
777 | MAPI_REPORT_NAME: "MAPI_REPORT_NAME",
778 | MAPI_SENT_REPRESENTING_SEARCH_KEY: "MAPI_SENT_REPRESENTING_SEARCH_KEY",
779 | MAPI_X400_CONTENT_TYPE: "MAPI_X400_CONTENT_TYPE",
780 | MAPI_SUBJECT_PREFIX: "MAPI_SUBJECT_PREFIX",
781 | MAPI_NON_RECEIPT_REASON: "MAPI_NON_RECEIPT_REASON",
782 | MAPI_RECEIVED_BY_ENTRYID: "MAPI_RECEIVED_BY_ENTRYID",
783 | MAPI_RECEIVED_BY_NAME: "MAPI_RECEIVED_BY_NAME",
784 | MAPI_SENT_REPRESENTING_ENTRYID: "MAPI_SENT_REPRESENTING_ENTRYID",
785 | MAPI_SENT_REPRESENTING_NAME: "MAPI_SENT_REPRESENTING_NAME",
786 | MAPI_RCVD_REPRESENTING_ENTRYID: "MAPI_RCVD_REPRESENTING_ENTRYID",
787 | MAPI_RCVD_REPRESENTING_NAME: "MAPI_RCVD_REPRESENTING_NAME",
788 | MAPI_REPORT_ENTRYID: "MAPI_REPORT_ENTRYID",
789 | MAPI_READ_RECEIPT_ENTRYID: "MAPI_READ_RECEIPT_ENTRYID",
790 | MAPI_MESSAGE_SUBMISSION_ID: "MAPI_MESSAGE_SUBMISSION_ID",
791 | MAPI_PROVIDER_SUBMIT_TIME: "MAPI_PROVIDER_SUBMIT_TIME",
792 | MAPI_ORIGINAL_SUBJECT: "MAPI_ORIGINAL_SUBJECT",
793 | MAPI_DISC_VAL: "MAPI_DISC_VAL",
794 | MAPI_ORIG_MESSAGE_CLASS: "MAPI_ORIG_MESSAGE_CLASS",
795 | MAPI_ORIGINAL_AUTHOR_ENTRYID: "MAPI_ORIGINAL_AUTHOR_ENTRYID",
796 | MAPI_ORIGINAL_AUTHOR_NAME: "MAPI_ORIGINAL_AUTHOR_NAME",
797 | MAPI_ORIGINAL_SUBMIT_TIME: "MAPI_ORIGINAL_SUBMIT_TIME",
798 | MAPI_REPLY_RECIPIENT_ENTRIES: "MAPI_REPLY_RECIPIENT_ENTRIES",
799 | MAPI_REPLY_RECIPIENT_NAMES: "MAPI_REPLY_RECIPIENT_NAMES",
800 | MAPI_RECEIVED_BY_SEARCH_KEY: "MAPI_RECEIVED_BY_SEARCH_KEY",
801 | MAPI_RCVD_REPRESENTING_SEARCH_KEY: "MAPI_RCVD_REPRESENTING_SEARCH_KEY",
802 | MAPI_READ_RECEIPT_SEARCH_KEY: "MAPI_READ_RECEIPT_SEARCH_KEY",
803 | MAPI_REPORT_SEARCH_KEY: "MAPI_REPORT_SEARCH_KEY",
804 | MAPI_ORIGINAL_DELIVERY_TIME: "MAPI_ORIGINAL_DELIVERY_TIME",
805 | MAPI_ORIGINAL_AUTHOR_SEARCH_KEY: "MAPI_ORIGINAL_AUTHOR_SEARCH_KEY",
806 | MAPI_MESSAGE_TO_ME: "MAPI_MESSAGE_TO_ME",
807 | MAPI_MESSAGE_CC_ME: "MAPI_MESSAGE_CC_ME",
808 | MAPI_MESSAGE_RECIP_ME: "MAPI_MESSAGE_RECIP_ME",
809 | MAPI_ORIGINAL_SENDER_NAME: "MAPI_ORIGINAL_SENDER_NAME",
810 | MAPI_ORIGINAL_SENDER_ENTRYID: "MAPI_ORIGINAL_SENDER_ENTRYID",
811 | MAPI_ORIGINAL_SENDER_SEARCH_KEY: "MAPI_ORIGINAL_SENDER_SEARCH_KEY",
812 | MAPI_ORIGINAL_SENT_REPRESENTING_NAME: "MAPI_ORIGINAL_SENT_REPRESENTING_NAME",
813 | MAPI_ORIGINAL_SENT_REPRESENTING_ENTRYID: "MAPI_ORIGINAL_SENT_REPRESENTING_ENTRYID",
814 | MAPI_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY: "MAPI_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY",
815 | MAPI_START_DATE: "MAPI_START_DATE",
816 | MAPI_END_DATE: "MAPI_END_DATE",
817 | MAPI_OWNER_APPT_ID: "MAPI_OWNER_APPT_ID",
818 | MAPI_RESPONSE_REQUESTED: "MAPI_RESPONSE_REQUESTED",
819 | MAPI_SENT_REPRESENTING_ADDRTYPE: "MAPI_SENT_REPRESENTING_ADDRTYPE",
820 | MAPI_SENT_REPRESENTING_EMAIL_ADDRESS: "MAPI_SENT_REPRESENTING_EMAIL_ADDRESS",
821 | MAPI_ORIGINAL_SENDER_ADDRTYPE: "MAPI_ORIGINAL_SENDER_ADDRTYPE",
822 | MAPI_ORIGINAL_SENDER_EMAIL_ADDRESS: "MAPI_ORIGINAL_SENDER_EMAIL_ADDRESS",
823 | MAPI_ORIGINAL_SENT_REPRESENTING_ADDRTYPE: "MAPI_ORIGINAL_SENT_REPRESENTING_ADDRTYPE",
824 | MAPI_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS: "MAPI_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS",
825 | MAPI_CONVERSATION_TOPIC: "MAPI_CONVERSATION_TOPIC",
826 | MAPI_CONVERSATION_INDEX: "MAPI_CONVERSATION_INDEX",
827 | MAPI_ORIGINAL_DISPLAY_BCC: "MAPI_ORIGINAL_DISPLAY_BCC",
828 | MAPI_ORIGINAL_DISPLAY_CC: "MAPI_ORIGINAL_DISPLAY_CC",
829 | MAPI_ORIGINAL_DISPLAY_TO: "MAPI_ORIGINAL_DISPLAY_TO",
830 | MAPI_RECEIVED_BY_ADDRTYPE: "MAPI_RECEIVED_BY_ADDRTYPE",
831 | MAPI_RECEIVED_BY_EMAIL_ADDRESS: "MAPI_RECEIVED_BY_EMAIL_ADDRESS",
832 | MAPI_RCVD_REPRESENTING_ADDRTYPE: "MAPI_RCVD_REPRESENTING_ADDRTYPE",
833 | MAPI_RCVD_REPRESENTING_EMAIL_ADDRESS: "MAPI_RCVD_REPRESENTING_EMAIL_ADDRESS",
834 | MAPI_ORIGINAL_AUTHOR_ADDRTYPE: "MAPI_ORIGINAL_AUTHOR_ADDRTYPE",
835 | MAPI_ORIGINAL_AUTHOR_EMAIL_ADDRESS: "MAPI_ORIGINAL_AUTHOR_EMAIL_ADDRESS",
836 | MAPI_ORIGINALLY_INTENDED_RECIP_ADDRTYPE: "MAPI_ORIGINALLY_INTENDED_RECIP_ADDRTYPE",
837 | MAPI_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS: "MAPI_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS",
838 | MAPI_TRANSPORT_MESSAGE_HEADERS: "MAPI_TRANSPORT_MESSAGE_HEADERS",
839 | MAPI_DELEGATION: "MAPI_DELEGATION",
840 | MAPI_TNEF_CORRELATION_KEY: "MAPI_TNEF_CORRELATION_KEY",
841 | MAPI_CONTENT_INTEGRITY_CHECK: "MAPI_CONTENT_INTEGRITY_CHECK",
842 | MAPI_EXPLICIT_CONVERSION: "MAPI_EXPLICIT_CONVERSION",
843 | MAPI_IPM_RETURN_REQUESTED: "MAPI_IPM_RETURN_REQUESTED",
844 | MAPI_MESSAGE_TOKEN: "MAPI_MESSAGE_TOKEN",
845 | MAPI_NDR_REASON_CODE: "MAPI_NDR_REASON_CODE",
846 | MAPI_NDR_DIAG_CODE: "MAPI_NDR_DIAG_CODE",
847 | MAPI_NON_RECEIPT_NOTIFICATION_REQUESTED: "MAPI_NON_RECEIPT_NOTIFICATION_REQUESTED",
848 | MAPI_DELIVERY_POINT: "MAPI_DELIVERY_POINT",
849 | MAPI_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED: "MAPI_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED",
850 | MAPI_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT: "MAPI_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT",
851 | MAPI_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY: "MAPI_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY",
852 | MAPI_PHYSICAL_DELIVERY_MODE: "MAPI_PHYSICAL_DELIVERY_MODE",
853 | MAPI_PHYSICAL_DELIVERY_REPORT_REQUEST: "MAPI_PHYSICAL_DELIVERY_REPORT_REQUEST",
854 | MAPI_PHYSICAL_FORWARDING_ADDRESS: "MAPI_PHYSICAL_FORWARDING_ADDRESS",
855 | MAPI_PHYSICAL_FORWARDING_ADDRESS_REQUESTED: "MAPI_PHYSICAL_FORWARDING_ADDRESS_REQUESTED",
856 | MAPI_PHYSICAL_FORWARDING_PROHIBITED: "MAPI_PHYSICAL_FORWARDING_PROHIBITED",
857 | MAPI_PHYSICAL_RENDITION_ATTRIBUTES: "MAPI_PHYSICAL_RENDITION_ATTRIBUTES",
858 | MAPI_PROOF_OF_DELIVERY: "MAPI_PROOF_OF_DELIVERY",
859 | MAPI_PROOF_OF_DELIVERY_REQUESTED: "MAPI_PROOF_OF_DELIVERY_REQUESTED",
860 | MAPI_RECIPIENT_CERTIFICATE: "MAPI_RECIPIENT_CERTIFICATE",
861 | MAPI_RECIPIENT_NUMBER_FOR_ADVICE: "MAPI_RECIPIENT_NUMBER_FOR_ADVICE",
862 | MAPI_RECIPIENT_TYPE: "MAPI_RECIPIENT_TYPE",
863 | MAPI_REGISTERED_MAIL_TYPE: "MAPI_REGISTERED_MAIL_TYPE",
864 | MAPI_REPLY_REQUESTED: "MAPI_REPLY_REQUESTED",
865 | MAPI_REQUESTED_DELIVERY_METHOD: "MAPI_REQUESTED_DELIVERY_METHOD",
866 | MAPI_SENDER_ENTRYID: "MAPI_SENDER_ENTRYID",
867 | MAPI_SENDER_NAME: "MAPI_SENDER_NAME",
868 | MAPI_SUPPLEMENTARY_INFO: "MAPI_SUPPLEMENTARY_INFO",
869 | MAPI_TYPE_OF_MTS_USER: "MAPI_TYPE_OF_MTS_USER",
870 | MAPI_SENDER_SEARCH_KEY: "MAPI_SENDER_SEARCH_KEY",
871 | MAPI_SENDER_ADDRTYPE: "MAPI_SENDER_ADDRTYPE",
872 | MAPI_SENDER_EMAIL_ADDRESS: "MAPI_SENDER_EMAIL_ADDRESS",
873 | MAPI_CURRENT_VERSION: "MAPI_CURRENT_VERSION",
874 | MAPI_DELETE_AFTER_SUBMIT: "MAPI_DELETE_AFTER_SUBMIT",
875 | MAPI_DISPLAY_BCC: "MAPI_DISPLAY_BCC",
876 | MAPI_DISPLAY_CC: "MAPI_DISPLAY_CC",
877 | MAPI_DISPLAY_TO: "MAPI_DISPLAY_TO",
878 | MAPI_PARENT_DISPLAY: "MAPI_PARENT_DISPLAY",
879 | MAPI_MESSAGE_DELIVERY_TIME: "MAPI_MESSAGE_DELIVERY_TIME",
880 | MAPI_MESSAGE_FLAGS: "MAPI_MESSAGE_FLAGS",
881 | MAPI_MESSAGE_SIZE: "MAPI_MESSAGE_SIZE",
882 | MAPI_PARENT_ENTRYID: "MAPI_PARENT_ENTRYID",
883 | MAPI_SENTMAIL_ENTRYID: "MAPI_SENTMAIL_ENTRYID",
884 | MAPI_CORRELATE: "MAPI_CORRELATE",
885 | MAPI_CORRELATE_MTSID: "MAPI_CORRELATE_MTSID",
886 | MAPI_DISCRETE_VALUES: "MAPI_DISCRETE_VALUES",
887 | MAPI_RESPONSIBILITY: "MAPI_RESPONSIBILITY",
888 | MAPI_SPOOLER_STATUS: "MAPI_SPOOLER_STATUS",
889 | MAPI_TRANSPORT_STATUS: "MAPI_TRANSPORT_STATUS",
890 | MAPI_MESSAGE_RECIPIENTS: "MAPI_MESSAGE_RECIPIENTS",
891 | MAPI_MESSAGE_ATTACHMENTS: "MAPI_MESSAGE_ATTACHMENTS",
892 | MAPI_SUBMIT_FLAGS: "MAPI_SUBMIT_FLAGS",
893 | MAPI_RECIPIENT_STATUS: "MAPI_RECIPIENT_STATUS",
894 | MAPI_TRANSPORT_KEY: "MAPI_TRANSPORT_KEY",
895 | MAPI_MSG_STATUS: "MAPI_MSG_STATUS",
896 | MAPI_MESSAGE_DOWNLOAD_TIME: "MAPI_MESSAGE_DOWNLOAD_TIME",
897 | MAPI_CREATION_VERSION: "MAPI_CREATION_VERSION",
898 | MAPI_MODIFY_VERSION: "MAPI_MODIFY_VERSION",
899 | MAPI_HASATTACH: "MAPI_HASATTACH",
900 | MAPI_BODY_CRC: "MAPI_BODY_CRC",
901 | MAPI_NORMALIZED_SUBJECT: "MAPI_NORMALIZED_SUBJECT",
902 | MAPI_RTF_IN_SYNC: "MAPI_RTF_IN_SYNC",
903 | MAPI_ATTACH_SIZE: "MAPI_ATTACH_SIZE",
904 | MAPI_ATTACH_NUM: "MAPI_ATTACH_NUM",
905 | MAPI_PREPROCESS: "MAPI_PREPROCESS",
906 | MAPI_ORIGINATING_MTA_CERTIFICATE: "MAPI_ORIGINATING_MTA_CERTIFICATE",
907 | MAPI_PROOF_OF_SUBMISSION: "MAPI_PROOF_OF_SUBMISSION",
908 | MAPI_PRIMARY_SEND_ACCOUNT: "MAPI_PRIMARY_SEND_ACCOUNT",
909 | MAPI_NEXT_SEND_ACCT: "MAPI_NEXT_SEND_ACCT",
910 | MAPI_ACCESS: "MAPI_ACCESS",
911 | MAPI_ROW_TYPE: "MAPI_ROW_TYPE",
912 | MAPI_INSTANCE_KEY: "MAPI_INSTANCE_KEY",
913 | MAPI_ACCESS_LEVEL: "MAPI_ACCESS_LEVEL",
914 | MAPI_MAPPING_SIGNATURE: "MAPI_MAPPING_SIGNATURE",
915 | MAPI_RECORD_KEY: "MAPI_RECORD_KEY",
916 | MAPI_STORE_RECORD_KEY: "MAPI_STORE_RECORD_KEY",
917 | MAPI_STORE_ENTRYID: "MAPI_STORE_ENTRYID",
918 | MAPI_MINI_ICON: "MAPI_MINI_ICON",
919 | MAPI_ICON: "MAPI_ICON",
920 | MAPI_OBJECT_TYPE: "MAPI_OBJECT_TYPE",
921 | MAPI_ENTRYID: "MAPI_ENTRYID",
922 | MAPI_BODY: "MAPI_BODY",
923 | MAPI_REPORT_TEXT: "MAPI_REPORT_TEXT",
924 | MAPI_ORIGINATOR_AND_DL_EXPANSION_HISTORY: "MAPI_ORIGINATOR_AND_DL_EXPANSION_HISTORY",
925 | MAPI_REPORTING_DL_NAME: "MAPI_REPORTING_DL_NAME",
926 | MAPI_REPORTING_MTA_CERTIFICATE: "MAPI_REPORTING_MTA_CERTIFICATE",
927 | MAPI_RTF_SYNC_BODY_CRC: "MAPI_RTF_SYNC_BODY_CRC",
928 | MAPI_RTF_SYNC_BODY_COUNT: "MAPI_RTF_SYNC_BODY_COUNT",
929 | MAPI_RTF_SYNC_BODY_TAG: "MAPI_RTF_SYNC_BODY_TAG",
930 | MAPI_RTF_COMPRESSED: "MAPI_RTF_COMPRESSED",
931 | MAPI_RTF_SYNC_PREFIX_COUNT: "MAPI_RTF_SYNC_PREFIX_COUNT",
932 | MAPI_RTF_SYNC_TRAILING_COUNT: "MAPI_RTF_SYNC_TRAILING_COUNT",
933 | MAPI_ORIGINALLY_INTENDED_RECIP_ENTRYID: "MAPI_ORIGINALLY_INTENDED_RECIP_ENTRYID",
934 | MAPI_BODY_HTML: "MAPI_BODY_HTML",
935 | MAPI_NATIVE_BODY: "MAPI_NATIVE_BODY",
936 | MAPI_SMTP_MESSAGE_ID: "MAPI_SMTP_MESSAGE_ID",
937 | MAPI_INTERNET_REFERENCES: "MAPI_INTERNET_REFERENCES",
938 | MAPI_IN_REPLY_TO_ID: "MAPI_IN_REPLY_TO_ID",
939 | MAPI_INTERNET_RETURN_PATH: "MAPI_INTERNET_RETURN_PATH",
940 | MAPI_ICON_INDEX: "MAPI_ICON_INDEX",
941 | MAPI_LAST_VERB_EXECUTED: "MAPI_LAST_VERB_EXECUTED",
942 | MAPI_LAST_VERB_EXECUTION_TIME: "MAPI_LAST_VERB_EXECUTION_TIME",
943 | MAPI_URL_COMP_NAME: "MAPI_URL_COMP_NAME",
944 | MAPI_ATTRIBUTE_HIDDEN: "MAPI_ATTRIBUTE_HIDDEN",
945 | MAPI_ATTRIBUTE_SYSTEM: "MAPI_ATTRIBUTE_SYSTEM",
946 | MAPI_ATTRIBUTE_READ_ONLY: "MAPI_ATTRIBUTE_READ_ONLY",
947 | MAPI_ROWID: "MAPI_ROWID",
948 | MAPI_DISPLAY_NAME: "MAPI_DISPLAY_NAME",
949 | MAPI_ADDRTYPE: "MAPI_ADDRTYPE",
950 | MAPI_EMAIL_ADDRESS: "MAPI_EMAIL_ADDRESS",
951 | MAPI_COMMENT: "MAPI_COMMENT",
952 | MAPI_DEPTH: "MAPI_DEPTH",
953 | MAPI_PROVIDER_DISPLAY: "MAPI_PROVIDER_DISPLAY",
954 | MAPI_CREATION_TIME: "MAPI_CREATION_TIME",
955 | MAPI_LAST_MODIFICATION_TIME: "MAPI_LAST_MODIFICATION_TIME",
956 | MAPI_RESOURCE_FLAGS: "MAPI_RESOURCE_FLAGS",
957 | MAPI_PROVIDER_DLL_NAME: "MAPI_PROVIDER_DLL_NAME",
958 | MAPI_SEARCH_KEY: "MAPI_SEARCH_KEY",
959 | MAPI_PROVIDER_UID: "MAPI_PROVIDER_UID",
960 | MAPI_PROVIDER_ORDINAL: "MAPI_PROVIDER_ORDINAL",
961 | MAPI_TARGET_ENTRY_ID: "MAPI_TARGET_ENTRY_ID",
962 | MAPI_CONVERSATION_ID: "MAPI_CONVERSATION_ID",
963 | MAPI_CONVERSATION_INDEX_TRACKING: "MAPI_CONVERSATION_INDEX_TRACKING",
964 | MAPI_FORM_VERSION: "MAPI_FORM_VERSION",
965 | MAPI_FORM_CLSID: "MAPI_FORM_CLSID",
966 | MAPI_FORM_CONTACT_NAME: "MAPI_FORM_CONTACT_NAME",
967 | MAPI_FORM_CATEGORY: "MAPI_FORM_CATEGORY",
968 | MAPI_FORM_CATEGORY_SUB: "MAPI_FORM_CATEGORY_SUB",
969 | MAPI_FORM_HOST_MAP: "MAPI_FORM_HOST_MAP",
970 | MAPI_FORM_HIDDEN: "MAPI_FORM_HIDDEN",
971 | MAPI_FORM_DESIGNER_NAME: "MAPI_FORM_DESIGNER_NAME",
972 | MAPI_FORM_DESIGNER_GUID: "MAPI_FORM_DESIGNER_GUID",
973 | MAPI_FORM_MESSAGE_BEHAVIOR: "MAPI_FORM_MESSAGE_BEHAVIOR",
974 | MAPI_DEFAULT_STORE: "MAPI_DEFAULT_STORE",
975 | MAPI_STORE_SUPPORT_MASK: "MAPI_STORE_SUPPORT_MASK",
976 | MAPI_STORE_STATE: "MAPI_STORE_STATE",
977 | MAPI_STORE_UNICODE_MASK: "MAPI_STORE_UNICODE_MASK",
978 | MAPI_IPM_SUBTREE_SEARCH_KEY: "MAPI_IPM_SUBTREE_SEARCH_KEY",
979 | MAPI_IPM_OUTBOX_SEARCH_KEY: "MAPI_IPM_OUTBOX_SEARCH_KEY",
980 | MAPI_IPM_WASTEBASKET_SEARCH_KEY: "MAPI_IPM_WASTEBASKET_SEARCH_KEY",
981 | MAPI_IPM_SENTMAIL_SEARCH_KEY: "MAPI_IPM_SENTMAIL_SEARCH_KEY",
982 | MAPI_MDB_PROVIDER: "MAPI_MDB_PROVIDER",
983 | MAPI_RECEIVE_FOLDER_SETTINGS: "MAPI_RECEIVE_FOLDER_SETTINGS",
984 | MAPI_VALID_FOLDER_MASK: "MAPI_VALID_FOLDER_MASK",
985 | MAPI_IPM_SUBTREE_ENTRYID: "MAPI_IPM_SUBTREE_ENTRYID",
986 | MAPI_IPM_OUTBOX_ENTRYID: "MAPI_IPM_OUTBOX_ENTRYID",
987 | MAPI_IPM_WASTEBASKET_ENTRYID: "MAPI_IPM_WASTEBASKET_ENTRYID",
988 | MAPI_IPM_SENTMAIL_ENTRYID: "MAPI_IPM_SENTMAIL_ENTRYID",
989 | MAPI_VIEWS_ENTRYID: "MAPI_VIEWS_ENTRYID",
990 | MAPI_COMMON_VIEWS_ENTRYID: "MAPI_COMMON_VIEWS_ENTRYID",
991 | MAPI_FINDER_ENTRYID: "MAPI_FINDER_ENTRYID",
992 | MAPI_CONTAINER_FLAGS: "MAPI_CONTAINER_FLAGS",
993 | MAPI_FOLDER_TYPE: "MAPI_FOLDER_TYPE",
994 | MAPI_CONTENT_COUNT: "MAPI_CONTENT_COUNT",
995 | MAPI_CONTENT_UNREAD: "MAPI_CONTENT_UNREAD",
996 | MAPI_CREATE_TEMPLATES: "MAPI_CREATE_TEMPLATES",
997 | MAPI_DETAILS_TABLE: "MAPI_DETAILS_TABLE",
998 | MAPI_SEARCH: "MAPI_SEARCH",
999 | MAPI_SELECTABLE: "MAPI_SELECTABLE",
1000 | MAPI_SUBFOLDERS: "MAPI_SUBFOLDERS",
1001 | MAPI_STATUS: "MAPI_STATUS",
1002 | MAPI_ANR: "MAPI_ANR",
1003 | MAPI_CONTENTS_SORT_ORDER: "MAPI_CONTENTS_SORT_ORDER",
1004 | MAPI_CONTAINER_HIERARCHY: "MAPI_CONTAINER_HIERARCHY",
1005 | MAPI_CONTAINER_CONTENTS: "MAPI_CONTAINER_CONTENTS",
1006 | MAPI_FOLDER_ASSOCIATED_CONTENTS: "MAPI_FOLDER_ASSOCIATED_CONTENTS",
1007 | MAPI_DEF_CREATE_DL: "MAPI_DEF_CREATE_DL",
1008 | MAPI_DEF_CREATE_MAILUSER: "MAPI_DEF_CREATE_MAILUSER",
1009 | MAPI_CONTAINER_CLASS: "MAPI_CONTAINER_CLASS",
1010 | MAPI_CONTAINER_MODIFY_VERSION: "MAPI_CONTAINER_MODIFY_VERSION",
1011 | MAPI_AB_PROVIDER_ID: "MAPI_AB_PROVIDER_ID",
1012 | MAPI_DEFAULT_VIEW_ENTRYID: "MAPI_DEFAULT_VIEW_ENTRYID",
1013 | MAPI_ASSOC_CONTENT_COUNT: "MAPI_ASSOC_CONTENT_COUNT",
1014 | MAPI_ATTACHMENT_X400_PARAMETERS: "MAPI_ATTACHMENT_X400_PARAMETERS",
1015 | MAPI_ATTACH_DATA_OBJ: "MAPI_ATTACH_DATA_OBJ",
1016 | MAPI_ATTACH_ENCODING: "MAPI_ATTACH_ENCODING",
1017 | MAPI_ATTACH_EXTENSION: "MAPI_ATTACH_EXTENSION",
1018 | MAPI_ATTACH_FILENAME: "MAPI_ATTACH_FILENAME",
1019 | MAPI_ATTACH_METHOD: "MAPI_ATTACH_METHOD",
1020 | MAPI_ATTACH_LONG_FILENAME: "MAPI_ATTACH_LONG_FILENAME",
1021 | MAPI_ATTACH_PATHNAME: "MAPI_ATTACH_PATHNAME",
1022 | MAPI_ATTACH_RENDERING: "MAPI_ATTACH_RENDERING",
1023 | MAPI_ATTACH_TAG: "MAPI_ATTACH_TAG",
1024 | MAPI_RENDERING_POSITION: "MAPI_RENDERING_POSITION",
1025 | MAPI_ATTACH_TRANSPORT_NAME: "MAPI_ATTACH_TRANSPORT_NAME",
1026 | MAPI_ATTACH_LONG_PATHNAME: "MAPI_ATTACH_LONG_PATHNAME",
1027 | MAPI_ATTACH_MIME_TAG: "MAPI_ATTACH_MIME_TAG",
1028 | MAPI_ATTACH_ADDITIONAL_INFO: "MAPI_ATTACH_ADDITIONAL_INFO",
1029 | MAPI_ATTACH_MIME_SEQUENCE: "MAPI_ATTACH_MIME_SEQUENCE",
1030 | MAPI_ATTACH_CONTENT_ID: "MAPI_ATTACH_CONTENT_ID",
1031 | MAPI_ATTACH_CONTENT_LOCATION: "MAPI_ATTACH_CONTENT_LOCATION",
1032 | MAPI_ATTACH_FLAGS: "MAPI_ATTACH_FLAGS",
1033 | MAPI_DISPLAY_TYPE: "MAPI_DISPLAY_TYPE",
1034 | MAPI_TEMPLATEID: "MAPI_TEMPLATEID",
1035 | MAPI_PRIMARY_CAPABILITY: "MAPI_PRIMARY_CAPABILITY",
1036 | MAPI_SMTP_ADDRESS: "MAPI_SMTP_ADDRESS",
1037 | MAPI_7BIT_DISPLAY_NAME: "MAPI_7BIT_DISPLAY_NAME",
1038 | MAPI_ACCOUNT: "MAPI_ACCOUNT",
1039 | MAPI_ALTERNATE_RECIPIENT: "MAPI_ALTERNATE_RECIPIENT",
1040 | MAPI_CALLBACK_TELEPHONE_NUMBER: "MAPI_CALLBACK_TELEPHONE_NUMBER",
1041 | MAPI_CONVERSION_PROHIBITED: "MAPI_CONVERSION_PROHIBITED",
1042 | MAPI_DISCLOSE_RECIPIENTS: "MAPI_DISCLOSE_RECIPIENTS",
1043 | MAPI_GENERATION: "MAPI_GENERATION",
1044 | MAPI_GIVEN_NAME: "MAPI_GIVEN_NAME",
1045 | MAPI_GOVERNMENT_ID_NUMBER: "MAPI_GOVERNMENT_ID_NUMBER",
1046 | MAPI_BUSINESS_TELEPHONE_NUMBER: "MAPI_BUSINESS_TELEPHONE_NUMBER",
1047 | MAPI_HOME_TELEPHONE_NUMBER: "MAPI_HOME_TELEPHONE_NUMBER",
1048 | MAPI_INITIALS: "MAPI_INITIALS",
1049 | MAPI_KEYWORD: "MAPI_KEYWORD",
1050 | MAPI_LANGUAGE: "MAPI_LANGUAGE",
1051 | MAPI_LOCATION: "MAPI_LOCATION",
1052 | MAPI_MAIL_PERMISSION: "MAPI_MAIL_PERMISSION",
1053 | MAPI_MHS_COMMON_NAME: "MAPI_MHS_COMMON_NAME",
1054 | MAPI_ORGANIZATIONAL_ID_NUMBER: "MAPI_ORGANIZATIONAL_ID_NUMBER",
1055 | MAPI_SURNAME: "MAPI_SURNAME",
1056 | MAPI_ORIGINAL_ENTRYID: "MAPI_ORIGINAL_ENTRYID",
1057 | MAPI_ORIGINAL_DISPLAY_NAME: "MAPI_ORIGINAL_DISPLAY_NAME",
1058 | MAPI_ORIGINAL_SEARCH_KEY: "MAPI_ORIGINAL_SEARCH_KEY",
1059 | MAPI_POSTAL_ADDRESS: "MAPI_POSTAL_ADDRESS",
1060 | MAPI_COMPANY_NAME: "MAPI_COMPANY_NAME",
1061 | MAPI_TITLE: "MAPI_TITLE",
1062 | MAPI_DEPARTMENT_NAME: "MAPI_DEPARTMENT_NAME",
1063 | MAPI_OFFICE_LOCATION: "MAPI_OFFICE_LOCATION",
1064 | MAPI_PRIMARY_TELEPHONE_NUMBER: "MAPI_PRIMARY_TELEPHONE_NUMBER",
1065 | MAPI_BUSINESS2_TELEPHONE_NUMBER: "MAPI_BUSINESS2_TELEPHONE_NUMBER",
1066 | MAPI_MOBILE_TELEPHONE_NUMBER: "MAPI_MOBILE_TELEPHONE_NUMBER",
1067 | MAPI_RADIO_TELEPHONE_NUMBER: "MAPI_RADIO_TELEPHONE_NUMBER",
1068 | MAPI_CAR_TELEPHONE_NUMBER: "MAPI_CAR_TELEPHONE_NUMBER",
1069 | MAPI_OTHER_TELEPHONE_NUMBER: "MAPI_OTHER_TELEPHONE_NUMBER",
1070 | MAPI_TRANSMITABLE_DISPLAY_NAME: "MAPI_TRANSMITABLE_DISPLAY_NAME",
1071 | MAPI_PAGER_TELEPHONE_NUMBER: "MAPI_PAGER_TELEPHONE_NUMBER",
1072 | MAPI_USER_CERTIFICATE: "MAPI_USER_CERTIFICATE",
1073 | MAPI_PRIMARY_FAX_NUMBER: "MAPI_PRIMARY_FAX_NUMBER",
1074 | MAPI_BUSINESS_FAX_NUMBER: "MAPI_BUSINESS_FAX_NUMBER",
1075 | MAPI_HOME_FAX_NUMBER: "MAPI_HOME_FAX_NUMBER",
1076 | MAPI_COUNTRY: "MAPI_COUNTRY",
1077 | MAPI_LOCALITY: "MAPI_LOCALITY",
1078 | MAPI_STATE_OR_PROVINCE: "MAPI_STATE_OR_PROVINCE",
1079 | MAPI_STREET_ADDRESS: "MAPI_STREET_ADDRESS",
1080 | MAPI_POSTAL_CODE: "MAPI_POSTAL_CODE",
1081 | MAPI_POST_OFFICE_BOX: "MAPI_POST_OFFICE_BOX",
1082 | MAPI_TELEX_NUMBER: "MAPI_TELEX_NUMBER",
1083 | MAPI_ISDN_NUMBER: "MAPI_ISDN_NUMBER",
1084 | MAPI_ASSISTANT_TELEPHONE_NUMBER: "MAPI_ASSISTANT_TELEPHONE_NUMBER",
1085 | MAPI_HOME2_TELEPHONE_NUMBER: "MAPI_HOME2_TELEPHONE_NUMBER",
1086 | MAPI_ASSISTANT: "MAPI_ASSISTANT",
1087 | MAPI_SEND_RICH_INFO: "MAPI_SEND_RICH_INFO",
1088 | MAPI_WEDDING_ANNIVERSARY: "MAPI_WEDDING_ANNIVERSARY",
1089 | MAPI_BIRTHDAY: "MAPI_BIRTHDAY",
1090 | MAPI_HOBBIES: "MAPI_HOBBIES",
1091 | MAPI_MIDDLE_NAME: "MAPI_MIDDLE_NAME",
1092 | MAPI_DISPLAY_NAME_PREFIX: "MAPI_DISPLAY_NAME_PREFIX",
1093 | MAPI_PROFESSION: "MAPI_PROFESSION",
1094 | MAPI_PREFERRED_BY_NAME: "MAPI_PREFERRED_BY_NAME",
1095 | MAPI_SPOUSE_NAME: "MAPI_SPOUSE_NAME",
1096 | MAPI_COMPUTER_NETWORK_NAME: "MAPI_COMPUTER_NETWORK_NAME",
1097 | MAPI_CUSTOMER_ID: "MAPI_CUSTOMER_ID",
1098 | MAPI_TTYTDD_PHONE_NUMBER: "MAPI_TTYTDD_PHONE_NUMBER",
1099 | MAPI_FTP_SITE: "MAPI_FTP_SITE",
1100 | MAPI_GENDER: "MAPI_GENDER",
1101 | MAPI_MANAGER_NAME: "MAPI_MANAGER_NAME",
1102 | MAPI_NICKNAME: "MAPI_NICKNAME",
1103 | MAPI_PERSONAL_HOME_PAGE: "MAPI_PERSONAL_HOME_PAGE",
1104 | MAPI_BUSINESS_HOME_PAGE: "MAPI_BUSINESS_HOME_PAGE",
1105 | MAPI_CONTACT_VERSION: "MAPI_CONTACT_VERSION",
1106 | MAPI_CONTACT_ENTRYIDS: "MAPI_CONTACT_ENTRYIDS",
1107 | MAPI_CONTACT_ADDRTYPES: "MAPI_CONTACT_ADDRTYPES",
1108 | MAPI_CONTACT_DEFAULT_ADDRESS_INDEX: "MAPI_CONTACT_DEFAULT_ADDRESS_INDEX",
1109 | MAPI_CONTACT_EMAIL_ADDRESSES: "MAPI_CONTACT_EMAIL_ADDRESSES",
1110 | MAPI_COMPANY_MAIN_PHONE_NUMBER: "MAPI_COMPANY_MAIN_PHONE_NUMBER",
1111 | MAPI_CHILDRENS_NAMES: "MAPI_CHILDRENS_NAMES",
1112 | MAPI_HOME_ADDRESS_CITY: "MAPI_HOME_ADDRESS_CITY",
1113 | MAPI_HOME_ADDRESS_COUNTRY: "MAPI_HOME_ADDRESS_COUNTRY",
1114 | MAPI_HOME_ADDRESS_POSTAL_CODE: "MAPI_HOME_ADDRESS_POSTAL_CODE",
1115 | MAPI_HOME_ADDRESS_STATE_OR_PROVINCE: "MAPI_HOME_ADDRESS_STATE_OR_PROVINCE",
1116 | MAPI_HOME_ADDRESS_STREET: "MAPI_HOME_ADDRESS_STREET",
1117 | MAPI_HOME_ADDRESS_POST_OFFICE_BOX: "MAPI_HOME_ADDRESS_POST_OFFICE_BOX",
1118 | MAPI_OTHER_ADDRESS_CITY: "MAPI_OTHER_ADDRESS_CITY",
1119 | MAPI_OTHER_ADDRESS_COUNTRY: "MAPI_OTHER_ADDRESS_COUNTRY",
1120 | MAPI_OTHER_ADDRESS_POSTAL_CODE: "MAPI_OTHER_ADDRESS_POSTAL_CODE",
1121 | MAPI_OTHER_ADDRESS_STATE_OR_PROVINCE: "MAPI_OTHER_ADDRESS_STATE_OR_PROVINCE",
1122 | MAPI_OTHER_ADDRESS_STREET: "MAPI_OTHER_ADDRESS_STREET",
1123 | MAPI_OTHER_ADDRESS_POST_OFFICE_BOX: "MAPI_OTHER_ADDRESS_POST_OFFICE_BOX",
1124 | MAPI_SEND_INTERNET_ENCODING: "MAPI_SEND_INTERNET_ENCODING",
1125 | MAPI_STORE_PROVIDERS: "MAPI_STORE_PROVIDERS",
1126 | MAPI_AB_PROVIDERS: "MAPI_AB_PROVIDERS",
1127 | MAPI_TRANSPORT_PROVIDERS: "MAPI_TRANSPORT_PROVIDERS",
1128 | MAPI_DEFAULT_PROFILE: "MAPI_DEFAULT_PROFILE",
1129 | MAPI_AB_SEARCH_PATH: "MAPI_AB_SEARCH_PATH",
1130 | MAPI_AB_DEFAULT_DIR: "MAPI_AB_DEFAULT_DIR",
1131 | MAPI_AB_DEFAULT_PAB: "MAPI_AB_DEFAULT_PAB",
1132 | MAPI_FILTERING_HOOKS: "MAPI_FILTERING_HOOKS",
1133 | MAPI_SERVICE_NAME: "MAPI_SERVICE_NAME",
1134 | MAPI_SERVICE_DLL_NAME: "MAPI_SERVICE_DLL_NAME",
1135 | MAPI_SERVICE_ENTRY_NAME: "MAPI_SERVICE_ENTRY_NAME",
1136 | MAPI_SERVICE_UID: "MAPI_SERVICE_UID",
1137 | MAPI_SERVICE_EXTRA_UIDS: "MAPI_SERVICE_EXTRA_UIDS",
1138 | MAPI_SERVICES: "MAPI_SERVICES",
1139 | MAPI_SERVICE_SUPPORT_FILES: "MAPI_SERVICE_SUPPORT_FILES",
1140 | MAPI_SERVICE_DELETE_FILES: "MAPI_SERVICE_DELETE_FILES",
1141 | MAPI_AB_SEARCH_PATH_UPDATE: "MAPI_AB_SEARCH_PATH_UPDATE",
1142 | MAPI_PROFILE_NAME: "MAPI_PROFILE_NAME",
1143 | MAPI_IDENTITY_DISPLAY: "MAPI_IDENTITY_DISPLAY",
1144 | MAPI_IDENTITY_ENTRYID: "MAPI_IDENTITY_ENTRYID",
1145 | MAPI_RESOURCE_METHODS: "MAPI_RESOURCE_METHODS",
1146 | MAPI_RESOURCE_TYPE: "MAPI_RESOURCE_TYPE",
1147 | MAPI_STATUS_CODE: "MAPI_STATUS_CODE",
1148 | MAPI_IDENTITY_SEARCH_KEY: "MAPI_IDENTITY_SEARCH_KEY",
1149 | MAPI_OWN_STORE_ENTRYID: "MAPI_OWN_STORE_ENTRYID",
1150 | MAPI_RESOURCE_PATH: "MAPI_RESOURCE_PATH",
1151 | MAPI_STATUS_STRING: "MAPI_STATUS_STRING",
1152 | MAPI_X400_DEFERRED_DELIVERY_CANCEL: "MAPI_X400_DEFERRED_DELIVERY_CANCEL",
1153 | MAPI_HEADER_FOLDER_ENTRYID: "MAPI_HEADER_FOLDER_ENTRYID",
1154 | MAPI_REMOTE_PROGRESS: "MAPI_REMOTE_PROGRESS",
1155 | MAPI_REMOTE_PROGRESS_TEXT: "MAPI_REMOTE_PROGRESS_TEXT",
1156 | MAPI_REMOTE_VALIDATE_OK: "MAPI_REMOTE_VALIDATE_OK",
1157 | MAPI_CONTROL_FLAGS: "MAPI_CONTROL_FLAGS",
1158 | MAPI_CONTROL_STRUCTURE: "MAPI_CONTROL_STRUCTURE",
1159 | MAPI_CONTROL_TYPE: "MAPI_CONTROL_TYPE",
1160 | MAPI_DELTAX: "MAPI_DELTAX",
1161 | MAPI_DELTAY: "MAPI_DELTAY",
1162 | MAPI_XPOS: "MAPI_XPOS",
1163 | MAPI_YPOS: "MAPI_YPOS",
1164 | MAPI_CONTROL_ID: "MAPI_CONTROL_ID",
1165 | MAPI_INITIAL_DETAILS_PANE: "MAPI_INITIAL_DETAILS_PANE",
1166 | MAPI_UNCOMPRESSED_BODY: "MAPI_UNCOMPRESSED_BODY",
1167 | MAPI_INTERNET_CODEPAGE: "MAPI_INTERNET_CODEPAGE",
1168 | MAPI_AUTO_RESPONSE_SUPPRESS: "MAPI_AUTO_RESPONSE_SUPPRESS",
1169 | MAPI_MESSAGE_LOCALE_ID: "MAPI_MESSAGE_LOCALE_ID",
1170 | MAPI_RULE_TRIGGER_HISTORY: "MAPI_RULE_TRIGGER_HISTORY",
1171 | MAPI_MOVE_TO_STORE_ENTRYID: "MAPI_MOVE_TO_STORE_ENTRYID",
1172 | MAPI_MOVE_TO_FOLDER_ENTRYID: "MAPI_MOVE_TO_FOLDER_ENTRYID",
1173 | MAPI_STORAGE_QUOTA_LIMIT: "MAPI_STORAGE_QUOTA_LIMIT",
1174 | MAPI_EXCESS_STORAGE_USED: "MAPI_EXCESS_STORAGE_USED",
1175 | MAPI_SVR_GENERATING_QUOTA_MSG: "MAPI_SVR_GENERATING_QUOTA_MSG",
1176 | MAPI_CREATOR_NAME: "MAPI_CREATOR_NAME",
1177 | MAPI_CREATOR_ENTRY_ID: "MAPI_CREATOR_ENTRY_ID",
1178 | MAPI_LAST_MODIFIER_NAME: "MAPI_LAST_MODIFIER_NAME",
1179 | MAPI_LAST_MODIFIER_ENTRY_ID: "MAPI_LAST_MODIFIER_ENTRY_ID",
1180 | MAPI_REPLY_RECIPIENT_SMTP_PROXIES: "MAPI_REPLY_RECIPIENT_SMTP_PROXIES",
1181 | MAPI_MESSAGE_CODEPAGE: "MAPI_MESSAGE_CODEPAGE",
1182 | MAPI_EXTENDED_ACL_DATA: "MAPI_EXTENDED_ACL_DATA",
1183 | MAPI_SENDER_FLAGS: "MAPI_SENDER_FLAGS",
1184 | MAPI_SENT_REPRESENTING_FLAGS: "MAPI_SENT_REPRESENTING_FLAGS",
1185 | MAPI_RECEIVED_BY_FLAGS: "MAPI_RECEIVED_BY_FLAGS",
1186 | MAPI_RECEIVED_REPRESENTING_FLAGS: "MAPI_RECEIVED_REPRESENTING_FLAGS",
1187 | MAPI_CREATOR_ADDRESS_TYPE: "MAPI_CREATOR_ADDRESS_TYPE",
1188 | MAPI_CREATOR_EMAIL_ADDRESS: "MAPI_CREATOR_EMAIL_ADDRESS",
1189 | MAPI_SENDER_SIMPLE_DISPLAY_NAME: "MAPI_SENDER_SIMPLE_DISPLAY_NAME",
1190 | MAPI_SENT_REPRESENTING_SIMPLE_DISPLAY_NAME: "MAPI_SENT_REPRESENTING_SIMPLE_DISPLAY_NAME",
1191 | MAPI_RECEIVED_REPRESENTING_SIMPLE_DISPLAY_NAME: "MAPI_RECEIVED_REPRESENTING_SIMPLE_DISPLAY_NAME",
1192 | MAPI_CREATOR_SIMPLE_DISP_NAME: "MAPI_CREATOR_SIMPLE_DISP_NAME",
1193 | MAPI_LAST_MODIFIER_SIMPLE_DISPLAY_NAME: "MAPI_LAST_MODIFIER_SIMPLE_DISPLAY_NAME",
1194 | MAPI_CONTENT_FILTER_SPAM_CONFIDENCE_LEVEL: "MAPI_CONTENT_FILTER_SPAM_CONFIDENCE_LEVEL",
1195 | MAPI_INTERNET_MAIL_OVERRIDE_FORMAT: "MAPI_INTERNET_MAIL_OVERRIDE_FORMAT",
1196 | MAPI_MESSAGE_EDITOR_FORMAT: "MAPI_MESSAGE_EDITOR_FORMAT",
1197 | MAPI_SENDER_SMTP_ADDRESS: "MAPI_SENDER_SMTP_ADDRESS",
1198 | MAPI_SENT_REPRESENTING_SMTP_ADDRESS: "MAPI_SENT_REPRESENTING_SMTP_ADDRESS",
1199 | MAPI_READ_RECEIPT_SMTP_ADDRESS: "MAPI_READ_RECEIPT_SMTP_ADDRESS",
1200 | MAPI_RECEIVED_BY_SMTP_ADDRESS: "MAPI_RECEIVED_BY_SMTP_ADDRESS",
1201 | MAPI_RECEIVED_REPRESENTING_SMTP_ADDRESS: "MAPI_RECEIVED_REPRESENTING_SMTP_ADDRESS",
1202 | MAPI_SENDING_SMTP_ADDRESS: "MAPI_SENDING_SMTP_ADDRESS",
1203 | MAPI_SIP_ADDRESS: "MAPI_SIP_ADDRESS",
1204 | MAPI_RECIPIENT_DISPLAY_NAME: "MAPI_RECIPIENT_DISPLAY_NAME",
1205 | MAPI_RECIPIENT_ENTRYID: "MAPI_RECIPIENT_ENTRYID",
1206 | MAPI_RECIPIENT_FLAGS: "MAPI_RECIPIENT_FLAGS",
1207 | MAPI_RECIPIENT_TRACKSTATUS: "MAPI_RECIPIENT_TRACKSTATUS",
1208 | MAPI_CHANGE_KEY: "MAPI_CHANGE_KEY",
1209 | MAPI_PREDECESSOR_CHANGE_LIST: "MAPI_PREDECESSOR_CHANGE_LIST",
1210 | MAPI_ID_SECURE_MIN: "MAPI_ID_SECURE_MIN",
1211 | MAPI_ID_SECURE_MAX: "MAPI_ID_SECURE_MAX",
1212 | MAPI_VOICE_MESSAGE_DURATION: "MAPI_VOICE_MESSAGE_DURATION",
1213 | MAPI_SENDER_TELEPHONE_NUMBER: "MAPI_SENDER_TELEPHONE_NUMBER",
1214 | MAPI_VOICE_MESSAGE_SENDER_NAME: "MAPI_VOICE_MESSAGE_SENDER_NAME",
1215 | MAPI_FAX_NUMBER_OF_PAGES: "MAPI_FAX_NUMBER_OF_PAGES",
1216 | MAPI_VOICE_MESSAGE_ATTACHMENT_ORDER: "MAPI_VOICE_MESSAGE_ATTACHMENT_ORDER",
1217 | MAPI_CALL_ID: "MAPI_CALL_ID",
1218 | MAPI_ATTACHMENT_LINK_ID: "MAPI_ATTACHMENT_LINK_ID",
1219 | MAPI_EXCEPTION_START_TIME: "MAPI_EXCEPTION_START_TIME",
1220 | MAPI_EXCEPTION_END_TIME: "MAPI_EXCEPTION_END_TIME",
1221 | MAPI_ATTACHMENT_FLAGS: "MAPI_ATTACHMENT_FLAGS",
1222 | MAPI_ATTACHMENT_HIDDEN: "MAPI_ATTACHMENT_HIDDEN",
1223 | MAPI_ATTACHMENT_CONTACT_PHOTO: "MAPI_ATTACHMENT_CONTACT_PHOTO",
1224 | MAPI_FILE_UNDER: "MAPI_FILE_UNDER",
1225 | MAPI_FILE_UNDER_ID: "MAPI_FILE_UNDER_ID",
1226 | MAPI_CONTACT_ITEM_DATA: "MAPI_CONTACT_ITEM_DATA",
1227 | MAPI_REFERRED_BY: "MAPI_REFERRED_BY",
1228 | MAPI_DEPARTMENT: "MAPI_DEPARTMENT",
1229 | MAPI_HAS_PICTURE: "MAPI_HAS_PICTURE",
1230 | MAPI_HOME_ADDRESS: "MAPI_HOME_ADDRESS",
1231 | MAPI_WORK_ADDRESS: "MAPI_WORK_ADDRESS",
1232 | MAPI_OTHER_ADDRESS: "MAPI_OTHER_ADDRESS",
1233 | MAPI_POSTAL_ADDRESS_ID: "MAPI_POSTAL_ADDRESS_ID",
1234 | MAPI_CONTACT_CHARACTER_SET: "MAPI_CONTACT_CHARACTER_SET",
1235 | MAPI_AUTO_LOG: "MAPI_AUTO_LOG",
1236 | MAPI_FILE_UNDER_LIST: "MAPI_FILE_UNDER_LIST",
1237 | MAPI_EMAIL_LIST: "MAPI_EMAIL_LIST",
1238 | MAPI_ADDRESS_BOOK_PROVIDER_EMAIL_LIST: "MAPI_ADDRESS_BOOK_PROVIDER_EMAIL_LIST",
1239 | MAPI_ADDRESS_BOOK_PROVIDER_ARRAY_TYPE: "MAPI_ADDRESS_BOOK_PROVIDER_ARRAY_TYPE",
1240 | MAPI_HTML: "MAPI_HTML",
1241 | MAPI_YOMI_FIRST_NAME: "MAPI_YOMI_FIRST_NAME",
1242 | MAPI_YOMI_LAST_NAME: "MAPI_YOMI_LAST_NAME",
1243 | MAPI_YOMI_COMPANY_NAME: "MAPI_YOMI_COMPANY_NAME",
1244 | MAPI_BUSINESS_CARD_DISPLAY_DEFINITION: "MAPI_BUSINESS_CARD_DISPLAY_DEFINITION",
1245 | MAPI_BUSINESS_CARD_CARD_PICTURE: "MAPI_BUSINESS_CARD_CARD_PICTURE",
1246 | MAPI_WORK_ADDRESS_STREET: "MAPI_WORK_ADDRESS_STREET",
1247 | MAPI_WORK_ADDRESS_CITY: "MAPI_WORK_ADDRESS_CITY",
1248 | MAPI_WORK_ADDRESS_STATE: "MAPI_WORK_ADDRESS_STATE",
1249 | MAPI_WORK_ADDRESS_POSTAL_CODE: "MAPI_WORK_ADDRESS_POSTAL_CODE",
1250 | MAPI_WORK_ADDRESS_COUNTRY: "MAPI_WORK_ADDRESS_COUNTRY",
1251 | MAPI_WORK_ADDRESS_POST_OFFICE_BOX: "MAPI_WORK_ADDRESS_POST_OFFICE_BOX",
1252 | MAPI_DISTRIBUTION_LIST_CHECKSUM: "MAPI_DISTRIBUTION_LIST_CHECKSUM",
1253 | MAPI_BIRTHDAY_EVENT_ENTRY_ID: "MAPI_BIRTHDAY_EVENT_ENTRY_ID",
1254 | MAPI_ANNIVERSARY_EVENT_ENTRY_ID: "MAPI_ANNIVERSARY_EVENT_ENTRY_ID",
1255 | MAPI_CONTACT_USER_FIELD1: "MAPI_CONTACT_USER_FIELD1",
1256 | MAPI_CONTACT_USER_FIELD2: "MAPI_CONTACT_USER_FIELD2",
1257 | MAPI_CONTACT_USER_FIELD3: "MAPI_CONTACT_USER_FIELD3",
1258 | MAPI_CONTACT_USER_FIELD4: "MAPI_CONTACT_USER_FIELD4",
1259 | MAPI_DISTRIBUTION_LIST_NAME: "MAPI_DISTRIBUTION_LIST_NAME",
1260 | MAPI_DISTRIBUTION_LIST_ONE_OFF_MEMBERS: "MAPI_DISTRIBUTION_LIST_ONE_OFF_MEMBERS",
1261 | MAPI_DISTRIBUTION_LIST_MEMBERS: "MAPI_DISTRIBUTION_LIST_MEMBERS",
1262 | MAPI_INSTANT_MESSAGING_ADDRESS: "MAPI_INSTANT_MESSAGING_ADDRESS",
1263 | MAPI_DISTRIBUTION_LIST_STREAM: "MAPI_DISTRIBUTION_LIST_STREAM",
1264 | MAPI_EMAIL_DISPLAY_NAME: "MAPI_EMAIL_DISPLAY_NAME",
1265 | MAPI_EMAIL_ADDR_TYPE: "MAPI_EMAIL_ADDR_TYPE",
1266 | MAPI_EMAIL_EMAIL_ADDRESS: "MAPI_EMAIL_EMAIL_ADDRESS",
1267 | MAPI_EMAIL_ORIGINAL_DISPLAY_NAME: "MAPI_EMAIL_ORIGINAL_DISPLAY_NAME",
1268 | MAPI_EMAIL1ORIGINAL_ENTRY_ID: "MAPI_EMAIL1ORIGINAL_ENTRY_ID",
1269 | MAPI_EMAIL1RICH_TEXT_FORMAT: "MAPI_EMAIL1RICH_TEXT_FORMAT",
1270 | MAPI_EMAIL1EMAIL_TYPE: "MAPI_EMAIL1EMAIL_TYPE",
1271 | MAPI_EMAIL2DISPLAY_NAME: "MAPI_EMAIL2DISPLAY_NAME",
1272 | MAPI_EMAIL2ENTRY_ID: "MAPI_EMAIL2ENTRY_ID",
1273 | MAPI_EMAIL2ADDR_TYPE: "MAPI_EMAIL2ADDR_TYPE",
1274 | MAPI_EMAIL2EMAIL_ADDRESS: "MAPI_EMAIL2EMAIL_ADDRESS",
1275 | MAPI_EMAIL2ORIGINAL_DISPLAY_NAME: "MAPI_EMAIL2ORIGINAL_DISPLAY_NAME",
1276 | MAPI_EMAIL2ORIGINAL_ENTRY_ID: "MAPI_EMAIL2ORIGINAL_ENTRY_ID",
1277 | MAPI_EMAIL2RICH_TEXT_FORMAT: "MAPI_EMAIL2RICH_TEXT_FORMAT",
1278 | MAPI_EMAIL3DISPLAY_NAME: "MAPI_EMAIL3DISPLAY_NAME",
1279 | MAPI_EMAIL3ENTRY_ID: "MAPI_EMAIL3ENTRY_ID",
1280 | MAPI_EMAIL3ADDR_TYPE: "MAPI_EMAIL3ADDR_TYPE",
1281 | MAPI_EMAIL3EMAIL_ADDRESS: "MAPI_EMAIL3EMAIL_ADDRESS",
1282 | MAPI_EMAIL3ORIGINAL_DISPLAY_NAME: "MAPI_EMAIL3ORIGINAL_DISPLAY_NAME",
1283 | MAPI_EMAIL3ORIGINAL_ENTRY_ID: "MAPI_EMAIL3ORIGINAL_ENTRY_ID",
1284 | MAPI_EMAIL3RICH_TEXT_FORMAT: "MAPI_EMAIL3RICH_TEXT_FORMAT",
1285 | MAPI_FAX1ADDRESS_TYPE: "MAPI_FAX1ADDRESS_TYPE",
1286 | MAPI_FAX1EMAIL_ADDRESS: "MAPI_FAX1EMAIL_ADDRESS",
1287 | MAPI_FAX1ORIGINAL_DISPLAY_NAME: "MAPI_FAX1ORIGINAL_DISPLAY_NAME",
1288 | MAPI_FAX1ORIGINAL_ENTRY_ID: "MAPI_FAX1ORIGINAL_ENTRY_ID",
1289 | MAPI_FAX2ADDRESS_TYPE: "MAPI_FAX2ADDRESS_TYPE",
1290 | MAPI_FAX2EMAIL_ADDRESS: "MAPI_FAX2EMAIL_ADDRESS",
1291 | MAPI_FAX2ORIGINAL_DISPLAY_NAME: "MAPI_FAX2ORIGINAL_DISPLAY_NAME",
1292 | MAPI_FAX2ORIGINAL_ENTRY_ID: "MAPI_FAX2ORIGINAL_ENTRY_ID",
1293 | MAPI_FAX3ADDRESS_TYPE: "MAPI_FAX3ADDRESS_TYPE",
1294 | MAPI_FAX3EMAIL_ADDRESS: "MAPI_FAX3EMAIL_ADDRESS",
1295 | MAPI_FAX3ORIGINAL_DISPLAY_NAME: "MAPI_FAX3ORIGINAL_DISPLAY_NAME",
1296 | MAPI_FAX3ORIGINAL_ENTRY_ID: "MAPI_FAX3ORIGINAL_ENTRY_ID",
1297 | MAPI_FREE_BUSY_LOCATION: "MAPI_FREE_BUSY_LOCATION",
1298 | MAPI_HOME_ADDRESS_COUNTRY_CODE: "MAPI_HOME_ADDRESS_COUNTRY_CODE",
1299 | MAPI_WORK_ADDRESS_COUNTRY_CODE: "MAPI_WORK_ADDRESS_COUNTRY_CODE",
1300 | MAPI_OTHER_ADDRESS_COUNTRY_CODE: "MAPI_OTHER_ADDRESS_COUNTRY_CODE",
1301 | MAPI_ADDRESS_COUNTRY_CODE: "MAPI_ADDRESS_COUNTRY_CODE",
1302 | MAPI_BIRTHDAY_LOCAL: "MAPI_BIRTHDAY_LOCAL",
1303 | MAPI_WEDDING_ANNIVERSARY_LOCAL: "MAPI_WEDDING_ANNIVERSARY_LOCAL",
1304 | MAPI_TASK_STATUS: "MAPI_TASK_STATUS",
1305 | MAPI_TASK_START_DATE: "MAPI_TASK_START_DATE",
1306 | MAPI_TASK_DUE_DATE: "MAPI_TASK_DUE_DATE",
1307 | MAPI_TASK_ACTUAL_EFFORT: "MAPI_TASK_ACTUAL_EFFORT",
1308 | MAPI_TASK_ESTIMATED_EFFORT: "MAPI_TASK_ESTIMATED_EFFORT",
1309 | MAPI_TASK_FRECUR: "MAPI_TASK_FRECUR",
1310 | MAPI_SEND_MEETING_AS_ICAL: "MAPI_SEND_MEETING_AS_ICAL",
1311 | MAPI_APPOINTMENT_SEQUENCE: "MAPI_APPOINTMENT_SEQUENCE",
1312 | MAPI_APPOINTMENT_SEQUENCE_TIME: "MAPI_APPOINTMENT_SEQUENCE_TIME",
1313 | MAPI_APPOINTMENT_LAST_SEQUENCE: "MAPI_APPOINTMENT_LAST_SEQUENCE",
1314 | MAPI_CHANGE_HIGHLIGHT: "MAPI_CHANGE_HIGHLIGHT",
1315 | MAPI_BUSY_STATUS: "MAPI_BUSY_STATUS",
1316 | MAPI_FEXCEPTIONAL_BODY: "MAPI_FEXCEPTIONAL_BODY",
1317 | MAPI_APPOINTMENT_AUXILIARY_FLAGS: "MAPI_APPOINTMENT_AUXILIARY_FLAGS",
1318 | MAPI_OUTLOOK_LOCATION: "MAPI_OUTLOOK_LOCATION",
1319 | MAPI_MEETING_WORKSPACE_URL: "MAPI_MEETING_WORKSPACE_URL",
1320 | MAPI_FORWARD_INSTANCE: "MAPI_FORWARD_INSTANCE",
1321 | MAPI_LINKED_TASK_ITEMS: "MAPI_LINKED_TASK_ITEMS",
1322 | MAPI_APPT_START_WHOLE: "MAPI_APPT_START_WHOLE",
1323 | MAPI_APPT_END_WHOLE: "MAPI_APPT_END_WHOLE",
1324 | MAPI_APPOINTMENT_START_TIME: "MAPI_APPOINTMENT_START_TIME",
1325 | MAPI_APPOINTMENT_END_TIME: "MAPI_APPOINTMENT_END_TIME",
1326 | MAPI_APPOINTMENT_END_DATE: "MAPI_APPOINTMENT_END_DATE",
1327 | MAPI_APPOINTMENT_START_DATE: "MAPI_APPOINTMENT_START_DATE",
1328 | MAPI_APPT_DURATION: "MAPI_APPT_DURATION",
1329 | MAPI_APPOINTMENT_COLOR: "MAPI_APPOINTMENT_COLOR",
1330 | MAPI_APPOINTMENT_SUB_TYPE: "MAPI_APPOINTMENT_SUB_TYPE",
1331 | MAPI_APPOINTMENT_RECUR: "MAPI_APPOINTMENT_RECUR",
1332 | MAPI_APPOINTMENT_STATE_FLAGS: "MAPI_APPOINTMENT_STATE_FLAGS",
1333 | MAPI_RESPONSE_STATUS: "MAPI_RESPONSE_STATUS",
1334 | MAPI_APPOINTMENT_REPLY_TIME: "MAPI_APPOINTMENT_REPLY_TIME",
1335 | MAPI_RECURRING: "MAPI_RECURRING",
1336 | MAPI_INTENDED_BUSY_STATUS: "MAPI_INTENDED_BUSY_STATUS",
1337 | MAPI_APPOINTMENT_UPDATE_TIME: "MAPI_APPOINTMENT_UPDATE_TIME",
1338 | MAPI_EXCEPTION_REPLACE_TIME: "MAPI_EXCEPTION_REPLACE_TIME",
1339 | MAPI_OWNER_NAME: "MAPI_OWNER_NAME",
1340 | MAPI_APPOINTMENT_REPLY_NAME: "MAPI_APPOINTMENT_REPLY_NAME",
1341 | MAPI_RECURRENCE_TYPE: "MAPI_RECURRENCE_TYPE",
1342 | MAPI_RECURRENCE_PATTERN: "MAPI_RECURRENCE_PATTERN",
1343 | MAPI_TIME_ZONE_STRUCT: "MAPI_TIME_ZONE_STRUCT",
1344 | MAPI_TIME_ZONE_DESCRIPTION: "MAPI_TIME_ZONE_DESCRIPTION",
1345 | MAPI_CLIP_START: "MAPI_CLIP_START",
1346 | MAPI_CLIP_END: "MAPI_CLIP_END",
1347 | MAPI_ORIGINAL_STORE_ENTRY_ID: "MAPI_ORIGINAL_STORE_ENTRY_ID",
1348 | MAPI_ALL_ATTENDEES_STRING: "MAPI_ALL_ATTENDEES_STRING",
1349 | MAPI_AUTO_FILL_LOCATION: "MAPI_AUTO_FILL_LOCATION",
1350 | MAPI_TO_ATTENDEES_STRING: "MAPI_TO_ATTENDEES_STRING",
1351 | MAPI_CCATTENDEES_STRING: "MAPI_CCATTENDEES_STRING",
1352 | MAPI_CONF_CHECK: "MAPI_CONF_CHECK",
1353 | MAPI_CONFERENCING_TYPE: "MAPI_CONFERENCING_TYPE",
1354 | MAPI_DIRECTORY: "MAPI_DIRECTORY",
1355 | MAPI_ORGANIZER_ALIAS: "MAPI_ORGANIZER_ALIAS",
1356 | MAPI_AUTO_START_CHECK: "MAPI_AUTO_START_CHECK",
1357 | MAPI_AUTO_START_WHEN: "MAPI_AUTO_START_WHEN",
1358 | MAPI_ALLOW_EXTERNAL_CHECK: "MAPI_ALLOW_EXTERNAL_CHECK",
1359 | MAPI_COLLABORATE_DOC: "MAPI_COLLABORATE_DOC",
1360 | MAPI_NET_SHOW_URL: "MAPI_NET_SHOW_URL",
1361 | MAPI_ONLINE_PASSWORD: "MAPI_ONLINE_PASSWORD",
1362 | MAPI_APPOINTMENT_PROPOSED_DURATION: "MAPI_APPOINTMENT_PROPOSED_DURATION",
1363 | MAPI_APPT_COUNTER_PROPOSAL: "MAPI_APPT_COUNTER_PROPOSAL",
1364 | MAPI_APPOINTMENT_PROPOSAL_NUMBER: "MAPI_APPOINTMENT_PROPOSAL_NUMBER",
1365 | MAPI_APPOINTMENT_NOT_ALLOW_PROPOSE: "MAPI_APPOINTMENT_NOT_ALLOW_PROPOSE",
1366 | MAPI_APPT_TZDEF_START_DISPLAY: "MAPI_APPT_TZDEF_START_DISPLAY",
1367 | MAPI_APPT_TZDEF_END_DISPLAY: "MAPI_APPT_TZDEF_END_DISPLAY",
1368 | MAPI_APPT_TZDEF_RECUR: "MAPI_APPT_TZDEF_RECUR",
1369 | MAPI_REMINDER_MINUTES_BEFORE_START: "MAPI_REMINDER_MINUTES_BEFORE_START",
1370 | MAPI_REMINDER_TIME: "MAPI_REMINDER_TIME",
1371 | MAPI_REMINDER_SET: "MAPI_REMINDER_SET",
1372 | MAPI_PRIVATE: "MAPI_PRIVATE",
1373 | MAPI_AGING_DONT_AGE_ME: "MAPI_AGING_DONT_AGE_ME",
1374 | MAPI_FORM_STORAGE: "MAPI_FORM_STORAGE",
1375 | MAPI_SIDE_EFFECTS: "MAPI_SIDE_EFFECTS",
1376 | MAPI_REMOTE_STATUS: "MAPI_REMOTE_STATUS",
1377 | MAPI_PAGE_DIR_STREAM: "MAPI_PAGE_DIR_STREAM",
1378 | MAPI_SMART_NO_ATTACH: "MAPI_SMART_NO_ATTACH",
1379 | MAPI_COMMON_START: "MAPI_COMMON_START",
1380 | MAPI_COMMON_END: "MAPI_COMMON_END",
1381 | MAPI_TASK_MODE: "MAPI_TASK_MODE",
1382 | MAPI_FORM_PROP_STREAM: "MAPI_FORM_PROP_STREAM",
1383 | MAPI_REQUEST: "MAPI_REQUEST",
1384 | MAPI_NON_SENDABLE_TO: "MAPI_NON_SENDABLE_TO",
1385 | MAPI_NON_SENDABLE_CC: "MAPI_NON_SENDABLE_CC",
1386 | MAPI_NON_SENDABLE_BCC: "MAPI_NON_SENDABLE_BCC",
1387 | MAPI_COMPANIES: "MAPI_COMPANIES",
1388 | MAPI_CONTACTS: "MAPI_CONTACTS",
1389 | MAPI_PROP_DEF_STREAM: "MAPI_PROP_DEF_STREAM",
1390 | MAPI_SCRIPT_STREAM: "MAPI_SCRIPT_STREAM",
1391 | MAPI_CUSTOM_FLAG: "MAPI_CUSTOM_FLAG",
1392 | MAPI_OUTLOOK_CURRENT_VERSION: "MAPI_OUTLOOK_CURRENT_VERSION",
1393 | MAPI_CURRENT_VERSION_NAME: "MAPI_CURRENT_VERSION_NAME",
1394 | MAPI_REMINDER_NEXT_TIME: "MAPI_REMINDER_NEXT_TIME",
1395 | MAPI_HEADER_ITEM: "MAPI_HEADER_ITEM",
1396 | MAPI_USE_TNEF: "MAPI_USE_TNEF",
1397 | MAPI_TO_DO_TITLE: "MAPI_TO_DO_TITLE",
1398 | MAPI_VALID_FLAG_STRING_PROOF: "MAPI_VALID_FLAG_STRING_PROOF",
1399 | MAPI_LOG_TYPE: "MAPI_LOG_TYPE",
1400 | MAPI_LOG_START: "MAPI_LOG_START",
1401 | MAPI_LOG_DURATION: "MAPI_LOG_DURATION",
1402 | MAPI_LOG_END: "MAPI_LOG_END",
1403 | }
1404 |
--------------------------------------------------------------------------------
/tnefparse/tnef.py:
--------------------------------------------------------------------------------
1 | """extracts TNEF encoded content from for example winmail.dat attachments.
2 | """
3 | import logging
4 | import warnings
5 | from datetime import datetime
6 | from io import BytesIO
7 | from pathlib import Path
8 | from typing import Union
9 | from uuid import UUID
10 | from zipfile import ZipFile, ZIP_DEFLATED, ZIP_STORED
11 |
12 | from . import properties as Attribute
13 | from .codepage import Codepage
14 | from .mapi import decode_mapi, IMESSAGE_SIG, IMESSAGE_SIG_LEN
15 | from .util import typtime, bytes_to_int, checksum, uint32, uint16, uint8
16 |
17 | logger = logging.getLogger(__package__)
18 |
19 |
20 | class TNEFObject:
21 | """a TNEF object that may contain a property and an attachment"""
22 | PTYPE_CLASS = 0x1 # noqa: E221
23 | PTYPE_TIME = 0x3 # noqa: E221
24 | PTYPE_STRING = 0x7 # noqa: E221
25 |
26 | def __init__(self, data, do_checksum=False):
27 | self.length = len(data)
28 | self.level = uint8(data, 0)
29 | self.name = uint16(data, 1)
30 | self.type = uint16(data, 3)
31 | self.length = min(self.length, uint32(data, 5) + 11)
32 | self.data = data[9: self.length - 2]
33 | att_checksum = uint16(data, self.length - 2)
34 |
35 | if do_checksum:
36 | calc_checksum = checksum(self.data)
37 | if calc_checksum != att_checksum:
38 | logger.warning("Checksum: %s != %s", calc_checksum, att_checksum)
39 | else:
40 | calc_checksum = att_checksum
41 |
42 | # whether the checksum is ok
43 | self.good_checksum = calc_checksum == att_checksum
44 |
45 | @property
46 | def name_str(self):
47 | return TNEF.codes.get(self.name)
48 |
49 | def __str__(self):
50 | return f"<{self.__class__.__name__} '{self.name_str}'>"
51 |
52 |
53 | class TNEFAttachment:
54 | """a TNEF attachment"""
55 |
56 | SZMAPI_UNSPECIFIED = 0x0000 # MAPI Unspecified
57 | SZMAPI_NULL = 0x0001 # MAPI null property
58 | SZMAPI_SHORT = 0x0002 # MAPI short (signed 16 bits)
59 | SZMAPI_INT = 0x0003 # MAPI integer (signed 32 bits)
60 | SZMAPI_FLOAT = 0x0004 # MAPI float (4 bytes)
61 | SZMAPI_DOUBLE = 0x0005 # MAPI double
62 | SZMAPI_CURRENCY = 0x0006 # MAPI currency (64 bits)
63 | SZMAPI_APPTIME = 0x0007 # MAPI application time
64 | SZMAPI_ERROR = 0x000A # MAPI error (32 bits)
65 | SZMAPI_BOOLEAN = 0x000B # MAPI boolean (16 bits)
66 | SZMAPI_OBJECT = 0x000D # MAPI embedded object
67 | SZMAPI_INT8BYTE = 0x0014 # MAPI 8 byte signed int
68 | SZMAPI_STRING = 0x001E # MAPI string
69 | SZMAPI_UNICODE_STRING = 0x001F # MAPI unicode-string (null terminated)
70 | SZMAPI_SYSTIME = 0x0040 # MAPI time (64 bits)
71 | SZMAPI_CLSID = 0x0048 # MAPI OLE GUID
72 | SZMAPI_BINARY = 0x0102 # MAPI binary
73 | SZMAPI_BEATS_THE_HELL_OUTTA_ME = 0x0033
74 |
75 | codes = {
76 | SZMAPI_UNSPECIFIED: "MAPI Unspecified",
77 | SZMAPI_NULL: "MAPI null property",
78 | SZMAPI_SHORT: "MAPI short (signed 16 bits)",
79 | SZMAPI_INT: "MAPI integer (signed 32 bits)",
80 | SZMAPI_FLOAT: "MAPI float (4 bytes)",
81 | SZMAPI_DOUBLE: "MAPI double",
82 | SZMAPI_CURRENCY: "MAPI currency (64 bits)",
83 | SZMAPI_APPTIME: "MAPI application time",
84 | SZMAPI_ERROR: "MAPI error (32 bits)",
85 | SZMAPI_BOOLEAN: "MAPI boolean (16 bits)",
86 | SZMAPI_OBJECT: "MAPI embedded object",
87 | SZMAPI_INT8BYTE: "MAPI 8 byte signed int",
88 | SZMAPI_STRING: "MAPI string",
89 | SZMAPI_UNICODE_STRING: "MAPI unicode-string (null terminated)",
90 | # SZMAPI_PT_SYSTIME : "MAPI time (after 2038/01/17 22:14:07 or before 1970/01/01 00:00:00)",
91 | SZMAPI_SYSTIME: "MAPI time (64 bits)",
92 | SZMAPI_CLSID: "MAPI OLE GUID",
93 | SZMAPI_BINARY: "MAPI binary",
94 | SZMAPI_BEATS_THE_HELL_OUTTA_ME: "Unknown",
95 | }
96 |
97 | def __init__(self, codepage):
98 | self.codepage = codepage
99 | self.mapi_attrs = []
100 | self._name = b''
101 | self.data = b''
102 |
103 | @property
104 | def name(self) -> str:
105 | if isinstance(self._name, bytes):
106 | return self._name.decode().strip('\x00')
107 | else:
108 | return self._name.strip('\x00')
109 |
110 | def long_filename(self) -> str:
111 | atname = Attribute.MAPI_ATTACH_LONG_FILENAME
112 | name = [a.data for a in self.mapi_attrs if a.name == atname]
113 | if name:
114 | return name[0]
115 | return self.name or 'unknown.dat'
116 |
117 | def add_attr(self, attribute):
118 | # For now, we ignore rendering/preview properties
119 | if attribute.name == TNEF.ATTATTACHMODIFYDATE:
120 | self.modification_date = typtime(attribute.data)
121 | elif attribute.name == TNEF.ATTATTACHCREATEDATE:
122 | self.creation_date = typtime(attribute.data)
123 | elif attribute.name == TNEF.ATTATTACHMENT:
124 | mapi_attrs = decode_mapi(attribute.data, self.codepage)
125 | for p in mapi_attrs:
126 | if p.name == Attribute.MAPI_ATTACH_FILENAME:
127 | self._name = p.data
128 | elif p.name == Attribute.MAPI_DISPLAY_NAME:
129 | if self.data and not self._name:
130 | self._name = p.data
131 | elif p.name == Attribute.MAPI_ATTACH_DATA_OBJ:
132 | if p.data.startswith(IMESSAGE_SIG):
133 | self.data = p.data[IMESSAGE_SIG_LEN:]
134 | self.embed = TNEF(self.data)
135 | else:
136 | self.data = p.data
137 | elif p.name == Attribute.MAPI_ATTACH_RENDERING:
138 | pass
139 | else:
140 | self.mapi_attrs.append(p)
141 | elif attribute.name == TNEF.ATTATTACHTITLE:
142 | self._name = attribute.data
143 | elif attribute.name == TNEF.ATTATTACHDATA:
144 | self.data = attribute.data
145 | elif attribute.name == TNEF.ATTATTACHRENDDATA:
146 | pass
147 | elif attribute.name == TNEF.ATTATTACHMETAFILE:
148 | pass
149 | # this is a WMF file of some kind
150 | else:
151 | logger.debug("Unknown attribute name: %s", attribute)
152 |
153 | def __str__(self):
154 | return f""
155 |
156 |
157 | class TNEF:
158 | """main decoder class - start by using this"""
159 |
160 | TNEF_SIGNATURE = 0x223E9F78
161 | LVL_MESSAGE = 0x01
162 | LVL_ATTACHMENT = 0x02
163 | VALID_VERSION = 0x10000
164 |
165 | ATTOWNER = 0x0000 # Owner
166 | ATTSENTFOR = 0x0001 # Sent For
167 | ATTDELEGATE = 0x0002 # Delegate
168 | ATTDATESTART = 0x0006 # Date Start
169 | ATTDATEEND = 0x0007 # Date End
170 | ATTAIDOWNER = 0x0008 # Owner Appointment ID
171 | ATTREQUESTRES = 0x0009 # Response Requested.
172 | ATTFROM = 0x8000 # From
173 | ATTSUBJECT = 0x8004 # Subject
174 | ATTDATESENT = 0x8005 # Date Sent
175 | ATTDATERECD = 0x8006 # Date Received
176 | ATTMESSAGESTATUS = 0x8007 # Message Status
177 | ATTMESSAGECLASS = 0x8008 # Message Class
178 | ATTMESSAGEID = 0x8009 # Message ID
179 | ATTPARENTID = 0x800A # Parent ID
180 | ATTCONVERSATIONID = 0x800B # Conversation ID
181 | ATTBODY = 0x800C # Body
182 | ATTPRIORITY = 0x800D # Priority
183 | ATTATTACHDATA = 0x800F # Attachment Data
184 | ATTATTACHTITLE = 0x8010 # Attachment File Name
185 | ATTATTACHMETAFILE = 0x8011 # Attachment Meta File
186 | ATTATTACHCREATEDATE = 0x8012 # Attachment Creation Date
187 | ATTATTACHMODIFYDATE = 0x8013 # Attachment Modification Date
188 | ATTDATEMODIFY = 0x8020 # Date Modified
189 | ATTATTACHTRANSPORTFILENAME = 0x9001 # Attachment Transport Filename
190 | ATTATTACHRENDDATA = 0x9002 # Attachment Rendering Data
191 | ATTMAPIPROPS = 0x9003 # MAPI Properties
192 | ATTRECIPTABLE = 0x9004 # Recipients
193 | ATTATTACHMENT = 0x9005 # Attachment
194 | ATTTNEFVERSION = 0x9006 # TNEF Version
195 | ATTOEMCODEPAGE = 0x9007 # OEM Codepage
196 | ATTORIGNINALMESSAGECLASS = 0x9008 # Original Message Class
197 |
198 | codes = {
199 | ATTOWNER: "Owner",
200 | ATTSENTFOR: "Sent For",
201 | ATTDELEGATE: "Delegate",
202 | ATTDATESTART: "Date Start",
203 | ATTDATEEND: "Date End",
204 | ATTAIDOWNER: "Owner Appointment ID",
205 | ATTREQUESTRES: "Response Requested",
206 | ATTFROM: "From",
207 | ATTSUBJECT: "Subject",
208 | ATTDATESENT: "Date Sent",
209 | ATTDATERECD: "Date Received",
210 | ATTMESSAGESTATUS: "Message Status",
211 | ATTMESSAGECLASS: "Message Class",
212 | ATTMESSAGEID: "Message ID",
213 | ATTPARENTID: "Parent ID",
214 | ATTCONVERSATIONID: "Conversation ID",
215 | ATTBODY: "Body",
216 | ATTPRIORITY: "Priority",
217 | ATTATTACHDATA: "Attachment Data",
218 | ATTATTACHTITLE: "Attachment File Name",
219 | ATTATTACHMETAFILE: "Attachment Meta File",
220 | ATTATTACHCREATEDATE: "Attachment Creation Date",
221 | ATTATTACHMODIFYDATE: "Attachment Modification Date",
222 | ATTDATEMODIFY: "Date Modified",
223 | ATTATTACHTRANSPORTFILENAME: "Attachment Transport Filename",
224 | ATTATTACHRENDDATA: "Attachment Rendering Data",
225 | ATTMAPIPROPS: "MAPI Properties",
226 | ATTRECIPTABLE: "Recipients",
227 | ATTATTACHMENT: "Attachment",
228 | ATTTNEFVERSION: "TNEF Version",
229 | ATTOEMCODEPAGE: "OEM Codepage",
230 | ATTORIGNINALMESSAGECLASS: "Original Message Class",
231 | }
232 |
233 | MIN_OBJ_SIZE = 12
234 |
235 | def __init__(self, data, do_checksum=True):
236 | self.signature = uint32(data)
237 | if self.signature != TNEF.TNEF_SIGNATURE:
238 | raise ValueError(f"Wrong TNEF signature: {self.signature:#010x}")
239 | self.key = uint16(data, 4)
240 | self.codepage = None
241 | self.objects = []
242 | self.attachments = []
243 | self.mapiprops = []
244 | self.msgprops = []
245 | self.body = None
246 | self.htmlbody = None
247 | self._rtfbody = None
248 | offset = 6
249 |
250 | if not do_checksum:
251 | logger.info("Skipping checksum for performance")
252 |
253 | while offset + self.MIN_OBJ_SIZE < len(data):
254 | obj = TNEFObject(data[offset:], do_checksum)
255 | offset += obj.length
256 | self.objects.append(obj)
257 |
258 | # handle attachments
259 | if obj.name == TNEF.ATTATTACHRENDDATA:
260 | attachment = TNEFAttachment(self.codepage)
261 | self.attachments.append(attachment)
262 |
263 | if obj.level == TNEF.LVL_ATTACHMENT:
264 | attachment.add_attr(obj)
265 | elif obj.name == TNEF.ATTMAPIPROPS:
266 | # handle MAPI properties
267 | mapiprops = decode_mapi(obj.data, self.codepage)
268 | internet_codepage = None
269 |
270 | # handle BODY property
271 | for p in mapiprops:
272 | if p.name == Attribute.MAPI_INTERNET_CODEPAGE:
273 | internet_codepage = Codepage(p.data)
274 | if p.name == Attribute.MAPI_BODY:
275 | self.body = p.data
276 | elif p.name == Attribute.MAPI_UNCOMPRESSED_BODY:
277 | self.body = p.data
278 | elif p.name == Attribute.MAPI_BODY_HTML:
279 | self.htmlbody = p.data
280 | elif p.name == Attribute.MAPI_RTF_COMPRESSED:
281 | self._rtfbody = p.data
282 | else:
283 | self.mapiprops.append(p)
284 | if self.htmlbody and internet_codepage:
285 | self.htmlbody = internet_codepage.decode(self.htmlbody)
286 | if self.body and internet_codepage:
287 | self.body = internet_codepage.decode(self.body)
288 | elif obj.name == TNEF.ATTBODY:
289 | self.body = obj.data
290 | elif obj.name == TNEF.ATTTNEFVERSION:
291 | if uint32(obj.data) != TNEF.VALID_VERSION:
292 | logger.warning('Invalid TNEF Version %02x%02x%02x%02x', *obj.data)
293 | elif obj.name == TNEF.ATTOEMCODEPAGE:
294 | self.codepage = Codepage(uint32(obj.data)).codepage()
295 | elif obj.type in (TNEFObject.PTYPE_CLASS, TNEFObject.PTYPE_STRING):
296 | obj.data = obj.data.decode(self.codepage).rstrip('\x00')
297 | self.msgprops.append(obj)
298 | elif obj.name == TNEF.ATTPRIORITY:
299 | obj.data = 3 - uint16(obj.data)
300 | self.msgprops.append(obj)
301 | elif obj.name == TNEF.ATTRECIPTABLE:
302 | rows = uint32(obj.data)
303 | att_offset = 4
304 | recipients = []
305 | for _ in range(rows):
306 | att_offset, recipient = decode_mapi(obj.data, self.codepage, starting_offset=att_offset)
307 | recipients.append(recipient)
308 | obj.data = recipients
309 | self.msgprops.append(obj)
310 | elif obj.name == TNEF.ATTFROM:
311 | obj.data = triples(obj.data)
312 | self.msgprops.append(obj)
313 | elif obj.name == TNEF.ATTREQUESTRES:
314 | obj.data = bool(uint16(obj.data))
315 | self.msgprops.append(obj)
316 | elif obj.name == TNEF.ATTMESSAGESTATUS:
317 | # documented to be a uint32, observed to be a single byte
318 | obj.data = bytes_to_int(obj.data)
319 | self.msgprops.append(obj)
320 | elif obj.type == TNEFObject.PTYPE_TIME and obj.name in (
321 | TNEF.ATTDATESTART, TNEF.ATTDATEEND, TNEF.ATTDATEMODIFY, TNEF.ATTDATESENT, TNEF.ATTDATERECD
322 | ):
323 | try:
324 | obj.data = typtime(obj.data)
325 | self.msgprops.append(obj)
326 | except ValueError:
327 | logger.debug("TNEF Object not a valid date: %s", obj)
328 | else:
329 | logger.debug("Unhandled TNEF Object: %s", obj)
330 |
331 | def has_body(self):
332 | return any((self.body, self.htmlbody, self._rtfbody))
333 |
334 | @property
335 | def rtfbody(self):
336 | if self._rtfbody:
337 | try:
338 | # compressed_rtf is not typed yet
339 | from compressed_rtf import decompress # type: ignore
340 | return decompress(self._rtfbody + b'\x00')
341 | except ImportError:
342 | logger.warning("Returning compressed RTF. Install compressed_rtf to decompress")
343 | return self._rtfbody
344 | else:
345 | return None
346 |
347 | def __str__(self):
348 | atts = f", {len(self.attachments)} attachments" if self.attachments else ''
349 | return f"<{self.__class__.__name__}:0x{self.key:02x}{atts}>"
350 |
351 | def dump(self, force_strings=False):
352 | def get_data(a):
353 | if force_strings and isinstance(a.data, bytes):
354 | return a.data.decode('ascii', errors="replace")
355 | elif force_strings and isinstance(a.data, tuple) and isinstance(a.data[0], bytes):
356 | return [s.decode('ascii', errors="replace") for s in a.data]
357 | elif force_strings and (isinstance(a.data, datetime) or isinstance(a.data, UUID)):
358 | return a.data.__str__()
359 | else:
360 | return a.data
361 | out = {'attachments': [], 'attributes': {}, 'extended_attributes': {}}
362 | for o in self.attachments:
363 | attachment = {
364 | 'filename': o.name,
365 | 'long_filename': o.long_filename(),
366 | 'data_len': len(o.data),
367 | }
368 | for att in o.mapi_attrs:
369 | attachment[att.name_str] = get_data(att)
370 | if hasattr(o, 'embed'):
371 | attachment['embedded_message'] = o.embed.dump(force_strings)
372 | out['attachments'].append(attachment)
373 | for o in self.msgprops:
374 | data = get_data(o)
375 | if o.name == TNEF.ATTRECIPTABLE:
376 | data = []
377 | for recipient in o.data:
378 | rec = {att.name_str: get_data(att) for att in recipient}
379 | data.append(rec)
380 | out['attributes'][o.name_str] = data
381 | for att in self.mapiprops:
382 | out['extended_attributes'][att.name_str] = get_data(att)
383 | return out
384 |
385 |
386 | def triples(data):
387 | assert uint16(data) == 4
388 | # struct_length = uint16(data, 2)
389 | sender_length = uint16(data, 4)
390 | email_length = uint16(data, 6)
391 | sender = data[8: 8 + sender_length]
392 | etype_email = data[8 + sender_length: 8 + sender_length + email_length]
393 | etype, email = etype_email.split(b':', 1)
394 |
395 | return sender.rstrip(b'\x00'), etype, email.rstrip(b'\x00')
396 |
397 |
398 | def to_zip(tnef: Union[TNEF, bytes], default_name='no-name', deflate=True):
399 | """Convert attachments in TNEF data to zip format."""
400 |
401 | if isinstance(tnef, bytes):
402 | msg = "passing bytes to tnef.to_zip will be deprecated, pass a TNEF object instead"
403 | warnings.warn(msg, DeprecationWarning)
404 | tnef = TNEF(tnef)
405 |
406 | # Extract attachments found in the TNEF object
407 | tozip = {}
408 | for attachment in tnef.attachments:
409 | filename = Path(attachment.long_filename() or default_name)
410 | if tozip.get(filename):
411 | # uniqify this file name by adding - before the extension
412 | length = len(tozip.get(filename))
413 | newname = f"{filename.stem}-{length + 1}{filename.suffix}"
414 | tozip[filename].append((filename.with_name(newname), attachment.data))
415 | else:
416 | tozip[filename] = [(filename, attachment.data)]
417 |
418 | # Add each attachment to the zip file
419 | sfp = BytesIO()
420 | with ZipFile(sfp, "w", ZIP_DEFLATED if deflate else ZIP_STORED) as zf:
421 | for entries in tozip.values():
422 | for name, data in entries:
423 | zf.writestr(str(name), data)
424 |
425 | # Return the binary data for the zip file
426 | return sfp.getvalue()
427 |
--------------------------------------------------------------------------------
/tnefparse/util.py:
--------------------------------------------------------------------------------
1 | """utility functions
2 | """
3 | import logging
4 | import struct
5 | import uuid
6 | from datetime import datetime, timedelta
7 |
8 | logger = logging.getLogger(__package__)
9 |
10 |
11 | def make_unpack(structure):
12 | call = struct.Struct(structure).unpack_from
13 |
14 | def unpack(byte_arr, offset=0):
15 | return call(byte_arr, offset)[0]
16 |
17 | return unpack
18 |
19 |
20 | uint8 = make_unpack('