Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
e731c87
Trying to fix this branch (had to recreate and lost all commits)
TheElementalOfDestruction Jan 18, 2023
558c61f
Fix typo
TheElementalOfDestruction Jan 18, 2023
4f01d61
Attempting to fix merge
TheElementalOfDestruction Feb 13, 2023
8384e16
Final fix for merge
TheElementalOfDestruction Feb 13, 2023
ca8a870
Merge pull request #342 from TeamMsgExtractor/next-release
TheElementalOfDestruction Feb 13, 2023
5ce8cb2
Add back CUSTOM to AttachmentType enum
TheElementalOfDestruction Feb 13, 2023
6f9845b
Merge pull request #346 from TeamMsgExtractor/next-release
TheElementalOfDestruction Feb 27, 2023
340168b
Revert and adjust some changes to sync with next-release
TheElementalOfDestruction Mar 18, 2023
9110cf6
Merge branch 'outlook-signature' of https://github.com/TeamMsgExtract…
TheElementalOfDestruction Mar 18, 2023
1d27fd3
Merge pull request #350 from TeamMsgExtractor/next-release
TheElementalOfDestruction Mar 18, 2023
1f30ab8
Add back change that was blocking merge
TheElementalOfDestruction Mar 18, 2023
d2fdda7
Remove unneded imports (also resolve merge)
TheElementalOfDestruction May 9, 2023
88fd211
Attempting to resolve merge
TheElementalOfDestruction May 9, 2023
3a20c74
More resolving merge
TheElementalOfDestruction May 9, 2023
2a1b0f4
Checking if that was one of the merge issues
TheElementalOfDestruction May 9, 2023
7c1a480
Is this the issue?
TheElementalOfDestruction May 9, 2023
f77a234
Merge pull request #361 from TeamMsgExtractor/next-release
TheElementalOfDestruction May 9, 2023
f0cfe3e
Add changed that prevented merge back
TheElementalOfDestruction May 9, 2023
ac8e1b2
Update organization to match current version
TheElementalOfDestruction May 10, 2023
68538ad
Changing the way custom attachments work
TheElementalOfDestruction Jun 10, 2023
197fc53
Remove odd newline
TheElementalOfDestruction Jun 10, 2023
68cfb25
Changed and finished the RTF code
TheElementalOfDestruction Jun 13, 2023
19b1e6c
Merge pull request #370 from TeamMsgExtractor/next-release
TheElementalOfDestruction Jun 13, 2023
beb9125
Finalize changes for transfer back to next-release
TheElementalOfDestruction Jun 13, 2023
fe259f9
Merge pull request #371 from TeamMsgExtractor/outlook-signature
TheElementalOfDestruction Jun 13, 2023
dfbd32a
Delete file that was meant to be deleted before
TheElementalOfDestruction Jun 13, 2023
267e86c
Significant refactoring and bug fixes
TheElementalOfDestruction Jun 14, 2023
de364e7
Correct variable name
TheElementalOfDestruction Jun 14, 2023
df0ef46
Fixed issues in __main__
TheElementalOfDestruction Jun 14, 2023
a0ffb77
Bug fixes + change to weakref
TheElementalOfDestruction Jun 14, 2023
29e36a9
Change tests.py to only run tests if file ran
TheElementalOfDestruction Jun 15, 2023
cedbf78
Add backup handling for outlook image with no name
TheElementalOfDestruction Jun 15, 2023
0bf3d62
Fix clsid still using hard ref
TheElementalOfDestruction Jun 15, 2023
b660c3e
Removed unneeded import
TheElementalOfDestruction Jun 15, 2023
2659f33
changed `knownMsgClass` to a private function
TheElementalOfDestruction Jun 15, 2023
4d8d8c9
Removed unused function `getFullClassName`
TheElementalOfDestruction Jun 15, 2023
6f5c1f4
Changed HTML fixes to no longer need prepared
TheElementalOfDestruction Jun 15, 2023
fca8951
Update __init__ with current date
TheElementalOfDestruction Jun 15, 2023
3f6aff7
Fix docstrings, remove exception
TheElementalOfDestruction Jun 15, 2023
078f4d1
Removed unused variable
TheElementalOfDestruction Jun 15, 2023
0180885
Large scale reorganization of attachments
TheElementalOfDestruction Jun 16, 2023
0aaaf54
Fix type hint and remove unnecesary line
TheElementalOfDestruction Jun 16, 2023
1816e28
Fix exports for various attachment modules
TheElementalOfDestruction Jun 16, 2023
d7aaba6
Fix minor bugs and add web attachments (alpha)
TheElementalOfDestruction Jun 16, 2023
8c36cf1
Update changelog, fix bug
TheElementalOfDestruction Jun 16, 2023
5f51a79
Added a way for the custom handler to return obj
TheElementalOfDestruction Jun 18, 2023
b271a22
Correct code for unwrapMsg
TheElementalOfDestruction Jun 20, 2023
63f4a05
Fix typo in utils.py
TheElementalOfDestruction Jun 20, 2023
b36e0ba
Deprecate ignoreRtfDeErrors open option
TheElementalOfDestruction Jun 20, 2023
cb35add
Bump date
TheElementalOfDestruction Jun 20, 2023
d3b2ef4
Fixed errors in new attachment code
TheElementalOfDestruction Jun 21, 2023
71ccf6b
Reorganize and add encoding module
TheElementalOfDestruction Jun 21, 2023
5f3f206
Update to require upcoming version of RTFDE
TheElementalOfDestruction Jun 21, 2023
3d81489
Add support for sticky note
TheElementalOfDestruction Jun 21, 2023
516bb49
Fix bugs with opening MSG files
TheElementalOfDestruction Jun 21, 2023
ba04289
Fixed casing in changelog
TheElementalOfDestruction Jun 21, 2023
97a4269
Add pillow to optional requirements
TheElementalOfDestruction Jun 21, 2023
05e0dd8
Fix issue in setup.cfg
TheElementalOfDestruction Jun 26, 2023
71e896d
Fix typo in property ID in initStandardAttachment
TheElementalOfDestruction Jun 26, 2023
f2bfd34
Docstrings, new property, fix bug in MessageBase
TheElementalOfDestruction Jun 26, 2023
0b59f06
Updated exceptions and added insecureFeatures arg.
TheElementalOfDestruction Jun 26, 2023
9783687
Attempt to address #372
TheElementalOfDestruction Jul 1, 2023
21a9dae
Ensured all attachment types can have save skipped
TheElementalOfDestruction Jul 1, 2023
187f357
Fix minor exception typo
TheElementalOfDestruction Jul 1, 2023
d440e3f
Update save functions, change code for some props
TheElementalOfDestruction Jul 2, 2023
0bff90c
Finish new attachment save code
TheElementalOfDestruction Jul 2, 2023
3bf47a8
Fix attachment handling in MessageBase.save
TheElementalOfDestruction Jul 2, 2023
fec08d1
Change some more things to cached property
TheElementalOfDestruction Jul 2, 2023
7ba32bf
Typing and cached property stuff
TheElementalOfDestruction Jul 2, 2023
5bdb5dc
Update usage of intflags and change prop internals
TheElementalOfDestruction Jul 2, 2023
934e717
Progress on redoing property internals
TheElementalOfDestruction Jul 2, 2023
580785c
Further property internals progress
TheElementalOfDestruction Jul 2, 2023
c9d3ae9
Near done with prop internals
TheElementalOfDestruction Jul 2, 2023
2bdba8b
Finish prop internals
TheElementalOfDestruction Jul 2, 2023
1bca36f
Fix minor issues
TheElementalOfDestruction Jul 2, 2023
114465e
Start update for helper script
TheElementalOfDestruction Jul 2, 2023
0edcb08
Fix exports of enum.
TheElementalOfDestruction Jul 3, 2023
00b7446
Export fixes and internal updates
TheElementalOfDestruction Jul 3, 2023
7657070
Comment fixes.
TheElementalOfDestruction Jul 3, 2023
2a8bb19
Shorten lines a bit
TheElementalOfDestruction Jul 4, 2023
44998bb
Fix exceptions, change behavior of ole defects
TheElementalOfDestruction Jul 4, 2023
f62436f
Update date in __init__
TheElementalOfDestruction Jul 4, 2023
61e5a10
Fix attachment code, add feature #288
TheElementalOfDestruction Jul 4, 2023
b1ae20b
Added command line argument for #288
TheElementalOfDestruction Jul 4, 2023
c0085b3
Update readme
TheElementalOfDestruction Jul 4, 2023
c42c54f
Fix readme spacing issue
TheElementalOfDestruction Jul 4, 2023
81f7775
Update changelog to reference #40
TheElementalOfDestruction Jul 4, 2023
d4cdaef
Update changelog to reference new issue
TheElementalOfDestruction Jul 7, 2023
6f91856
Update some comments
TheElementalOfDestruction Jul 7, 2023
0cc2219
Add windows-874. Fix issues in encoding
TheElementalOfDestruction Jul 8, 2023
467c106
Updated comments and changelog
TheElementalOfDestruction Jul 8, 2023
061558e
Bit of organization
TheElementalOfDestruction Jul 9, 2023
36843cf
Add new encoding, add utility, update changelog
TheElementalOfDestruction Jul 9, 2023
32d445d
Fix bug in new utility
TheElementalOfDestruction Jul 9, 2023
9e0c7ff
Added a few more encodings
TheElementalOfDestruction Jul 9, 2023
bea3ea8
Update __init__,py for new release.
TheElementalOfDestruction Jul 29, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
__pycache__/

# Ignore new .msg files added from testing

/example-msg-files/expected-outputs/
/example-msg-files/*.msg

Expand Down
56 changes: 56 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,59 @@
**v0.42.0**
* [[TeamMsgExtractor #372](https://github.com/TeamMsgExtractor/msg-extractor/issues/372)] Changed the way that the save functions return a value. This makes the return value from all save functions much more informative, allowing a user to separate if a fole or folder (or if more than one) was saved from the function. It also guarentees that all classes from this module will return the relevent path(s) if data is actually saved.
* [[TeamMsgExtractor #288](https://github.com/TeamMsgExtractor/msg-extractor/issues/288)] Added feature to allow attachment save functions to simply overwrite existing files of the same name. This can be done with the `overwriteExisting` keyword argument from code or the `--overwrite-existing` option from the command line.
* [[TeamMsgExtractor #40](https://github.com/TeamMsgExtractor/msg-extractor/issues/40)] Added new submodule `custom_attachments`. This submodule provides an extendable way to handle custom attachment types, attachment types whose structure and formatting are not defined in the Microsoft documentation for MSG files. This includes a handler to at least partially cover support for Outlook images.
* [[TeamMsgExtractor #373](https://github.com/TeamMsgExtractor/msg-extractor/issues/373)] Added the `encoding` submodule for encoding tasks, including proper support for Microsoft's implementation of CP950. This gets added to the codecs list as "windows-950".
* Added infrastructure to make it easy to add variable-byte (up to two bytes) encodings and single-byte encodings.
* Added the following encodings:
* windows-874
* x-mac-ce
* x-mac-cyrillic
* x-mac-greek
* x-mac-icelandic
* x-mac-turkish
* Fixed an issue in the save functions that left the possibility for the zip files to not end up closing if the save function created it and then had an exception.
* Added new property `AttachmentBase.clsid` which returns the listed CLSID value of the data stream/storage of the attachment.
* Changed internal behavior of `MSGFile.attachments`. This should not cause any noticeable changes to the output.
* Refactored code significantly to make it more organized.
* Changed the exports from the main module to only include an important subset of the module. For other items, you'll have to import the submodule that it falls under to access it. Submodules export all important pieces, so it will be easier to find.
* This includes having many modules be under entirely new paths. Some of these changes have been done with no deprecation, something I generally try to avoid. This is happening at the same time as the public api is significantly changing, which makes it more acceptable.
* Fixed `__main__` using the wrong enum for error behavior.
* Fixed `Named.get` being severely out of date (it's not used anywhere by the module which is why it wasn't noticed).
* Fixed `Named.__getitem__` being entirely case-sensitive.
* Switched much of the internal code (and the `treePath` property of all classes that have it) to using `weakref.ReferenceType` to avoid hard cyclic references.
* Fixed `Recipient._getTypedStream` never returning a value.
* Added additional type hints in various places.
* Modified tests.py to only run if it is run as a file instead of imported.
* Changed `knownMsgClass` to a private function since it is explicitly not being exported by any part of the module.
* Removed unusued function `getFullClassName`.
* Fixes to the HTML body when saving as HTML will no longer require the `preparedHtml`/`--prepared-html` option.
* Removed unused exceptions.
* Entirely reoganized the way attachments are initialized, including the class that will be used in various circumstances. Embedded MSG files, custom attachments, and web attachments will all use dedicated classes that are subclasses of AttachmentBase.
* With this change, the way to specify a new Attachment class is to override the function used when creating attachments. This can be done by passing `attachmentInit = myFunction` as an option to `openMsg`. This function MUST return an instance of AttachmentBase.
* Added first implementation of web attachments. Saving is not currently possible, but basic relevent property access is now possible. Saving will not be stopped by this attachment if `skipNotImplemented = True` is passed to the save function.
* Changed the option to suppress `RTFDE` errors to fall under the `ErrorBehavior` enum. Usage of the original option will be allowable, but is being marked as deprecated. However, it is still a dedicated option from the command line.
* Also fixed the option not properly ignoring some RTFDE errors, specifically the ones that it is normal for the module to throw.
* Removed some constants that are not used by the module.
* Updated to support `RTFDE` version `0.1.0`. Users encountering random erros from that module should find that those errors have disappeared. If you get errors from it still, bring up the issue on their GitHub.
* Fixed bug that would cause weird behavior if you gave an empty string as the path for an MSG file.
* Added support for `IPM.StickyNote`.
* Fixed an issue that would cause MSG file to never close if an error happened during any of the `__init__` functions for MSG classes.
* Removed unneeded `chardet` dependency.
* Removed `Contact.__init__` as it didn't provide any unique behavior.
* Changed the documentation of `openMsg` to specify that it accepts all options recognized by MSGFile subclasses, allowing the doc string to not be modified every time one of them is changed.
* Changed the documentaion of various `__init__` methods to do the same thing.
* Added `dataType` property to `AttachmentBase` and `SignedAttachment` for checking the class that the data will be, if accessible. Returns `None` if the data is inaccessible, including because accessing it would throw an exception.
* Added new enum `InsecureFeatures` and option `insecureFeatures`. This option will allow certain features with security implcations to be used for files that you trust. Currently the only feature it supports is the usage of `PIL`/`Pillow` to open and modify images. All features like this will be opt-in to reduce possible vulnerabilities.
* Modified all custom exceptions the module uses to derive from a single base class for better organization.
* Added new exceptions to handle some of the situations previously handled by base Python exceptions.
* Changed internal handling of the `prefix` option for `MSGFile.__init__` (and therefore `openMsg`). If you are not setting this manually, you should notice little difference.
* Made enums less strict and converted all using `fromBits` to be `IntFlag` enums.
* Fixed `CalendarBase.keywords` being blatantly incorrect (it was so bad I don't know how it slipped through).
* Fixed `Contact.gender` being blatantly incorrect.
* Fixed sender not being properly decoded in some circumstances.
* Changed behavior of `MSGFile` to have olefile raise defects of type `DEFECT_INCORRECT` and above instead of just `DEFECT_FATAL`. Uncaught issues of `DEFECT_INCORRECT` can often cause the module to have parsing issues that may be misleading, this just ensures the issue is clarified. This behavior can be reverted back to the previous with `ErrorBehavior.OLE_DEFECT_INCORRECT`.
* Fixed potential issues that may have made is possible for certain attachments to ignore filename conflict resolution code.

**v0.41.5**
* Fixed an issue from version `0.41.3` where the header being present but missing the `From` field would cause an exception.

Expand Down
108 changes: 50 additions & 58 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -59,62 +59,54 @@ Currently, the README is in the process of being redone. For now, please
refer to the usage information provided from the program's help dialog:
::

usage: extract_msg [-h] [--use-content-id] [--validate] [--json] [--file-logging] [-v] [--log LOG] [--config CONFIGPATH]
[--out OUTPATH] [--use-filename] [--dump-stdout] [--html] [--pdf] [--wk-path WKPATH]
[--wk-options [WKOPTIONS ...]] [--prepared-html] [--charset CHARSET] [--raw] [--rtf] [--allow-fallback]
[--skip-body-not-found] [--zip ZIP] [--save-header] [--attachments-only] [--skip-hidden] [--no-folders]
[--skip-embedded] [--extract-embedded] [--skip-not-implemented] [--out-name OUTNAME | --glob] [--ignore-rtfde]
[--progress]
msg [msg ...]

extract_msg: Extracts emails and attachments saved in Microsoft Outlook's .msg files. https://github.com/TeamMsgExtractor/msg-
extractor

positional arguments:
msg An MSG file to be parsed.

optional arguments:
-h, --help show this help message and exit
--use-content-id, --cid
Save attachments by their Content ID, if they have one. Useful when working with the HTML body.
--validate Turns on file validation mode. Turns off regular file output.
--json Changes to write output files as json.
--file-logging Enables file logging. Implies --verbose level 1.
-v, --verbose Turns on console logging. Specify more than once for higher verbosity.
--log LOG Set the path to write the file log to.
--config CONFIGPATH Set the path to load the logging config from.
--out OUTPATH Set the folder to use for the program output. (Default: Current directory)
--use-filename Sets whether the name of each output is based on the msg filename.
--dump-stdout Tells the program to dump the message body (plain text) to stdout. Overrides saving arguments.
--html Sets whether the output should be HTML. If this is not possible, will error.
--pdf Saves the body as a PDF. If this is not possible, will error.
--wk-path WKPATH Overrides the path for finding wkhtmltopdf.
--wk-options [WKOPTIONS ...]
Sets additional options to be used in wkhtmltopdf. Should be a series of options and values, replacing the -
or -- in the beginning with + or ++, respectively. For example: --wk-options "+O Landscape"
--prepared-html When used in conjunction with --html, sets whether the HTML output should be prepared for embedded
attachments.
--charset CHARSET Character set to use for the prepared HTML in the added tag. (Default: utf-8)
--raw Sets whether the output should be raw. If this is not possible, will error.
--rtf Sets whether the output should be RTF. If this is not possible, will error.
--allow-fallback Tells the program to fallback to a different save type if the selected one is not possible.
--skip-body-not-found
Skips saving the body if the body cannot be found, rather than throwing an error.
--zip ZIP Path to use for saving to a zip file.
--save-header Store the header in a separate file.
--attachments-only Specify to only save attachments from an msg file.
--skip-hidden Skips any attachment marked as hidden (usually ones embedded in the body).
--no-folders Stores everything in the location specified by --out. Requires --attachments-only and is incompatible with
--out-name.
--skip-embedded Skips all embedded MSG files when saving attachments.
--extract-embedded Extracts the embedded MSG files as MSG files instead of running their save functions.
--skip-not-implemented, --skip-ni
Skips any attachments that are not implemented, allowing saving of the rest of the message.
--out-name OUTNAME Name to be used with saving the file output. Cannot be used if you are saving more than one file.
--glob, --wildcard Interpret all paths as having wildcards. Incompatible with --out-name.
--ignore-rtfde Ignores all errors thrown from RTFDE when trying to save. Useful for allowing fallback to continue when an
exception happens.
--progress Shows what file the program is currently working on during it's progress.
usage: extract_msg [-h] [--use-content-id] [--json] [--file-logging] [-v] [--log LOG] [--config CONFIGPATH] [--out OUTPATH] [--use-filename] [--dump-stdout] [--html] [--pdf] [--wk-path WKPATH] [--wk-options [WKOPTIONS ...]]
[--prepared-html] [--charset CHARSET] [--raw] [--rtf] [--allow-fallback] [--skip-body-not-found] [--zip ZIP] [--save-header] [--attachments-only] [--skip-hidden] [--no-folders] [--skip-embedded] [--extract-embedded]
[--overwrite-existing] [--skip-not-implemented] [--out-name OUTNAME | --glob] [--ignore-rtfde] [--progress]
msg [msg ...]

extract_msg: Extracts emails and attachments saved in Microsoft Outlook's .msg files. https://github.com/TeamMsgExtractor/msg-extractor

positional arguments:
msg An MSG file to be parsed.

options:
-h, --help show this help message and exit
--use-content-id, --cid
Save attachments by their Content ID, if they have one. Useful when working with the HTML body.
--json Changes to write output files as json.
--file-logging Enables file logging. Implies --verbose level 1.
-v, --verbose Turns on console logging. Specify more than once for higher verbosity.
--log LOG Set the path to write the file log to.
--config CONFIGPATH Set the path to load the logging config from.
--out OUTPATH Set the folder to use for the program output. (Default: Current directory)
--use-filename Sets whether the name of each output is based on the msg filename.
--dump-stdout Tells the program to dump the message body (plain text) to stdout. Overrides saving arguments.
--html Sets whether the output should be HTML. If this is not possible, will error.
--pdf Saves the body as a PDF. If this is not possible, will error.
--wk-path WKPATH Overrides the path for finding wkhtmltopdf.
--wk-options [WKOPTIONS ...]
Sets additional options to be used in wkhtmltopdf. Should be a series of options and values, replacing the - or -- in the beginning with + or ++, respectively. For example: --wk-options "+O Landscape"
--prepared-html When used in conjunction with --html, sets whether the HTML output should be prepared for embedded attachments.
--charset CHARSET Character set to use for the prepared HTML in the added tag. (Default: utf-8)
--raw Sets whether the output should be raw. If this is not possible, will error.
--rtf Sets whether the output should be RTF. If this is not possible, will error.
--allow-fallback Tells the program to fallback to a different save type if the selected one is not possible.
--skip-body-not-found
Skips saving the body if the body cannot be found, rather than throwing an error.
--zip ZIP Path to use for saving to a zip file.
--save-header Store the header in a separate file.
--attachments-only Specify to only save attachments from an msg file.
--skip-hidden Skips any attachment marked as hidden (usually ones embedded in the body).
--no-folders Stores everything in the location specified by --out. Requires --attachments-only and is incompatible with --out-name.
--skip-embedded Skips all embedded MSG files when saving attachments.
--extract-embedded Extracts the embedded MSG files as MSG files instead of running their save functions.
--overwrite-existing Disables filename conflict resolution code for attachments when saving a file, causing files to be overwriten if two attachments with the same filename are on an MSG file.
--skip-not-implemented, --skip-ni
Skips any attachments that are not implemented, allowing saving of the rest of the message.
--out-name OUTNAME Name to be used with saving the file output. Cannot be used if you are saving more than one file.
--glob, --wildcard Interpret all paths as having wildcards. Incompatible with --out-name.
--ignore-rtfde Ignores all errors thrown from RTFDE when trying to save. Useful for allowing fallback to continue when an exception happens.
--progress Shows what file the program is currently working on during it's progress.

**To use this in your own script**, start by using:

Expand Down Expand Up @@ -250,8 +242,8 @@ your access to the newest major version of extract-msg.
.. |License: GPL v3| image:: https://img.shields.io/badge/License-GPLv3-blue.svg
:target: LICENSE.txt

.. |PyPI3| image:: https://img.shields.io/badge/pypi-0.41.5-blue.svg
:target: https://pypi.org/project/extract-msg/0.41.5/
.. |PyPI3| image:: https://img.shields.io/badge/pypi-0.42.0-blue.svg
:target: https://pypi.org/project/extract-msg/0.42.0/

.. |PyPI2| image:: https://img.shields.io/badge/python-3.8+-brightgreen.svg
:target: https://www.python.org/downloads/release/python-3816/
Expand Down
55 changes: 22 additions & 33 deletions extract_msg/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,53 +27,42 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.

__author__ = 'Destiny Peterson & Matthew Walker'
__date__ = '2023-06-11'
__version__ = '0.41.5'
__date__ = '2023-07-29'
__version__ = '0.42.0'

__all__ = [
# Modules:
'constants',
'attachments',
'enums',
'exceptions',
'msg_classes',
'properties',

# Classes:
'AppointmentMeeting',
'Attachment',
'Contact',
'MeetingForwardNotification',
'MeetingRequest',
'MeetingResponse',
'AttachmentBase',
'Message',
'MessageBase',
'MessageSigned',
'MessageSignedBase',
'MSGFile',
'Post',
'Properties',
'Named',
'NamedProperties',
'OleWriter',
'PropertiesStore',
'Recipient',
'Task',
'SignedAttachment',

#Functions:
'createProp',
# Functions:
'openMsg',
'openMsgBulk',
]


# Ensure these are imported before anything else.
from . import constants, enums, exceptions
from .appointment import AppointmentMeeting
from .attachment import Attachment
from .contact import Contact
from .meeting_forward import MeetingForwardNotification
from .meeting_request import MeetingRequest
from .meeting_response import MeetingResponse
from .message import Message
from .message_base import MessageBase
from .message_signed import MessageSigned
from .message_signed_base import MessageSignedBase
from .msg import MSGFile
from .post import Post
from .prop import createProp
from .properties import Properties
from .recipient import Recipient
from .task import Task
from .utils import openMsg, openMsgBulk

from . import attachments, msg_classes, properties
from .attachments import Attachment, AttachmentBase, SignedAttachment
from .msg_classes import Message, MSGFile
from .ole_writer import OleWriter
from .open_msg import openMsg, openMsgBulk
from .properties import Named, NamedProperties, PropertiesStore
from .recipient import Recipient
Loading