Custom Message Event Extension SUMMARY ======= The Events.Ext sample demonstrates how to implement a custom message event extension for the Microsoft Exchange Client. In particular, it demonstrates: - reading message text before displayed in the read note form - reading message text as it is submitted to MAPI This sample uses a very basic form of signing a message. A checksum on the message as it is written is stored as a custom property. Upon reading the message, the extension verifies the checksum and displays one of two possible outcomes: the message has been verified with correct contents, or the message text has been altered. MORE INFORMATION ================ This sample requires Microsoft Windows NT 3.51 or Windows 95, the MAPI 1.0 (Extended MAPI) PDK (Build 410 or above), Microsoft Visual C++ version 2.0 (or later), and the Win32 SDK for Windows NT and Windows 95. Configuration ------------- To configure Exchange to use the client extension, place the following REG_SZ entry in the system registry in: HKEY_LOCAL_MACHINE\Software\Microsoft\Exchange\Client\Extensions Samp Ext=4.0;C:\MAPISAMP\EVENTEXT\EVEXT32.DLL;1;00000111111100 You can leave out an explicit path to EVEXT32.DLL if it resides in a directory listed in the system PATH. Exchange client extensions are designed using OLE's Component Object Model. The client calls methods which are provided in the extension. In some calls to the extension interface, a pointer to a callback interface (IExchExtCallback) is given for the extension to call back into the Exchange client. For more information read "Extending the Microsoft Exchange Client" in the MAPI PDK documentation. This sample extension includes the implementation of a property page displayed in the Tools Option property sheet to either enable or disable signatures. The sample will check a flag before calculating or verifying checksums. GetObject is used during the OnWriteComplete and OnRead methods to obtain the message body. The checksum is calculated and written as a custom property of a message when the Send button is clicked. The checksum is recalculated and verified when a message is read. For large messages, the checksum may take a few seconds depending on the size of the message and the speed of the machine. During the case that a message is found to have "altered" text according to the checksum, the extension gives the user a choice whether to continue to read the message or not. If not, an error return value is set in the OnRead method to be used by the OnReadComplete method. Returning MAPI_E_CALL_FAILED from OnReadComplete causes Exchange to call OnReadComplete again with ulFlags parameter set to an error. The parameter is ignored by this sample and returning MAPI_E_CALL_FAILED causes Exchange to not display the read note form. This sample also supports the "Reply to Sender" context and signs the reply when enabled. Replying to a non-signed message while the signatures are enabled adds a signature to the entire message, counting original message and reply. Replying to a signed message while the signature is disabled removes the original signature. The logic for signing is only calculating the checksum on the PR_BODY message property. The extension does not take "quirks" of certain providers into its logic and the extension will interpret that a message was "altered" when in fact it has not. Two examples are the MSPERR Transport and the MSMail provider. With the MSPeer transport, it will add the text "*** End of message ***" at the end of the message. The checksum does not include this upon sending. The MSMail provider strips whitespace at the end of a line just before the carriage return characters (CRLF). When sending, the checksum calculation includes the whitespace. So the checksum verification upon reading will not match with the stored checksum property. If you write a message without placing any spaces just before a carriage return, or just allow the richedit control wordwrap, the checksums will be equal.