Platform SDK: CDO for Windows 2000

Working with Drop Directories

The following example shows how to work with messages stored in the Simple Mail Transfer Protocol (SMTP) service drop directory.

[Visual Basic]
Dim iDropDir as New CDO.DropDirectory
Dim iMsgs as CDO.IMessages
Dim iMsg as CDO.Message
Dim iStream as ADODB.Stream

Dim strTo as String
Dim ToRecipients as Variant
Dim strEmailName as String
Dim strAccountName as String
Dim strFileName as String
Dim strMailboxDir as String

Set iMsgs = iDropDir.GetMessages

For Each iMsg in iMsgs
  strFileName = iMsgs.FileName(iMsg)

  ' trim to get the short file name 
  ' from the full path
  strFileName = Right(strFileName, Len(strFileName) - InStrRev(strFileName,"\") )

  ' Get the To recipients...and assume they are all local accounts
  strTo = iMsg.To
  ToRecipients = Split(strTo,",")
  Dim j, lpos, rpos, posdiff
  ' loop through recipients and get account names for each
  ' Each address will be in either the "Name" <name@micrsoft.com> or
  '  simply <name@microsoft.com>
  ' We get the account name by getting the string
  ' between "<" and "@"
  For j = LBound(ToRecipients) to UBound(ToRecipients)
    strEmailName = ToRecipients(j)
    lpos = InStr(strEmailName,"<")
    rpos = InStr(strEmailName,"@")
    posdiff = rpos - lpos - 1
    strAccountName = Mid(strEmailName,lpos + 1, posdiff)
    
    ' For the purposes of this example,
    ' each account's mailbox directory resides in the
    ' directory c:\mailboxes. For user Joe, their account
    ' directory would be c:\mailboxes\joe
    strMailboxDir = "c:\mailboxes\" & strAccountName
    ' Get the message stream 
    Set iStream = iMsg.GetStream
    
    ' write the stream to the user's mailbox directory
    ' the file name is the same as the one in the drop directory
    iStream.SaveToFile strMailboxDir & "\" & strFileName
    iStream.Close
    Set iStream = Nothing
  Next j
Next iMsg

' once we're done, delete the picked up messages
' this deletes the files from the file system as well.
iMsgs.DeleteAll

Set iMsgs = Nothing
Set iDropDir = Nothing
[C++,IDL]
#include "stdafx.h"
#import "d:\program files\common files\system\ado\msado15.dll" no_namespace raw_interfaces_only
#import <cdosys.dll> no_namespace raw_interfaces_only
#include <iostream.h>
#include <wchar.h>

void main(int argc, char* argv[])
{
  CoInitialize(NULL);

  IDropDirectory* pDropDir = NULL;
  IMessages* pMsgs = NULL;
  IUnknown* pUnk = NULL;
  IEnumVARIANT* pEnum = NULL;

  CoCreateInstance(
            __uuidof(DropDirectory),
           NULL,
           CLSCTX_SERVER,
           __uuidof(IDropDirectory),
          (void**)&pDropDir);

  pDropDir->GetMessages(L"c:\\inetpub\\mailroot\\drop",&pMsgs);
  long count = 0;
  pMsgs->get_Count(&count);
  cout << "message count: " << count << endl;

  pMsgs->get__NewEnum(&pUnk);
  pUnk->QueryInterface(__uuidof(IEnumVARIANT),(void**)&pEnum);

  ULONG cFetched = 0;
  VARIANT varMsg;
  VariantInit(&varMsg);
  while (1) {
    cFetched = 0;
    pEnum->Next(1,&varMsg,&cFetched);
    cout << "fetched: " << cFetched << endl;
    if(cFetched == 0)
      break;
    IMessage* pMsg = NULL;
    varMsg.pdispVal->QueryInterface(__uuidof(IMessage),(void**)&pMsg);
    BSTR szFilename;
    pMsgs->get_FileName(varMsg,&szFilename);

    varMsg.pdispVal->Release(); // no longer need IDispatch in VARIANT
    VariantClear(&varMsg);

    cout << "Filename:" << _bstr_t(szFilename) << endl;
    wchar_t* pwchar;
    pwchar = wcsrchr(szFilename,'\\');
    _bstr_t mailfilename(pwchar+1);
    BSTR szTo;
    pMsg->get_To(&szTo);
    wchar_t* pWChar = szTo;

    wchar_t szbuffer[100];
    wchar_t chLt = '<';
    wchar_t chAt = '@';
    wchar_t* pFirst;
    unsigned int curPos = 0;
    _bstr_t mailboxesroot = "c:\\mailboxes\\";

    for(unsigned int k = 0;k<wcslen(pWChar);k++){
      if(pWChar[k] == chLt) {
        pFirst = &pWChar[k];
        curPos = k;
      }
      else if(pWChar[k] == chAt) {
        cout << "amp" << endl;
        wcsncpy(szbuffer,pFirst+1,k-curPos-1);
        buffer[k-curPos-1] = (wchar_t)'\0';
        _bstr_t filen = mailboxesroot + _bstr_t(buffer) + "\\" + _bstr_t(mailfilename);
        _Stream* pStrm = NULL;
        pMsg->GetStream(&pStrm);
        pStrm->SaveToFile(filen,adSaveCreateOverWrite);
        pStrm->Release();
      }
    }
    ::SysFreeString(szTo);
    ::SysFreeString(szFilename);
    pMsg->Release();
  } // end while(1)
  
  CoUninitialize();
}
[VBScript]
Dim iDropDir
Set iDropDir = CreateObject("CDO.DropDirectory")
Dim iMsgs
Dim iMsg
Dim iStream

Dim strTo
Dim ToRecipients
Dim strEmailName
Dim strAccountName
Dim strFileName
Dim strMailboxDir

Set iMsgs = iDropDir.GetMessages

For Each iMsg in iMsgs
  ' process messages
Next
iMsgs.DeleteAll
Set iMsgs = Nothing
Set iDropDir = Nothing