Options

Parsing MS Outlook .msg files

sgenzersgenzer Administrator, Moderator, Employee, RapidMiner Certified Analyst, Community Manager, Member, University Professor, PM Moderator Posts: 2,959 Community Manager
Hello - I was working with a customer and they needed to parse Microsoft Outlook .msg files. This is not "out of the box" for RapidMiner but fortunately there is a nifty piece of Python code on GitHub that was easily used. I'm a rather terrible Python coder but this did the trick. Note I push and pull the files names as macros from the context menu so it can be used as a subprocess...

<?xml version="1.0" encoding="UTF-8"?><process version="9.7.000-BETA3">
  <context>
    <input/>
    <output/>
    <macros>
      <macro>
        <key>old_file_path</key>
        <value>/Users/scottgenzer-rapidminercommunity/aa.msg</value>
      </macro>
      <macro>
        <key>new_file_path</key>
        <value>/Users/scottgenzer-rapidminercommunity/aa_converted.txt</value>
      </macro>
    </macros>
  </context>
  <operator activated="true" class="process" compatibility="9.7.000-BETA3" expanded="true" name="Process">
    <parameter key="logverbosity" value="init"/>
    <parameter key="random_seed" value="2001"/>
    <parameter key="send_mail" value="never"/>
    <parameter key="notification_email" value=""/>
    <parameter key="process_duration_for_mail" value="30"/>
    <parameter key="encoding" value="SYSTEM"/>
    <process expanded="true">
      <operator activated="true" class="python_scripting:execute_python" compatibility="9.6.000" expanded="true" height="82" name="Execute Python (2)" width="90" x="112" y="34">
        <parameter key="script" value="import re&#10;import sys&#10;&#10;from functools import reduce&#10;&#10;import urllib.parse&#10;import email.message, email.parser, email.policy&#10;from email.utils import parsedate_to_datetime, formatdate, formataddr&#10;&#10;import compoundfiles&#10;&#10;def rm_main():&#10;&#9;eml = load('%{old_file_path}')&#10;&#9;emlString = str(eml)&#10;&#9;file = open(&quot;%{new_file_path}&quot;,&quot;w&quot;)&#10;&#9;file.write(emlString)&#10;&#9;file.close()&#10;&#10;# MAIN FUNCTIONS&#10;&#10;&#10;def load(filename_or_stream):&#10;  with compoundfiles.CompoundFileReader(filename_or_stream) as doc:&#10;    doc.rtf_attachments = 0&#10;    return load_message_stream(doc.root, True, doc)&#10;&#10;&#10;def load_message_stream(entry, is_top_level, doc):&#10;  # Load stream data.&#10;  props = parse_properties(entry['__properties_version1.0'], is_top_level, entry, doc)&#10;&#10;  # Construct the MIME message....&#10;  msg = email.message.EmailMessage()&#10;&#10;  # Add the raw headers, if known.&#10;  if 'TRANSPORT_MESSAGE_HEADERS' in props:&#10;    # Get the string holding all of the headers.&#10;    headers = props['TRANSPORT_MESSAGE_HEADERS']&#10;    if isinstance(headers, bytes):&#10;      headers = headers.decode(&quot;utf-8&quot;)&#10;&#10;    # Remove content-type header because the body we can get this&#10;    # way is just the plain-text portion of the email and whatever&#10;    # Content-Type header was in the original is not valid for&#10;    # reconstructing it this way.&#10;    headers = re.sub(&quot;Content-Type: .*(\n\s.*)*\n&quot;, &quot;&quot;, headers, re.I)&#10;&#10;    # Parse them.&#10;    headers = email.parser.HeaderParser(policy=email.policy.default)\&#10;      .parsestr(headers)&#10;&#10;    # Copy them into the message object.&#10;    for header, value in headers.items():&#10;      msg[header] = value&#10;&#10;  else:&#10;    # Construct common headers from metadata.&#10;&#10;    if 'MESSAGE_DELIVERY_TIME' in props:&#10;        msg['Date'] = formatdate(props['MESSAGE_DELIVERY_TIME'].timestamp())&#10;        del props['MESSAGE_DELIVERY_TIME']&#10;&#10;    if 'SENDER_NAME' in props:&#10;        if 'SENT_REPRESENTING_NAME' in props:&#10;            if props['SENT_REPRESENTING_NAME']:&#10;                if props['SENDER_NAME'] != props['SENT_REPRESENTING_NAME']:&#10;                  props['SENDER_NAME'] += &quot; (&quot; + props['SENT_REPRESENTING_NAME'] + &quot;)&quot;&#10;            del props['SENT_REPRESENTING_NAME']&#10;        if props['SENDER_NAME']:&#10;            msg['From'] = formataddr((props['SENDER_NAME'], &quot;&quot;))&#10;        del props['SENDER_NAME']&#10;&#10;    if 'DISPLAY_TO' in props:&#10;        if props['DISPLAY_TO']:&#10;            msg['To'] = props['DISPLAY_TO']&#10;        del props['DISPLAY_TO']&#10;&#10;    if 'DISPLAY_CC' in props:&#10;        if props['DISPLAY_CC']:&#10;            msg['CC'] = props['DISPLAY_CC']&#10;        del props['DISPLAY_CC']&#10;&#10;    if 'DISPLAY_BCC' in props:&#10;        if props['DISPLAY_BCC']:&#10;            msg['BCC'] = props['DISPLAY_BCC']&#10;        del props['DISPLAY_BCC']&#10;&#10;    if 'SUBJECT' in props:&#10;        if props['SUBJECT']:&#10;            msg['Subject'] = props['SUBJECT']&#10;        del props['SUBJECT']&#10;&#10;  # Add the plain-text body from the BODY field.&#10;  if 'BODY' in props:&#10;    body = props['BODY']&#10;    if isinstance(body, str):&#10;      msg.set_content(body, cte='quoted-printable')&#10;    else:&#10;      msg.set_content(body, maintype=&quot;text&quot;, subtype=&quot;plain&quot;, cte='8bit')&#10;&#10;  # Plain-text is not availabe. Use the rich text version.&#10;  else:&#10;    doc.rtf_attachments += 1&#10;    fn = &quot;messagebody_{}.rtf&quot;.format(doc.rtf_attachments)&#10;&#10;    msg.set_content(&#10;      &quot;&lt;no plain text message body --- see attachment {}&gt;&quot;.format(fn),&#10;      cte='quoted-printable')&#10;&#10;    # Decompress the value to Rich Text Format.&#10;    import compressed_rtf&#10;    rtf = props['RTF_COMPRESSED']&#10;    rtf = compressed_rtf.decompress(rtf)&#10;&#10;    # Add RTF file as an attachment.&#10;    msg.add_attachment(&#10;      rtf,&#10;      maintype=&quot;text&quot;, subtype=&quot;rtf&quot;,&#10;      filename=fn)&#10;&#10;  # # Copy over string values of remaining properties as headers&#10;  # # so we don't lose any information.&#10;  # for k, v in props.items():&#10;  #   if k == 'RTF_COMPRESSED': continue # not interested, save output&#10;  #   msg[k] = str(v)&#10;&#10;  # Add attachments.&#10;  for stream in entry:&#10;    if stream.name.startswith(&quot;__attach_version1.0_#&quot;):&#10;      process_attachment(msg, stream, doc)&#10;&#10;  return msg&#10;&#10;&#10;def process_attachment(msg, entry, doc):&#10;  # Load attachment stream.&#10;  props = parse_properties(entry['__properties_version1.0'], False, entry, doc)&#10;&#10;  # The attachment content...&#10;  blob = props['ATTACH_DATA_BIN']&#10;&#10;  # Get the filename and MIME type of the attachment.&#10;  filename = props.get(&quot;ATTACH_LONG_FILENAME&quot;) or props.get(&quot;ATTACH_FILENAME&quot;) or props.get(&quot;DISPLAY_NAME&quot;)&#10;  if isinstance(filename, bytes): filename = filename.decode(&quot;utf8&quot;)&#10;&#10;  mime_type = props.get('ATTACH_MIME_TAG', 'application/octet-stream')&#10;  if isinstance(mime_type, bytes): mime_type = mime_type.decode(&quot;utf8&quot;)&#10;&#10;  filename = urllib.parse.quote_plus(filename)&#10;&#10;  # Python 3.6.&#10;  if isinstance(blob, str):&#10;    msg.add_attachment(&#10;      blob,&#10;      filename=filename)&#10;  elif isinstance(blob, bytes):&#10;    msg.add_attachment(&#10;      blob,&#10;      maintype=mime_type.split(&quot;/&quot;, 1)[0], subtype=mime_type.split(&quot;/&quot;, 1)[-1],&#10;      filename=filename)&#10;  else: # a Message instance&#10;    msg.add_attachment(&#10;      blob,&#10;      filename=filename)&#10;&#10;def parse_properties(properties, is_top_level, container, doc):&#10;  # Read a properties stream and return a Python dictionary&#10;  # of the fields and values, using human-readable field names&#10;  # in the mapping at the top of this module.&#10;&#10;  # Load stream content.&#10;  with doc.open(properties) as stream:&#10;    stream = stream.read()&#10;&#10;  # Skip header.&#10;  i = (32 if is_top_level else 24)&#10;&#10;  # Read 16-byte entries.&#10;  ret = { }&#10;  while i &lt; len(stream):&#10;    # Read the entry.&#10;    property_type  = stream[i+0:i+2]&#10;    property_tag = stream[i+2:i+4]&#10;    flags = stream[i+4:i+8]&#10;    value = stream[i+8:i+16]&#10;    i += 16&#10;&#10;    # Turn the byte strings into numbers and look up the property type.&#10;    property_type = property_type[0] + (property_type[1]&lt;&lt;8)&#10;    property_tag = property_tag[0] + (property_tag[1]&lt;&lt;8)&#10;    if property_tag not in property_tags: continue # should not happen&#10;    tag_name, _ = property_tags[property_tag]&#10;    tag_type = property_types.get(property_type)&#10;&#10;    # Fixed Length Properties.&#10;    if isinstance(tag_type, FixedLengthValueLoader):&#10;      value = tag_type.load(value)&#10;&#10;    # Variable Length Properties.&#10;    elif isinstance(tag_type, VariableLengthValueLoader):&#10;      value_length = stream[i+8:i+12] # not used&#10;&#10;      # Look up the stream in the document that holds the value.&#10;      streamname = &quot;__substg1.0_{0:0{1}X}{2:0{3}X}&quot;.format(property_tag,4, property_type,4)&#10;      try:&#10;        with doc.open(container[streamname]) as innerstream:&#10;          value = innerstream.read()&#10;      except:&#10;        # Stream isn't present!&#10;        print(&quot;stream missing&quot;, streamname, file=sys.stderr)&#10;        continue&#10;&#10;      value = tag_type.load(value)&#10;&#10;    elif isinstance(tag_type, EMBEDDED_MESSAGE):&#10;      # Look up the stream in the document that holds the attachment.&#10;      streamname = &quot;__substg1.0_{0:0{1}X}{2:0{3}X}&quot;.format(property_tag,4, property_type,4)&#10;      try:&#10;        value = container[streamname]&#10;      except:&#10;        # Stream isn't present!&#10;        print(&quot;stream missing&quot;, streamname, file=sys.stderr)&#10;        continue&#10;      value = tag_type.load(value, doc)&#10;&#10;    else:&#10;      # unrecognized type&#10;      print(&quot;unhandled property type&quot;, hex(property_type), file=sys.stderr)&#10;      continue&#10;&#10;    ret[tag_name] = value&#10;&#10;  return ret&#10;&#10;&#10;# PROPERTY VALUE LOADERS&#10;&#10;class FixedLengthValueLoader(object):&#10;  pass&#10;&#10;class NULL(FixedLengthValueLoader):&#10;  @staticmethod&amp;#10;  def load(value):&#10;    # value is an eight-byte long bytestring with unused content.&#10;    return None&#10;&#10;class BOOLEAN(FixedLengthValueLoader):&#10;  @staticmethod&amp;#10;  def load(value):&#10;    # value is an eight-byte long bytestring holding a two-byte integer.&#10;    return value[0] == 1&#10;&#10;class INTEGER16(FixedLengthValueLoader):&#10;  @staticmethod&amp;#10;  def load(value):&#10;    # value is an eight-byte long bytestring holding a two-byte integer.&#10;    return reduce(lambda a, b : (a&lt;&lt;8)+b, reversed(value[0:2]))&#10;&#10;class INTEGER32(FixedLengthValueLoader):&#10;  @staticmethod&amp;#10;  def load(value):&#10;    # value is an eight-byte long bytestring holding a four-byte integer.&#10;    return reduce(lambda a, b : (a&lt;&lt;8)+b, reversed(value[0:4]))&#10;&#10;class INTEGER64(FixedLengthValueLoader):&#10;  @staticmethod&amp;#10;  def load(value):&#10;    # value is an eight-byte long bytestring holding an eight-byte integer.&#10;    return reduce(lambda a, b : (a&lt;&lt;8)+b, reversed(value))&#10;&#10;class INTTIME(FixedLengthValueLoader):&#10;  @staticmethod&amp;#10;  def load(value):&#10;    # value is an eight-byte long bytestring encoding the integer number of&#10;    # 100-nanosecond intervals since January 1, 1601.&#10;    from datetime import datetime, timedelta&#10;    value = reduce(lambda a, b : (a&lt;&lt;8)+b, reversed(value)) # bytestring to integer&#10;    value = datetime(1601, 1, 1) + timedelta(seconds=value/10000000)&#10;    return value&#10;&#10;# TODO: The other fixed-length data types:&#10;# &quot;FLOAT&quot;, &quot;DOUBLE&quot;, &quot;CURRENCY&quot;, &quot;APPTIME&quot;, &quot;ERROR&quot;&#10;&#10;class VariableLengthValueLoader(object):&#10;  pass&#10;&#10;class BINARY(VariableLengthValueLoader):&#10;  @staticmethod&amp;#10;  def load(value):&#10;    # value is a bytestring. Just return it.&#10;    return value&#10;&#10;class STRING8(VariableLengthValueLoader):&#10;  @staticmethod&amp;#10;  def load(value):&#10;    # value is a bytestring. I haven't seen specified what character encoding&#10;    # is used when the Unicode storage type is not used, so we'll assume it's&#10;    # ASCII or Latin-1 like but we'll use UTF-8 to cover the bases.&#10;    return value.decode(&quot;utf8&quot;)&#10;&#10;class UNICODE(VariableLengthValueLoader):&#10;  @staticmethod&amp;#10;  def load(value):&#10;    # value is a bytestring. I haven't seen specified what character encoding&#10;    # is used when the Unicode storage type is not used, so we'll assume it's&#10;    # ASCII or Latin-1 like but we'll use UTF-8 to cover the bases.&#10;    return value.decode(&quot;utf16&quot;)&#10;&#10;# TODO: The other variable-length tag types are &quot;CLSID&quot;, &quot;OBJECT&quot;.&#10;&#10;class EMBEDDED_MESSAGE(object):&#10;  @staticmethod&amp;#10;  def load(entry, doc):&#10;    return load_message_stream(entry, False, doc)&#10;&#10;&#10;# CONSTANTS&#10;&#10;# These constants are defined by the Microsoft Outlook file format&#10;# and identify the data types and data fields in the .msg file.&#10;&#10;# from mapidefs.h via https://github.com/inverse-inc/openchange.old/blob/master/libmapi/mapidefs.h&#10;property_types = {&#10;  0x1: NULL(),&#10;  0x2: INTEGER16(),&#10;  0x3: INTEGER32(),&#10;  0x4: &quot;FLOAT&quot;,&#10;  0x5: &quot;DOUBLE&quot;,&#10;  0x6: &quot;CURRENCY&quot;,&#10;  0x7: &quot;APPTIME&quot;,&#10;  0xa: &quot;ERROR&quot;,&#10;  0xb: BOOLEAN(),&#10;  0xd: EMBEDDED_MESSAGE(),&#10;  0x14: INTEGER64(),&#10;  0x1e: STRING8(),&#10;  0x1f: UNICODE(),&#10;  0x40: INTTIME(),&#10;  0x48: &quot;CLSID&quot;,&#10;  0xFB: &quot;SVREID&quot;,&#10;  0xFD: &quot;SRESTRICT&quot;,&#10;  0xFE: &quot;ACTIONS&quot;,&#10;  0x102: BINARY(),&#10;}&#10;&#10;# from mapitags.h via https://github.com/mvz/email-outlook-message-perl/blob/master/mapitags.h&#10;property_tags = {&#10;  0x01: ('ACKNOWLEDGEMENT_MODE', 'I4'),&#10;  0x02: ('ALTERNATE_RECIPIENT_ALLOWED', 'BOOLEAN'),&#10;  0x03: ('AUTHORIZING_USERS', 'BINARY'),&#10;  # Comment on an automatically forwarded message&#10;  0x04: ('AUTO_FORWARD_COMMENT', 'STRING'),&#10;  # Whether a message has been automatically forwarded&#10;  0x05: ('AUTO_FORWARDED', 'BOOLEAN'),&#10;  0x06: ('CONTENT_CONFIDENTIALITY_ALGORITHM_ID', 'BINARY'),&#10;  0x07: ('CONTENT_CORRELATOR', 'BINARY'),&#10;  0x08: ('CONTENT_IDENTIFIER', 'STRING'),&#10;  # MIME content length&#10;  0x09: ('CONTENT_LENGTH', 'I4'),&#10;  0x0A: ('CONTENT_RETURN_REQUESTED', 'BOOLEAN'),&#10;  0x0B: ('CONVERSATION_KEY', 'BINARY'),&#10;  0x0C: ('CONVERSION_EITS', 'BINARY'),&#10;  0x0D: ('CONVERSION_WITH_LOSS_PROHIBITED', 'BOOLEAN'),&#10;  0x0E: ('CONVERTED_EITS', 'BINARY'),&#10;  # Time to deliver for delayed delivery messages&#10;  0x0F: ('DEFERRED_DELIVERY_TIME', 'SYSTIME'),&#10;  0x10: ('DELIVER_TIME', 'SYSTIME'),&#10;  # Reason a message was discarded&#10;  0x11: ('DISCARD_REASON', 'I4'),&#10;  0x12: ('DISCLOSURE_OF_RECIPIENTS', 'BOOLEAN'),&#10;  0x13: ('DL_EXPANSION_HISTORY', 'BINARY'),&#10;  0x14: ('DL_EXPANSION_PROHIBITED', 'BOOLEAN'),&#10;  0x15: ('EXPIRY_TIME', 'SYSTIME'),&#10;  0x16: ('IMPLICIT_CONVERSION_PROHIBITED', 'BOOLEAN'),&#10;  # Message importance&#10;  0x17: ('IMPORTANCE', 'I4'),&#10;  0x18: ('IPM_ID', 'BINARY'),&#10;  0x19: ('LATEST_DELIVERY_TIME', 'SYSTIME'),&#10;  0x1A: ('MESSAGE_CLASS', 'STRING'),&#10;  0x1B: ('MESSAGE_DELIVERY_ID', 'BINARY'),&#10;  0x1E: ('MESSAGE_SECURITY_LABEL', 'BINARY'),&#10;  0x1F: ('OBSOLETED_IPMS', 'BINARY'),&#10;  # Person a message was originally for&#10;  0x20: ('ORIGINALLY_INTENDED_RECIPIENT_NAME', 'BINARY'),&#10;  0x21: ('ORIGINAL_EITS', 'BINARY'),&#10;  0x22: ('ORIGINATOR_CERTIFICATE', 'BINARY'),&#10;  0x23: ('ORIGINATOR_DELIVERY_REPORT_REQUESTED', 'BOOLEAN'),&#10;  # Address of the message sender&#10;  0x24: ('ORIGINATOR_RETURN_ADDRESS', 'BINARY'),&#10;  0x25: ('PARENT_KEY', 'BINARY'),&#10;  0x26: ('PRIORITY', 'I4'),&#10;  0x27: ('ORIGIN_CHECK', 'BINARY'),&#10;  0x28: ('PROOF_OF_SUBMISSION_REQUESTED', 'BOOLEAN'),&#10;  # Whether a read receipt is desired&#10;  0x29: ('READ_RECEIPT_REQUESTED', 'BOOLEAN'),&#10;  # Time a message was received&#10;  0x2A: ('RECEIPT_TIME', 'SYSTIME'),&#10;  0x2B: ('RECIPIENT_REASSIGNMENT_PROHIBITED', 'BOOLEAN'),&#10;  0x2C: ('REDIRECTION_HISTORY', 'BINARY'),&#10;  0x2D: ('RELATED_IPMS', 'BINARY'),&#10;  # Sensitivity of the original message&#10;  0x2E: ('ORIGINAL_SENSITIVITY', 'I4'),&#10;  0x2F: ('LANGUAGES', 'STRING'),&#10;  0x30: ('REPLY_TIME', 'SYSTIME'),&#10;  0x31: ('REPORT_TAG', 'BINARY'),&#10;  0x32: ('REPORT_TIME', 'SYSTIME'),&#10;  0x33: ('RETURNED_IPM', 'BOOLEAN'),&#10;  0x34: ('SECURITY', 'I4'),&#10;  0x35: ('INCOMPLETE_COPY', 'BOOLEAN'),&#10;  0x36: ('SENSITIVITY', 'I4'),&#10;  # The message subject&#10;  0x37: ('SUBJECT', 'STRING'),&#10;  0x38: ('SUBJECT_IPM', 'BINARY'),&#10;  0x39: ('CLIENT_SUBMIT_TIME', 'SYSTIME'),&#10;  0x3A: ('REPORT_NAME', 'STRING'),&#10;  0x3B: ('SENT_REPRESENTING_SEARCH_KEY', 'BINARY'),&#10;  0x3C: ('X400_CONTENT_TYPE', 'BINARY'),&#10;  0x3D: ('SUBJECT_PREFIX', 'STRING'),&#10;  0x3E: ('NON_RECEIPT_REASON', 'I4'),&#10;  0x3F: ('RECEIVED_BY_ENTRYID', 'BINARY'),&#10;  # Received by: entry&#10;  0x40: ('RECEIVED_BY_NAME', 'STRING'),&#10;  0x41: ('SENT_REPRESENTING_ENTRYID', 'BINARY'),&#10;  0x42: ('SENT_REPRESENTING_NAME', 'STRING'),&#10;  0x43: ('RCVD_REPRESENTING_ENTRYID', 'BINARY'),&#10;  0x44: ('RCVD_REPRESENTING_NAME', 'STRING'),&#10;  0x45: ('REPORT_ENTRYID', 'BINARY'),&#10;  0x46: ('READ_RECEIPT_ENTRYID', 'BINARY'),&#10;  0x47: ('MESSAGE_SUBMISSION_ID', 'BINARY'),&#10;  0x48: ('PROVIDER_SUBMIT_TIME', 'SYSTIME'),&#10;  # Subject of the original message&#10;  0x49: ('ORIGINAL_SUBJECT', 'STRING'),&#10;  0x4A: ('DISC_VAL', 'BOOLEAN'),&#10;  0x4B: ('ORIG_MESSAGE_CLASS', 'STRING'),&#10;  0x4C: ('ORIGINAL_AUTHOR_ENTRYID', 'BINARY'),&#10;  # Author of the original message&#10;  0x4D: ('ORIGINAL_AUTHOR_NAME', 'STRING'),&#10;  # Time the original message was submitted&#10;  0x4E: ('ORIGINAL_SUBMIT_TIME', 'SYSTIME'),&#10;  0x4F: ('REPLY_RECIPIENT_ENTRIES', 'BINARY'),&#10;  0x50: ('REPLY_RECIPIENT_NAMES', 'STRING'),&#10;  0x51: ('RECEIVED_BY_SEARCH_KEY', 'BINARY'),&#10;  0x52: ('RCVD_REPRESENTING_SEARCH_KEY', 'BINARY'),&#10;  0x53: ('READ_RECEIPT_SEARCH_KEY', 'BINARY'),&#10;  0x54: ('REPORT_SEARCH_KEY', 'BINARY'),&#10;  0x55: ('ORIGINAL_DELIVERY_TIME', 'SYSTIME'),&#10;  0x56: ('ORIGINAL_AUTHOR_SEARCH_KEY', 'BINARY'),&#10;  0x57: ('MESSAGE_TO_ME', 'BOOLEAN'),&#10;  0x58: ('MESSAGE_CC_ME', 'BOOLEAN'),&#10;  0x59: ('MESSAGE_RECIP_ME', 'BOOLEAN'),&#10;  # Sender of the original message&#10;  0x5A: ('ORIGINAL_SENDER_NAME', 'STRING'),&#10;  0x5B: ('ORIGINAL_SENDER_ENTRYID', 'BINARY'),&#10;  0x5C: ('ORIGINAL_SENDER_SEARCH_KEY', 'BINARY'),&#10;  0x5D: ('ORIGINAL_SENT_REPRESENTING_NAME', 'STRING'),&#10;  0x5E: ('ORIGINAL_SENT_REPRESENTING_ENTRYID', 'BINARY'),&#10;  0x5F: ('ORIGINAL_SENT_REPRESENTING_SEARCH_KEY', 'BINARY'),&#10;  0x60: ('START_DATE', 'SYSTIME'),&#10;  0x61: ('END_DATE', 'SYSTIME'),&#10;  0x62: ('OWNER_APPT_ID', 'I4'),&#10;  # Whether a response to the message is desired&#10;  0x63: ('RESPONSE_REQUESTED', 'BOOLEAN'),&#10;  0x64: ('SENT_REPRESENTING_ADDRTYPE', 'STRING'),&#10;  0x65: ('SENT_REPRESENTING_EMAIL_ADDRESS', 'STRING'),&#10;  0x66: ('ORIGINAL_SENDER_ADDRTYPE', 'STRING'),&#10;  # Email of the original message sender&#10;  0x67: ('ORIGINAL_SENDER_EMAIL_ADDRESS', 'STRING'),&#10;  0x68: ('ORIGINAL_SENT_REPRESENTING_ADDRTYPE', 'STRING'),&#10;  0x69: ('ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS', 'STRING'),&#10;  0x70: ('CONVERSATION_TOPIC', 'STRING'),&#10;  0x71: ('CONVERSATION_INDEX', 'BINARY'),&#10;  0x72: ('ORIGINAL_DISPLAY_BCC', 'STRING'),&#10;  0x73: ('ORIGINAL_DISPLAY_CC', 'STRING'),&#10;  0x74: ('ORIGINAL_DISPLAY_TO', 'STRING'),&#10;  0x75: ('RECEIVED_BY_ADDRTYPE', 'STRING'),&#10;  0x76: ('RECEIVED_BY_EMAIL_ADDRESS', 'STRING'),&#10;  0x77: ('RCVD_REPRESENTING_ADDRTYPE', 'STRING'),&#10;  0x78: ('RCVD_REPRESENTING_EMAIL_ADDRESS', 'STRING'),&#10;  0x79: ('ORIGINAL_AUTHOR_ADDRTYPE', 'STRING'),&#10;  0x7A: ('ORIGINAL_AUTHOR_EMAIL_ADDRESS', 'STRING'),&#10;  0x7B: ('ORIGINALLY_INTENDED_RECIP_ADDRTYPE', 'STRING'),&#10;  0x7C: ('ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS', 'STRING'),&#10;  0x7D: ('TRANSPORT_MESSAGE_HEADERS', 'STRING'),&#10;  0x7E: ('DELEGATION', 'BINARY'),&#10;  0x7F: ('TNEF_CORRELATION_KEY', 'BINARY'),&#10;  0x1000: ('BODY', 'STRING'),&#10;  0x1001: ('REPORT_TEXT', 'STRING'),&#10;  0x1002: ('ORIGINATOR_AND_DL_EXPANSION_HISTORY', 'BINARY'),&#10;  0x1003: ('REPORTING_DL_NAME', 'BINARY'),&#10;  0x1004: ('REPORTING_MTA_CERTIFICATE', 'BINARY'),&#10;  0x1006: ('RTF_SYNC_BODY_CRC', 'I4'),&#10;  0x1007: ('RTF_SYNC_BODY_COUNT', 'I4'),&#10;  0x1008: ('RTF_SYNC_BODY_TAG', 'STRING'),&#10;  0x1009: ('RTF_COMPRESSED', 'BINARY'),&#10;  0x1010: ('RTF_SYNC_PREFIX_COUNT', 'I4'),&#10;  0x1011: ('RTF_SYNC_TRAILING_COUNT', 'I4'),&#10;  0x1012: ('ORIGINALLY_INTENDED_RECIP_ENTRYID', 'BINARY'),&#10;  0x0C00: ('CONTENT_INTEGRITY_CHECK', 'BINARY'),&#10;  0x0C01: ('EXPLICIT_CONVERSION', 'I4'),&#10;  0x0C02: ('IPM_RETURN_REQUESTED', 'BOOLEAN'),&#10;  0x0C03: ('MESSAGE_TOKEN', 'BINARY'),&#10;  0x0C04: ('NDR_REASON_CODE', 'I4'),&#10;  0x0C05: ('NDR_DIAG_CODE', 'I4'),&#10;  0x0C06: ('NON_RECEIPT_NOTIFICATION_REQUESTED', 'BOOLEAN'),&#10;  0x0C07: ('DELIVERY_POINT', 'I4'),&#10;  0x0C08: ('ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED', 'BOOLEAN'),&#10;  0x0C09: ('ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT', 'BINARY'),&#10;  0x0C0A: ('PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY', 'BOOLEAN'),&#10;  0x0C0B: ('PHYSICAL_DELIVERY_MODE', 'I4'),&#10;  0x0C0C: ('PHYSICAL_DELIVERY_REPORT_REQUEST', 'I4'),&#10;  0x0C0D: ('PHYSICAL_FORWARDING_ADDRESS', 'BINARY'),&#10;  0x0C0E: ('PHYSICAL_FORWARDING_ADDRESS_REQUESTED', 'BOOLEAN'),&#10;  0x0C0F: ('PHYSICAL_FORWARDING_PROHIBITED', 'BOOLEAN'),&#10;  0x0C10: ('PHYSICAL_RENDITION_ATTRIBUTES', 'BINARY'),&#10;  0x0C11: ('PROOF_OF_DELIVERY', 'BINARY'),&#10;  0x0C12: ('PROOF_OF_DELIVERY_REQUESTED', 'BOOLEAN'),&#10;  0x0C13: ('RECIPIENT_CERTIFICATE', 'BINARY'),&#10;  0x0C14: ('RECIPIENT_NUMBER_FOR_ADVICE', 'STRING'),&#10;  0x0C15: ('RECIPIENT_TYPE', 'I4'),&#10;  0x0C16: ('REGISTERED_MAIL_TYPE', 'I4'),&#10;  0x0C17: ('REPLY_REQUESTED', 'BOOLEAN'),&#10;  0x0C18: ('REQUESTED_DELIVERY_METHOD', 'I4'),&#10;  0x0C19: ('SENDER_ENTRYID', 'BINARY'),&#10;  0x0C1A: ('SENDER_NAME', 'STRING'),&#10;  0x0C1B: ('SUPPLEMENTARY_INFO', 'STRING'),&#10;  0x0C1C: ('TYPE_OF_MTS_USER', 'I4'),&#10;  0x0C1D: ('SENDER_SEARCH_KEY', 'BINARY'),&#10;  0x0C1E: ('SENDER_ADDRTYPE', 'STRING'),&#10;  0x0C1F: ('SENDER_EMAIL_ADDRESS', 'STRING'),&#10;  0x0E00: ('CURRENT_VERSION', 'I8'),&#10;  0x0E01: ('DELETE_AFTER_SUBMIT', 'BOOLEAN'),&#10;  0x0E02: ('DISPLAY_BCC', 'STRING'),&#10;  0x0E03: ('DISPLAY_CC', 'STRING'),&#10;  0x0E04: ('DISPLAY_TO', 'STRING'),&#10;  0x0E05: ('PARENT_DISPLAY', 'STRING'),&#10;  0x0E06: ('MESSAGE_DELIVERY_TIME', 'SYSTIME'),&#10;  0x0E07: ('MESSAGE_FLAGS', 'I4'),&#10;  0x0E08: ('MESSAGE_SIZE', 'I4'),&#10;  0x0E09: ('PARENT_ENTRYID', 'BINARY'),&#10;  0x0E0A: ('SENTMAIL_ENTRYID', 'BINARY'),&#10;  0x0E0C: ('CORRELATE', 'BOOLEAN'),&#10;  0x0E0D: ('CORRELATE_MTSID', 'BINARY'),&#10;  0x0E0E: ('DISCRETE_VALUES', 'BOOLEAN'),&#10;  0x0E0F: ('RESPONSIBILITY', 'BOOLEAN'),&#10;  0x0E10: ('SPOOLER_STATUS', 'I4'),&#10;  0x0E11: ('TRANSPORT_STATUS', 'I4'),&#10;  0x0E12: ('MESSAGE_RECIPIENTS', 'OBJECT'),&#10;  0x0E13: ('MESSAGE_ATTACHMENTS', 'OBJECT'),&#10;  0x0E14: ('SUBMIT_FLAGS', 'I4'),&#10;  0x0E15: ('RECIPIENT_STATUS', 'I4'),&#10;  0x0E16: ('TRANSPORT_KEY', 'I4'),&#10;  0x0E17: ('MSG_STATUS', 'I4'),&#10;  0x0E18: ('MESSAGE_DOWNLOAD_TIME', 'I4'),&#10;  0x0E19: ('CREATION_VERSION', 'I8'),&#10;  0x0E1A: ('MODIFY_VERSION', 'I8'),&#10;  0x0E1B: ('HASATTACH', 'BOOLEAN'),&#10;  0x0E1D: ('NORMALIZED_SUBJECT', 'STRING'),&#10;  0x0E1F: ('RTF_IN_SYNC', 'BOOLEAN'),&#10;  0x0E20: ('ATTACH_SIZE', 'I4'),&#10;  0x0E21: ('ATTACH_NUM', 'I4'),&#10;  0x0E22: ('PREPROCESS', 'BOOLEAN'),&#10;  0x0E25: ('ORIGINATING_MTA_CERTIFICATE', 'BINARY'),&#10;  0x0E26: ('PROOF_OF_SUBMISSION', 'BINARY'),&#10;  # A unique identifier for editing the properties of a MAPI object&#10;  0x0FFF: ('ENTRYID', 'BINARY'),&#10;  # The type of an object&#10;  0x0FFE: ('OBJECT_TYPE', 'I4'),&#10;  0x0FFD: ('ICON', 'BINARY'),&#10;  0x0FFC: ('MINI_ICON', 'BINARY'),&#10;  0x0FFB: ('STORE_ENTRYID', 'BINARY'),&#10;  0x0FFA: ('STORE_RECORD_KEY', 'BINARY'),&#10;  # Binary identifer for an individual object&#10;  0x0FF9: ('RECORD_KEY', 'BINARY'),&#10;  0x0FF8: ('MAPPING_SIGNATURE', 'BINARY'),&#10;  0x0FF7: ('ACCESS_LEVEL', 'I4'),&#10;  # The primary key of a column in a table&#10;  0x0FF6: ('INSTANCE_KEY', 'BINARY'),&#10;  0x0FF5: ('ROW_TYPE', 'I4'),&#10;  0x0FF4: ('ACCESS', 'I4'),&#10;  0x3000: ('ROWID', 'I4'),&#10;  # The name to display for a given MAPI object&#10;  0x3001: ('DISPLAY_NAME', 'STRING'),&#10;  0x3002: ('ADDRTYPE', 'STRING'),&#10;  # An email address&#10;  0x3003: ('EMAIL_ADDRESS', 'STRING'),&#10;  # A comment field&#10;  0x3004: ('COMMENT', 'STRING'),&#10;  0x3005: ('DEPTH', 'I4'),&#10;  # Provider-defined display name for a service provider&#10;  0x3006: ('PROVIDER_DISPLAY', 'STRING'),&#10;  # The time an object was created&#10;  0x3007: ('CREATION_TIME', 'SYSTIME'),&#10;  # The time an object was last modified&#10;  0x3008: ('LAST_MODIFICATION_TIME', 'SYSTIME'),&#10;  # Flags describing a service provider, message service, or status object&#10;  0x3009: ('RESOURCE_FLAGS', 'I4'),&#10;  # The name of a provider dll, minus any &quot;32&quot; suffix and &quot;.dll&quot;&#10;  0x300A: ('PROVIDER_DLL_NAME', 'STRING'),&#10;  0x300B: ('SEARCH_KEY', 'BINARY'),&#10;  0x300C: ('PROVIDER_UID', 'BINARY'),&#10;  0x300D: ('PROVIDER_ORDINAL', 'I4'),&#10;  0x3301: ('FORM_VERSION', 'STRING'),&#10;  0x3302: ('FORM_CLSID', 'CLSID'),&#10;  0x3303: ('FORM_CONTACT_NAME', 'STRING'),&#10;  0x3304: ('FORM_CATEGORY', 'STRING'),&#10;  0x3305: ('FORM_CATEGORY_SUB', 'STRING'),&#10;  0x3306: ('FORM_HOST_MAP', 'MV_LONG'),&#10;  0x3307: ('FORM_HIDDEN', 'BOOLEAN'),&#10;  0x3308: ('FORM_DESIGNER_NAME', 'STRING'),&#10;  0x3309: ('FORM_DESIGNER_GUID', 'CLSID'),&#10;  0x330A: ('FORM_MESSAGE_BEHAVIOR', 'I4'),&#10;  # Is this row the default message store?&#10;  0x3400: ('DEFAULT_STORE', 'BOOLEAN'),&#10;  0x340D: ('STORE_SUPPORT_MASK', 'I4'),&#10;  0x340E: ('STORE_STATE', 'I4'),&#10;  0x3410: ('IPM_SUBTREE_SEARCH_KEY', 'BINARY'),&#10;  0x3411: ('IPM_OUTBOX_SEARCH_KEY', 'BINARY'),&#10;  0x3412: ('IPM_WASTEBASKET_SEARCH_KEY', 'BINARY'),&#10;  0x3413: ('IPM_SENTMAIL_SEARCH_KEY', 'BINARY'),&#10;  # Provder-defined message store type&#10;  0x3414: ('MDB_PROVIDER', 'BINARY'),&#10;  0x3415: ('RECEIVE_FOLDER_SETTINGS', 'OBJECT'),&#10;  0x35DF: ('VALID_FOLDER_MASK', 'I4'),&#10;  0x35E0: ('IPM_SUBTREE_ENTRYID', 'BINARY'),&#10;  0x35E2: ('IPM_OUTBOX_ENTRYID', 'BINARY'),&#10;  0x35E3: ('IPM_WASTEBASKET_ENTRYID', 'BINARY'),&#10;  0x35E4: ('IPM_SENTMAIL_ENTRYID', 'BINARY'),&#10;  0x35E5: ('VIEWS_ENTRYID', 'BINARY'),&#10;  0x35E6: ('COMMON_VIEWS_ENTRYID', 'BINARY'),&#10;  0x35E7: ('FINDER_ENTRYID', 'BINARY'),&#10;  0x3600: ('CONTAINER_FLAGS', 'I4'),&#10;  0x3601: ('FOLDER_TYPE', 'I4'),&#10;  0x3602: ('CONTENT_COUNT', 'I4'),&#10;  0x3603: ('CONTENT_UNREAD', 'I4'),&#10;  0x3604: ('CREATE_TEMPLATES', 'OBJECT'),&#10;  0x3605: ('DETAILS_TABLE', 'OBJECT'),&#10;  0x3607: ('SEARCH', 'OBJECT'),&#10;  0x3609: ('SELECTABLE', 'BOOLEAN'),&#10;  0x360A: ('SUBFOLDERS', 'BOOLEAN'),&#10;  0x360B: ('STATUS', 'I4'),&#10;  0x360C: ('ANR', 'STRING'),&#10;  0x360D: ('CONTENTS_SORT_ORDER', 'MV_LONG'),&#10;  0x360E: ('CONTAINER_HIERARCHY', 'OBJECT'),&#10;  0x360F: ('CONTAINER_CONTENTS', 'OBJECT'),&#10;  0x3610: ('FOLDER_ASSOCIATED_CONTENTS', 'OBJECT'),&#10;  0x3611: ('DEF_CREATE_DL', 'BINARY'),&#10;  0x3612: ('DEF_CREATE_MAILUSER', 'BINARY'),&#10;  0x3613: ('CONTAINER_CLASS', 'STRING'),&#10;  0x3614: ('CONTAINER_MODIFY_VERSION', 'I8'),&#10;  0x3615: ('AB_PROVIDER_ID', 'BINARY'),&#10;  0x3616: ('DEFAULT_VIEW_ENTRYID', 'BINARY'),&#10;  0x3617: ('ASSOC_CONTENT_COUNT', 'I4'),&#10;  0x3700: ('ATTACHMENT_X400_PARAMETERS', 'BINARY'),&#10;  0x3701: ('ATTACH_DATA_OBJ', 'OBJECT'),&#10;  0x3701: ('ATTACH_DATA_BIN', 'BINARY'),&#10;  0x3702: ('ATTACH_ENCODING', 'BINARY'),&#10;  0x3703: ('ATTACH_EXTENSION', 'STRING'),&#10;  0x3704: ('ATTACH_FILENAME', 'STRING'),&#10;  0x3705: ('ATTACH_METHOD', 'I4'),&#10;  0x3707: ('ATTACH_LONG_FILENAME', 'STRING'),&#10;  0x3708: ('ATTACH_PATHNAME', 'STRING'),&#10;  0x370A: ('ATTACH_TAG', 'BINARY'),&#10;  0x370B: ('RENDERING_POSITION', 'I4'),&#10;  0x370C: ('ATTACH_TRANSPORT_NAME', 'STRING'),&#10;  0x370D: ('ATTACH_LONG_PATHNAME', 'STRING'),&#10;  0x370E: ('ATTACH_MIME_TAG', 'STRING'),&#10;  0x370F: ('ATTACH_ADDITIONAL_INFO', 'BINARY'),&#10;  0x3900: ('DISPLAY_TYPE', 'I4'),&#10;  0x3902: ('TEMPLATEID', 'BINARY'),&#10;  0x3904: ('PRIMARY_CAPABILITY', 'BINARY'),&#10;  0x39FF: ('7BIT_DISPLAY_NAME', 'STRING'),&#10;  0x3A00: ('ACCOUNT', 'STRING'),&#10;  0x3A01: ('ALTERNATE_RECIPIENT', 'BINARY'),&#10;  0x3A02: ('CALLBACK_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A03: ('CONVERSION_PROHIBITED', 'BOOLEAN'),&#10;  0x3A04: ('DISCLOSE_RECIPIENTS', 'BOOLEAN'),&#10;  0x3A05: ('GENERATION', 'STRING'),&#10;  0x3A06: ('GIVEN_NAME', 'STRING'),&#10;  0x3A07: ('GOVERNMENT_ID_NUMBER', 'STRING'),&#10;  0x3A08: ('BUSINESS_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A09: ('HOME_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A0A: ('INITIALS', 'STRING'),&#10;  0x3A0B: ('KEYWORD', 'STRING'),&#10;  0x3A0C: ('LANGUAGE', 'STRING'),&#10;  0x3A0D: ('LOCATION', 'STRING'),&#10;  0x3A0E: ('MAIL_PERMISSION', 'BOOLEAN'),&#10;  0x3A0F: ('MHS_COMMON_NAME', 'STRING'),&#10;  0x3A10: ('ORGANIZATIONAL_ID_NUMBER', 'STRING'),&#10;  0x3A11: ('SURNAME', 'STRING'),&#10;  0x3A12: ('ORIGINAL_ENTRYID', 'BINARY'),&#10;  0x3A13: ('ORIGINAL_DISPLAY_NAME', 'STRING'),&#10;  0x3A14: ('ORIGINAL_SEARCH_KEY', 'BINARY'),&#10;  0x3A15: ('POSTAL_ADDRESS', 'STRING'),&#10;  0x3A16: ('COMPANY_NAME', 'STRING'),&#10;  0x3A17: ('TITLE', 'STRING'),&#10;  0x3A18: ('DEPARTMENT_NAME', 'STRING'),&#10;  0x3A19: ('OFFICE_LOCATION', 'STRING'),&#10;  0x3A1A: ('PRIMARY_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A1B: ('BUSINESS2_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A1C: ('MOBILE_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A1D: ('RADIO_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A1E: ('CAR_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A1F: ('OTHER_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A20: ('TRANSMITABLE_DISPLAY_NAME', 'STRING'),&#10;  0x3A21: ('PAGER_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A22: ('USER_CERTIFICATE', 'BINARY'),&#10;  0x3A23: ('PRIMARY_FAX_NUMBER', 'STRING'),&#10;  0x3A24: ('BUSINESS_FAX_NUMBER', 'STRING'),&#10;  0x3A25: ('HOME_FAX_NUMBER', 'STRING'),&#10;  0x3A26: ('COUNTRY', 'STRING'),&#10;  0x3A27: ('LOCALITY', 'STRING'),&#10;  0x3A28: ('STATE_OR_PROVINCE', 'STRING'),&#10;  0x3A29: ('STREET_ADDRESS', 'STRING'),&#10;  0x3A2A: ('POSTAL_CODE', 'STRING'),&#10;  0x3A2B: ('POST_OFFICE_BOX', 'STRING'),&#10;  0x3A2C: ('TELEX_NUMBER', 'STRING'),&#10;  0x3A2D: ('ISDN_NUMBER', 'STRING'),&#10;  0x3A2E: ('ASSISTANT_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A2F: ('HOME2_TELEPHONE_NUMBER', 'STRING'),&#10;  0x3A30: ('ASSISTANT', 'STRING'),&#10;  0x3A40: ('SEND_RICH_INFO', 'BOOLEAN'),&#10;  0x3A41: ('WEDDING_ANNIVERSARY', 'SYSTIME'),&#10;  0x3A42: ('BIRTHDAY', 'SYSTIME'),&#10;  0x3A43: ('HOBBIES', 'STRING'),&#10;  0x3A44: ('MIDDLE_NAME', 'STRING'),&#10;  0x3A45: ('DISPLAY_NAME_PREFIX', 'STRING'),&#10;  0x3A46: ('PROFESSION', 'STRING'),&#10;  0x3A47: ('PREFERRED_BY_NAME', 'STRING'),&#10;  0x3A48: ('SPOUSE_NAME', 'STRING'),&#10;  0x3A49: ('COMPUTER_NETWORK_NAME', 'STRING'),&#10;  0x3A4A: ('CUSTOMER_ID', 'STRING'),&#10;  0x3A4B: ('TTYTDD_PHONE_NUMBER', 'STRING'),&#10;  0x3A4C: ('FTP_SITE', 'STRING'),&#10;  0x3A4D: ('GENDER', 'I2'),&#10;  0x3A4E: ('MANAGER_NAME', 'STRING'),&#10;  0x3A4F: ('NICKNAME', 'STRING'),&#10;  0x3A50: ('PERSONAL_HOME_PAGE', 'STRING'),&#10;  0x3A51: ('BUSINESS_HOME_PAGE', 'STRING'),&#10;  0x3A52: ('CONTACT_VERSION', 'CLSID'),&#10;  0x3A53: ('CONTACT_ENTRYIDS', 'MV_BINARY'),&#10;  0x3A54: ('CONTACT_ADDRTYPES', 'MV_STRING'),&#10;  0x3A55: ('CONTACT_DEFAULT_ADDRESS_INDEX', 'I4'),&#10;  0x3A56: ('CONTACT_EMAIL_ADDRESSES', 'MV_STRING'),&#10;  0x3A57: ('COMPANY_MAIN_PHONE_NUMBER', 'STRING'),&#10;  0x3A58: ('CHILDRENS_NAMES', 'MV_STRING'),&#10;  0x3A59: ('HOME_ADDRESS_CITY', 'STRING'),&#10;  0x3A5A: ('HOME_ADDRESS_COUNTRY', 'STRING'),&#10;  0x3A5B: ('HOME_ADDRESS_POSTAL_CODE', 'STRING'),&#10;  0x3A5C: ('HOME_ADDRESS_STATE_OR_PROVINCE', 'STRING'),&#10;  0x3A5D: ('HOME_ADDRESS_STREET', 'STRING'),&#10;  0x3A5E: ('HOME_ADDRESS_POST_OFFICE_BOX', 'STRING'),&#10;  0x3A5F: ('OTHER_ADDRESS_CITY', 'STRING'),&#10;  0x3A60: ('OTHER_ADDRESS_COUNTRY', 'STRING'),&#10;  0x3A61: ('OTHER_ADDRESS_POSTAL_CODE', 'STRING'),&#10;  0x3A62: ('OTHER_ADDRESS_STATE_OR_PROVINCE', 'STRING'),&#10;  0x3A63: ('OTHER_ADDRESS_STREET', 'STRING'),&#10;  0x3A64: ('OTHER_ADDRESS_POST_OFFICE_BOX', 'STRING'),&#10;  0x3D00: ('STORE_PROVIDERS', 'BINARY'),&#10;  0x3D01: ('AB_PROVIDERS', 'BINARY'),&#10;  0x3D02: ('TRANSPORT_PROVIDERS', 'BINARY'),&#10;  0x3D04: ('DEFAULT_PROFILE', 'BOOLEAN'),&#10;  0x3D05: ('AB_SEARCH_PATH', 'MV_BINARY'),&#10;  0x3D06: ('AB_DEFAULT_DIR', 'BINARY'),&#10;  0x3D07: ('AB_DEFAULT_PAB', 'BINARY'),&#10;  0x3D09: ('SERVICE_NAME', 'STRING'),&#10;  0x3D0A: ('SERVICE_DLL_NAME', 'STRING'),&#10;  0x3D0B: ('SERVICE_ENTRY_NAME', 'STRING'),&#10;  0x3D0C: ('SERVICE_UID', 'BINARY'),&#10;  0x3D0D: ('SERVICE_EXTRA_UIDS', 'BINARY'),&#10;  0x3D0E: ('SERVICES', 'BINARY'),&#10;  0x3D0F: ('SERVICE_SUPPORT_FILES', 'MV_STRING'),&#10;  0x3D10: ('SERVICE_DELETE_FILES', 'MV_STRING'),&#10;  0x3D11: ('AB_SEARCH_PATH_UPDATE', 'BINARY'),&#10;  0x3D12: ('PROFILE_NAME', 'STRING'),&#10;  0x3E00: ('IDENTITY_DISPLAY', 'STRING'),&#10;  0x3E01: ('IDENTITY_ENTRYID', 'BINARY'),&#10;  0x3E02: ('RESOURCE_METHODS', 'I4'),&#10;  # Service provider type&#10;  0x3E03: ('RESOURCE_TYPE', 'I4'),&#10;  0x3E04: ('STATUS_CODE', 'I4'),&#10;  0x3E05: ('IDENTITY_SEARCH_KEY', 'BINARY'),&#10;  0x3E06: ('OWN_STORE_ENTRYID', 'BINARY'),&#10;  0x3E07: ('RESOURCE_PATH', 'STRING'),&#10;  0x3E08: ('STATUS_STRING', 'STRING'),&#10;  0x3E09: ('X400_DEFERRED_DELIVERY_CANCEL', 'BOOLEAN'),&#10;  0x3E0A: ('HEADER_FOLDER_ENTRYID', 'BINARY'),&#10;  0x3E0B: ('REMOTE_PROGRESS', 'I4'),&#10;  0x3E0C: ('REMOTE_PROGRESS_TEXT', 'STRING'),&#10;  0x3E0D: ('REMOTE_VALIDATE_OK', 'BOOLEAN'),&#10;  0x3F00: ('CONTROL_FLAGS', 'I4'),&#10;  0x3F01: ('CONTROL_STRUCTURE', 'BINARY'),&#10;  0x3F02: ('CONTROL_TYPE', 'I4'),&#10;  0x3F03: ('DELTAX', 'I4'),&#10;  0x3F04: ('DELTAY', 'I4'),&#10;  0x3F05: ('XPOS', 'I4'),&#10;  0x3F06: ('YPOS', 'I4'),&#10;  0x3F07: ('CONTROL_ID', 'BINARY'),&#10;  0x3F08: ('INITIAL_DETAILS_PANE', 'I4'),&#10;}&#10;&#10;&#10;# COMMAND-LINE ENTRY POINT&#10;&#10;&#10;if __name__ == &quot;__main__&quot;:&#10;  # If no command-line arguments are given, convert the .msg&#10;  # file on STDIN to .eml format on STDOUT.&#10;  if len(sys.argv) &lt;= 1:&#10;    print(load(sys.stdin), file=sys.stdout)&#10;&#10;  # Otherwise, for each file mentioned on the command-line,&#10;  # convert it and save it to a file with &quot;.eml&quot; appended&#10;  # to the name.&#10;  else:&#10;    for fn in sys.argv[1:]:&#10;      print(fn + &quot;...&quot;)&#10;      msg = load(fn)&#10;      with open(fn + &quot;.eml&quot;, &quot;wb&quot;) as f:&#10;        f.write(msg.as_bytes())"/>
        <parameter key="notebook_cell_tag_filter" value=""/>
        <parameter key="use_default_python" value="true"/>
        <parameter key="package_manager" value="conda (anaconda)"/>
        <parameter key="use_macros" value="false"/>
      </operator>
      <portSpacing port="source_input 1" spacing="0"/>
      <portSpacing port="sink_result 1" spacing="0"/>
    </process>
  </operator>
</process>




Scott



Sign In or Register to comment.