πŸŽ‰ πŸŽ‰. RAPIDMINER 9.8 IS OUT!!! πŸŽ‰ πŸŽ‰

RapidMiner 9.8 continues to innovate in data science collaboration, connectivity and governance

CLICK HERE TO DOWNLOAD

Parsing MS Outlook .msg files

sgenzersgenzer 12Administrator, Moderator, Employee, RapidMiner Certified Analyst, Community Manager, Member, University Professor, PM Moderator Posts: 2,957  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



sara20lionelderkrikorPavithra_Rao
Sign In or Register to comment.