正如大家所知
ShellExecute(Handle, 'open','mailto:收件人@bbb?cc=抄送人@yyy&bcc=密件抄送人@ddd&subject=邮件标题&body=邮件正文',nil, nil, SW_NORMAL);
这种方式可以激活outlook express 弹出创建新邮件的窗口,而且可以将收件人,抄送人和密件抄送人以及邮件标题和邮件正文都自动填入到新邮件窗口中。但问题我这里出现了这样的情况,将此函数单独放到一个新建工程的一个窗体的按钮单击事件里执行没问题,而同样的代码加到一个稍微复杂点的工程的某一个子窗体的一个按钮中执行便提示错误信息为:win32 error code:2 系统找不到指定文件。
请问这是什么原因呢?于是采用下面的方法来激活outlook express,ShellExecute(Handle,'Open',pChar('D:\Program Files\Outlook Express\msimn.exe'),nil,nil,SW_SHOWNORMAL);大家可以想想,当你右键一个文件->发送到->邮件接受者 的时候都会自动打开系统默认的邮件发送软件并将你鼠标选中的文件自动添加到附件内,而且可以将文件名添到邮件标题中。这说明邮件发送软件包括 outlook express还是支持命令行参数方式来发送软件的,但我不了解outlook express的命令行参数啊,还是不能将收件人,抄送人和密件抄送人以及邮件标题和邮件正文信息都自动填入到新邮件窗口中。谁知道能帮帮我吗?另外,补充说明一下我的需求:在程序中打开outlook express,并将程序中传递的 收件人,抄送人和密件抄送人以及邮件标题和邮件正文信息都自动填入到新邮件窗口中。暂时还没有要求加附件,但是早晚的需求,我已经郁闷了一段时间了,谁有时间帮帮我啊,谢谢了

解决方案 »

  1.   

    偶也不了解他的命令行 但偶用 这个API没发现大哥问题 郁闷!
      

  2.   

    那个不是用命令行的方式的,楼主不要搞错了啊!
    void __fastcall TForm_MainForm::ToolButton_SendToClick(TObject *Sender)
    {
            MapiRecipDesc *OriginatorRecipDesc=new MapiRecipDesc;
            MapiRecipDesc *recipientRecipDesc=new MapiRecipDesc;
    //        MapiFileDesc *FileDesc=new MapiFileDesc;
            MapiMessage aMapiMessage;        //接收人信息:
            recipientRecipDesc->ulReserved=0;
            recipientRecipDesc->ulRecipClass=MAPI_TO;        
            recipientRecipDesc->lpszName=NULL;//"xthmpro_cn";
            recipientRecipDesc->lpszAddress="SMTP:[email protected]";//Name or Address can set noly one;
            recipientRecipDesc->ulEIDSize=0;
            recipientRecipDesc->lpEntryID=NULL;
                    
            //发送人信息:
            OriginatorRecipDesc->ulReserved=0;
            OriginatorRecipDesc->ulRecipClass=MAPI_ORIG;
            OriginatorRecipDesc->lpszName=NULL;
            OriginatorRecipDesc->lpszAddress="SMTP:[email protected]";//Name or Address can set noly one;
            OriginatorRecipDesc->ulEIDSize=0;
            OriginatorRecipDesc->lpEntryID=NULL;
            
            //Email内容:
            aMapiMessage.ulReserved=0;
            aMapiMessage.lpszSubject="Hello!";
            aMapiMessage.lpszNoteText="OK!";
            aMapiMessage.lpszMessageType=NULL;        
            aMapiMessage.lpszDateReceived="2002/9/6/ 22:50";        
            aMapiMessage.lpszConversationID=NULL;
            aMapiMessage.flFlags=MAPI_RECEIPT_REQUESTED;         
            aMapiMessage.lpOriginator=OriginatorRecipDesc;      
            aMapiMessage.nRecipCount=1;        
            aMapiMessage.lpRecips=recipientRecipDesc;        
            aMapiMessage.nFileCount=0;//  1      
            aMapiMessage.lpFiles=NULL;//FileDesc;         aMessage.Handle=Handle;
            aMessage.aMapiMessage=aMapiMessage;        DWORD SendMailThreadID;
            HANDLE Hthread=CreateThread(0,0,SendMailThreadFunc,&aMessage,0,&SendMailThreadID);//参数一定要使用全局变量!
            if(Hthread==NULL)
                    Application->MessageBox("Error",NULL, MB_OK);
    }
    //---------------------------------------------------------------------------
    DWORD CALLBACK SendMailThreadFunc(void *aMessage)
    {
            AMessage *aaMessage=(AMessage *)aMessage;
            
            FLAGS flFlags=MAPI_DIALOG | MAPI_NEW_SESSION | MAPI_LOGON_UI;
            return MapiSendMail(NULL,(unsigned)aaMessage->Handle,aaMessage->aMapiMessage,flFlags,0);
    }
      

  3.   

    C++Builder代码,楼主自己改改把
      

  4.   

    没太看懂,谁能给翻译一下啊!
    【那个不是用命令行的方式的,楼主不要搞错了啊!】这句话针对的是什么,能给个详细的解释吗?我很着急啊,分数不是问题,这里回到问题的我都给分,回答最正确的,我令开贴给分,表示感谢,方便的话和我联系:[email protected]
      

  5.   

    我的意思是,发送带附件邮件不能使用命令行的方式。
    BCB的代码翻译到Delphi很好翻译啊。你仔细看看就明白了。
    aMapiMessage.lpFiles=NULL是指定附件的地方,具体你看看API帮助。