drth 发表于 2015-9-13 10:17:11

调用Outlook Express提取eml邮件附件

  根据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 = " /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;
    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
页: [1]
查看完整版本: 调用Outlook Express提取eml邮件附件