Platform SDK: CDO for Windows 2000

Constructing a Body Part Hierarchy

The following example shows how to manually create a body part hierarchy for a message.

[Visual Basic]
Dim iMsg As New CDO.Message
Dim iBp  As CDO.IBodyPart
Dim iBp1 As CDO.IBodyPart
Dim iBp2 As CDO.IBodyPart
Dim Flds As ADODB.Fields
Dim Stm  As ADODB.Stream

Set iBp = iMsg   ' get IBodyPart on Message object

Set Flds = iBp.Fields
Flds("urn:schemas:mailheader:content-type") = "multipart/mixed"
Flds.Update

Set iBp1 = iBp.AddBodyPart  ' Add a BodyPart object to the hierarchy

Set iBp2 = iBp1.AddBodyPart  ' text/plain
Set Flds = iBp2.Fields
Flds("urn:schemas:mailheader:content-type")              = "text/plain"
Flds("urn:schemas:mailheader:content-transfer-encoding") = "quoted-printable"
Flds.Update

Set Stm = iBp2.GetDecodedContentStream
Stm.WriteText "This is a message"
Stm.Flush

Set iBp2 = iBp1.AddBodyPart   ' text/html
Set Flds = iBp2.Fields
Flds("urn:schemas:mailheader:content-type") = "text/html"
Flds("urn:schemas:mailheader:content-transfer-encoding") = "quoted-printable"
Flds.Update

Set Stm = iBp2.GetDecodedContentStream
Stm.WriteText "<html><h1>This is a message</h1></html>"
Stm.Flush

' This may appear out of order, but we have to _reset_ the 
' content-type for the "multipart/alternative" body part after adding
' the two representations.  If we set it before, it will be switched
' to "multipart/mixed" when we call the AddBodyPart() method on the 
' object.

Set Flds = iBp1.Fields
Flds("urn:schemas:mailheader:content-type") = "multipart/alternative"
Flds.Update

Set iBp1 = iBp.AddBodyPart    '  image/gif
Set Flds = iBp1.Fields
Flds("urn:schemas:mailheader:content-type") = "image/gif"
Flds("urn:schemas:mailheader:content-transfer-encoding") = "base64"

Set Stm = iBp1.GetDecodedContentStream
Stm.LoadFromFile "c:\images\myimage.gif"
Strm.Flush
[C++,IDL]
#import "d:\program files\common files\system\ado\msado15.dll" no_namespace
#import <cdosys.dll> no_namespace

void main()
{
  CoInitialize(NULL);

  {
    IMessagePtr  iMsg(__uuidof(Message));
    IBodyPartPtr iBp;
    IBodyPartPtr iBp1;
    IBodyPartPtr iBp2;
    FieldsPtr    Flds;
    _StreamPtr   Stm;

    /*
    **  multipart/mixed (root)
    */
    iBp   = iMsg;
    Flds  = iBp->Fields;
    Flds->Item["urn:schemas:mailheader:content-type"]->Value = 
      _bstr_t("multipart/mixed");
    Flds->Update();

    /*
    ** multipart/alternative (child of root)
    */
    iBp1   = iBp->AddBodyPart(-1);  // multipart/altenative body part

    /* 
    ** text/plain
    */
    iBp2   = iBp1->AddBodyPart(-1); // text/plain body part
    Flds   = iBp2->Fields;
    Flds->Item["urn:schemas:mailheader:content-type"]->Value = 
      _bstr_t("text/plain");
    Flds->Item["urn:schemas:mailheader:content-transfer-encoding"]->Value = 
      _bstr_t("quoted-printable");
    Flds->Update();

    Stm    = iBp2->GetDecodedContentStream();
    Stm->WriteText(_bstr_t("text version of message"),stWriteChar);
    Stm->Flush();


    /* 
    ** text/html
    */
    iBp2   = iBp1->AddBodyPart(-1); // text/html body part
    Flds   = iBp2->Fields;
    Flds->Item["urn:schemas:mailheader:content-type"]->Value = 
      _bstr_t("text/html");
    Flds->Item["urn:schemas:mailheader:content-transfer-encoding"]->Value = 
      _bstr_t("quoted-printable");
    Flds->Update();

    Stm    = iBp2->GetDecodedContentStream();
    Stm->WriteText(_bstr_t("<html><p><em>html</em> version of message</p></html>"),stWriteChar);
    Stm->Flush();

    /*
    ** set multipart/alternative header
    */
    Flds   = iBp1->Fields;
    Flds->Item["urn:schemas:mailheader:content-type"]->Value =
      _bstr_t("multipart/alternative");
    Flds->Update();

    /*
    ** image/gif (child of root multipart/mixed)
    */
    iBp1   = iBp->AddBodyPart(-1);
    Flds   = iBp1->Fields;
    Flds->Item["urn:schemas:mailheader:content-type"]->Value = 
      _bstr_t("image/gif");
    Flds->Item["urn:schemas:mailheader:content-transfer-encoding"]->Value = 
      _bstr_t("base64");
    Flds->Update();

    Stm    = iBp1->GetDecodedContentStream();
    Stm->LoadFromFile(_bstr_t("myimage.gif"));
    Stm->Flush();
  
    /*
    ** Save message stream to disk
    */
    Stm    = iMsg->GetStream();
    Stm->SaveToFile(_bstr_t("message.eml"),adSaveCreateOverWrite);
  }
  CoUninitialize();
}
[VBScript]
Dim iMsg
Set iMsg = CreateObject("CDO.Message")
Dim iBp
Dim iBp1
Dim iBp2
Dim Flds
Dim Stm 

Set iBp = iMsg   ' get IBodyPart on Message object

Set Flds = iBp.Fields
Flds("urn:schemas:mailheader:content-type") = "multipart/mixed"
Flds.Update

Set iBp1 = iBp.AddBodyPart  ' Add a BodyPart object to the hierarchy

Set iBp2 = iBp1.AddBodyPart  ' text/plain
Set Flds = iBp2.Fields
Flds("urn:schemas:mailheader:content-type")              = "text/plain"
Flds("urn:schemas:mailheader:content-transfer-encoding") = "quoted-printable"
Flds.Update

Set Stm = iBp2.GetDecodedContentStream
Stm.WriteText "This is a message"
Stm.Flush

Set iBp2 = iBp1.AddBodyPart   ' text/html
Set Flds = iBp2.Fields
Flds("urn:schemas:mailheader:content-type") = "text/html"
Flds("urn:schemas:mailheader:content-transfer-encoding") = "quoted-printable"
Flds.Update

Set Stm = iBp2.GetDecodedContentStream
Stm.WriteText "<html><h1>This is a message</h1></html>"
Stm.Flush

' This may appear out of order, but we have to _reset_ the 
' content-type for the "multipart/alternative" body part after adding
' the two representations.  If we set it before, it will be switched
' to "multipart/mixed" when we call the AddBodyPart() method on the 
' object.

Set Flds = iBp1.Fields
Flds("urn:schemas:mailheader:content-type") = "multipart/alternative"
Flds.Update

Set iBp1 = iBp.AddBodyPart    '  image/gif
Set Flds = iBp1.Fields
Flds("urn:schemas:mailheader:content-type") = "image/gif"
Flds("urn:schemas:mailheader:content-transfer-encoding") = "base64"

Set Stm = iBp1.GetDecodedContentStream
Stm.LoadFromFile "c:\images\myimage.gif"
Strm.Flush