|
根据MIME格式处理eml文件是件挺烦琐的事,直接利用Outlook Express来处理就要简单一些,但是Outlook Express没有命令行操作(或许是我没找到),这就使得调用Outlook Express来处理eml邮件也有些麻烦.
下面是我写的windows情况下的调用Outlook Express来提取附件的函数,但是总不能隐藏Outlook Express窗口,不知道有高手知道原因不:
BOOL ExtractAttach(TCHAR * FileName, TCHAR * OutPath)
{
//打开eml电子邮件
TCHAR lpApplicationName[] = "C:\\Program Files\\Outlook Express\\msimn.exe";
TCHAR lpCommandLine[MAX_PATH] = " /eml:";
strcat(lpCommandLine, FileName);
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
ZeroMemory( &siStartInfo, sizeof(siStartInfo) );
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.dwFlags = STARTF_USESHOWWINDOW;
siStartInfo.wShowWindow = SW_HIDE; //发送隐藏消息也不行,还是显示窗口
if( !CreateProcess( lpApplicationName, lpCommandLine, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &siStartInfo, &piProcInfo ) )
return FALSE;
//寻找打开的电子邮件窗口
HWND hOeWnd = NULL;
DWORD dwProcessId = 0;
do {
hOeWnd = FindWindow( "ATH_Note", NULL );
} while( hOeWnd==NULL );
if( GetWindowThreadProcessId(hOeWnd, &dwProcessId) && dwProcessId!=piProcInfo.dwProcessId )
return FALSE;
//打开保存附件窗口
if( !PostMessage(hOeWnd, WM_COMMAND, 0x819CA6, NULL) ) //0x819CA6 "Save Attachments"
return FALSE;
//寻找打开的保存附件窗口
HWND hSaveAttWnd = NULL;
do {
hSaveAttWnd = FindWindow( NULL, "Save Attachments" );
} while( hSaveAttWnd==NULL );
//寻找输出路径编辑框并修改
HWND hChildWnd;
TCHAR buf[MAX_PATH];
do {
for( hChildWnd=GetTopWindow(hSaveAttWnd); hChildWnd!=NULL; hChildWnd=GetNextWindow(hChildWnd, GW_HWNDNEXT) )
{
GetClassName(hChildWnd, buf, MAX_PATH);
if( stricmp(buf, TEXT("Edit"))==0 )
{
SendMessage(hChildWnd, WM_SETTEXT, 0, (LPARAM)OutPath);
break;
}
}
} while( hChildWnd==NULL );
//双击保存按钮
do {
for( hChildWnd=GetTopWindow(hSaveAttWnd); hChildWnd!=NULL; hChildWnd=GetNextWindow(hChildWnd, GW_HWNDNEXT) )
{
GetWindowText(hChildWnd, buf, MAX_PATH);
if( stricmp(buf, TEXT("&Save"))==0 )
{
PostMessage(hChildWnd, WM_LBUTTONDOWN, 0, 0);
PostMessage(hChildWnd, WM_LBUTTONUP, 0, 0);
break;
}
}
} while( hChildWnd==NULL );
//发送退出消息
PostMessage(hOeWnd, WM_KEYDOWN, VK_ESCAPE, 0);
//等待退出
if( WaitForSingleObject(piProcInfo.hProcess, 4000)==WAIT_TIMEOUT )
return FALSE;
return TRUE;
}
源代码下载:
/Files/God4/AttachExtractor.rar |
|
|