v0.35.0
- [TeamMsgExtractor #206] Implemented full support for Post objects, including the ability to save them.
- [TeamMsgExtractor #212] Implemented full support for Task objects, including the ability to save them. This also includes TaskRequest objects.
- [TeamMsgExtractor #110] Implemented full support for Contact objects, including the ability to save them.
- [TeamMsgExtractor #143] Rewrote the system used for
Appointmentobjects to include all of the objects specified in [MS-OXOCAL]. Name changed toAppointmentMeeting. Completed support for Appointment objects, including the ability to save them. - [TeamMsgExtractor #243] Added optional dependency
mimetype-magic(installable using themimeextra) which helps to identify attachments that do not give a mime-type. - [TeamMsgExtractor #274] Apparently the properties stream can have random garbage at the end of it (outlook generate the file that showed this) so code was added to ensure it wouldn't break everything.
- [TeamMsgExtractor #274] Made sure that the save function would report if it failed to find or generate a valid body. Specifically, if you were just trying to use the plain text body but it didn't exist (the stream didn't exist, not that the stream was empty) it would silently pass, which was bad behavior. Additionally,
allowFallbackwill change the message to specify that current options were not usable for getting a valid body. - [TeamMsgExtractor #207] Changed behavior for max date. Apparently it looks like it is supposed to be August 31, 4500 at 11:59 PM. However, in case this needs to change, we have created a constant called
extract_msg.constants.NULL_DATEto represent this that you can use in your code to not have to worry about changing your code if we check it. - Moved a few more minor constants to
enums. - Added support for many internal data structures, specifically Entry ID structures.
- Refactored classes from
extract_msg.datato submoduleextract_msg.structures. - Added
python_requiresto setup.py as I noticed that it was missing. - Due to new saving requirements, adjusted the way header injection worked all around. Functions are now built-in to
MessageBase.getSaveXBodyfunctions have also been moved down to be defined inMessageBase. If the extension class needs to specify custom behaviors for creating the save bodies, these functions will need to be overridden.- For saving,
MessageBase(being the lowest one to currently contain bodies) has a few new properties. These properties represent the injection strings that will be injected into the bodies for the header, with an additional property to specify what properties map to what part of the format string. SeeMessageBase.headerFormatPropertiesfor more information and an example of how to implement this in your own class. - Injection strings in constants have been removed in favor of dynamic generation, which only creates what is needed. No you will no longer see an empty Bcc field in your messages when you save them.
- Plain text bodies now also use this injection, making it easy to change the header in all bodies by overwriting a single property that tells the program what data to put where.
- For saving,
- Fixed issue in encapsulated RTF header that caused the "To" field to not be present. I had to write them by hand, so it was bound to happen. They are now dynamically generated by each instance, so these fields should always appear.
- All save code has been moved down from
MessageintoMessageBasefor convenience.Messageexists now for specific checking and for future specializations. This also means that anything that is aMessageBasenow has the entire framework for saving built-in, with easy way to change details. - Fixed bad property in
Contact. - Created save function for
Contact. Saving, though it exists, is rather minimal and is limited to plain text and HTML. - Significantly extended the
Contactclass's properties. - Adjusted the naming of a few
Contactproperties to better match the microsoft names.firstName->givenName.lastName->surname.businessPhone->businessTelephoneNumber- Etc.
- Changed existing fax properties to give a dictionary of the properties they actually contain rather than just the number. This makes them behave like the newly added email properties.
- Fixed issues with
Taskproperties being incorrect. - Added implementation for PtypErrorCode.
- Changed behavior of
Properties.dateto only return the submit time. This is to ensure messages that were never sent do not have a sent date. - Changed behavior of
MessageBase.dateto only return a send date if the message has been sent. For messages with no flags, it assumesTrue. - Generally brought saving behavior closer to the way outlook handles it.
- Made
SignedAttachmentandBaseAttachmentmore similar by adding properties to each that are shared.BaseAttachmentnow have anameproperty andSignedAttachmentnow havelongFilenameandshortFilename. - Fixed issue in HTML saving that would cause some characters to be dropped when rendering them due to how the header injection worked.
- Removed
__init__methods from MSG classes that don't change it. This ensures notes are easily passed down. - Correction to last comment, one max date was supposed to be at that date, but another max date is at a different date of the same year.
- Changed the way that
PtypTimeis handled, making it a single function inutils. - Upgraded dependencies to newer versions (some really need to be newer, like
tzlocal, for best results). Included dependencies arebeautifulsoup4andtzlocal. - Fixed an issue where zip file naming conflicts always failed in zip files for attachments. Both the embedded msg and the plain attachments would fail.
- Actually fixed the issue that would break the main loop.
- MSGFile no longer inherits directly from
OleFileIO. While I would prefer to do that, the__init__method for it is rather expensive, and allowing embedded msg files to directly share each other's instances ofOleFileIOwould improve speed immensely. - Fixed attachments not being preemptively loaded when
delayAttachmentswasFalse. utils.openMsgnow delays attachments while loading the file to get the class type. This means all time for attachments is cut in half as they are only ever loaded once. It also means that files that won't open due to attachments will error a little later, but this shouldn't be a problem.- Changed named properties
Guidback to constants. This has to do with the next entry. - Fixed a major issue in named properties. Apparently the ID is not enough and you must have the GUID as well, as multiple properties can share the exact same ID.
- Added option
--no-foldersto the command line allowing you to save all attachments from a set of MSG files into a single folder. - Added option
--skip-embeddedto the command line to skip saving embedded MSG files. - Added option
skipEmbeddedtoAttachment.save(and all other related save methods that call it) to skip saving an embedded MSG file. - Changed
__main__so that it opens the zip file there instead of relying on everything it calls to do it again and again. - Changed the behavior of
--verboseto allow it to be stacked for more verboseness. Specifying it once turns on warnings, twice for info, and three times for debug. Not specifying it only turns on error logging.