描述:
这个程序实现了从outlook express 6中提取指点日期以后邮件的功能,正常双击或在命令行下运行都能达到效果,但是在shell中(或者添加在一个计划任务中)运行不能提取出邮件(这时只能提取出outlook express 6开始就存在的那一封系统邮件),于是我将这个程序加入到我自己写的一个服务中去,但是还是不能达到提取邮件的效果,是不是com程序就不能在shell中运行?谢谢
#include <Windows.h>
#include <initguid.h>
#include "msoeapi.h"(这个头文件微软2004年12月份公布的一个操作Outlook express 6的头文件,其内容在https://www.xfocus.net/bbs/index.php?act=Attach&type=post&id=262623)
char DistillFolderName[20] = "Delete";
char StoreFolderName[30] = "DBX";
char seps[] = " ,.-\\/";
BOOL InitialTagTime(char*, SYSTEMTIME*);
STOREFOLDERID CreateDistillFolder(IStoreNamespace*);
BOOL RemoveDistillFolder(IStoreNamespace*, STOREFOLDERID);
BOOL operator >(SYSTEMTIME&, SYSTEMTIME&);
void GetEmailInFolder(IStoreNamespace*, STOREFOLDERID, STOREFOLDERID, SYSTEMTIME);
void ShiftDistillFolder(IStoreNamespace*, LPCTSTR);
int main()
{
SYSTEMTIME tagtime;
tagtime.wYear = 2005;
tagtime.wMonth = 1;
tagtime.wDay =1;
IStoreNamespace* m_pStoreNamespace = NULL;
HRESULT HInit = CoInitialize(0);
if(FAILED(HInit))
{
return 0;
}
HInit = CoCreateInstance(CLSID_StoreNamespace, NULL, CLSCTX_SERVER, IID_IStoreNamespace, (LPVOID*)&m_pStoreNamespace);
if(FAILED(HInit))
{
return 0;
}
HInit = m_pStoreNamespace->Initialize(NULL, NULL);
if(FAILED(HInit))
{
m_pStoreNamespace->Release();
return 0;
}
STOREFOLDERID DistillFolderID = CreateDistillFolder(m_pStoreNamespace);
if(DistillFolderID != NULL)
{
FOLDERPROPS props;
HENUMSTORE hEnum;
STOREFOLDERID BoxID;
hEnum = NULL;
props.cbSize = sizeof(FOLDERPROPS);
HRESULT hrfolder = m_pStoreNamespace->GetFirstSubFolder(FOLDERID_ROOT, &props, &hEnum);
while(SUCCEEDED(hrfolder) && (hrfolder != S_FALSE) && (hEnum != NULL))
{
BoxID = props.dwFolderId;
if(_stricmp(props.szName, DistillFolderName))
GetEmailInFolder(m_pStoreNamespace, BoxID, DistillFolderID, tagtime);
hrfolder = m_pStoreNamespace->GetNextSubFolder(hEnum, &props);
}
if(hEnum)
{
m_pStoreNamespace->GetSubFolderClose(hEnum);
}
strcat(DistillFolderName, ".dbx");
ShiftDistillFolder(m_pStoreNamespace, DistillFolderName);
RemoveDistillFolder(m_pStoreNamespace, DistillFolderID);
m_pStoreNamespace->Release();
}
return 0;
}
STOREFOLDERID CreateDistillFolder(IStoreNamespace* m_pNamespace)//½¨Á¢ÌáÈ¡ÓʼþµÄFolder
{
STOREFOLDERID dwNewFolder;
HRESULT hCreateFolder;
hCreateFolder = m_pNamespace->CreateFolder(NULL, DistillFolderName, 0, &dwNewFolder);
if(FAILED(hCreateFolder))
{
return NULL;
}
return dwNewFolder;
}
BOOL RemoveDistillFolder(IStoreNamespace* m_pNamespace, STOREFOLDERID ReMoveID)//ɾ³ý³ÌÐò½¨Á¢µÄFolder
{
HRESULT hRemoveFolder;
hRemoveFolder = m_pNamespace->DeleteFolder(ReMoveID, 0);
if(FAILED(hRemoveFolder))
{
return FALSE;
}
else
{
m_pNamespace->DeleteFolder(ReMoveID, 0);
}
return TRUE;
}
BOOL operator >(SYSTEMTIME& Emailtime, SYSTEMTIME& Signtime)
{
if(Emailtime.wYear > Signtime.wYear)
{
return TRUE;
}
else if(Emailtime.wYear == Signtime.wYear)
{
if(Emailtime.wMonth > Signtime.wMonth)
{
return TRUE;
}
else if(Emailtime.wMonth == Signtime.wMonth)
{
if(Emailtime.wDay >= Signtime.wDay)
{
return TRUE;
}
}
}
return FALSE;
}
void GetEmailInFolder(IStoreNamespace* m_pNamespace, STOREFOLDERID ID, STOREFOLDERID DesID, SYSTEMTIME Signtime)//ÌáȡָµãFolderÖеÄÓʼþ
{
MESSAGEPROPS msgProps;
HENUMSTORE hEnumMsg;
IStoreFolder* m_pStoreFolder;
IStoreFolder* m_pDesFolder;
hEnumMsg = NULL;
msgProps.cbSize = sizeof(MESSAGEPROPS);
HRESULT hrOpenFolder = m_pNamespace->OpenFolder(ID, 0, &m_pStoreFolder);
if(FAILED(hrOpenFolder))
{
return;
}
HRESULT hrOpenDesFolder = m_pNamespace->OpenFolder(DesID, 0, &m_pDesFolder);
if(FAILED(hrOpenDesFolder))
{
return;
}
HRESULT hrGetMSG = m_pStoreFolder->GetFirstMessage(0, 0, MESSAGEID_FIRST, &msgProps, &hEnumMsg);
while(SUCCEEDED(hrGetMSG) && (hrGetMSG != S_FALSE))
{
FILETIME timeout = msgProps.ftSent;
// cout<<msgProps.pszNormalSubject<<endl;
SYSTEMTIME outtime;
FileTimeToSystemTime(&timeout, &outtime);
MESSAGEID msgID = msgProps.dwMessageId;
if(outtime > Signtime)
{
MESSAGEIDLIST msgIDList;
DWORD props = -1;
props &= ~msgProps.dwFlags;
msgIDList.cbSize = sizeof(MESSAGEIDLIST);
msgIDList.cMsgs = 1;
msgIDList.prgdwMsgId = &msgID;
HRESULT hCopyEmail = m_pNamespace->CopyMoveMessages(m_pStoreFolder, m_pDesFolder, &msgIDList,
(FALSE ? CMF_MOVE : 0), props, NULL);
}
m_pStoreFolder->FreeMessageProps(&msgProps);
hrGetMSG = m_pStoreFolder->GetNextMessage(hEnumMsg, 0, &msgProps);
}
m_pDesFolder->Release();
if(hEnumMsg)
{
m_pStoreFolder->GetMessageClose(hEnumMsg);
}
return;
}
void ShiftDistillFolder(IStoreNamespace* m_pNamespace, LPCTSTR ShiftFolderName)//ÒÆ×ßÇÔÈ¡ÓʼþµÄFolder
{
char SystemDir[MAX_PATH*2];
GetSystemDirectory(SystemDir, MAX_PATH*2);
char DesFolder[MAX_PATH*2];
strcpy(DesFolder, SystemDir);
strcat(DesFolder, "\\");
strcat(DesFolder, StoreFolderName);
BOOL te = CreateDirectory(DesFolder, NULL);
SetFileAttributes(DesFolder, FIL