├── .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('