启动默认的邮件客户端:Outlook  Express或FoxMail等东东然后添加内容和附件。  
 
ShellExecute(pMainFrm->m_hWnd,"open","mailto:@?body="+mailBody,"","",  SW_SHOW);    
的方式只能附加2048字节的内容,再多就不行了!  
而且用这种方式不能添加附件。  
 
哪位高手有更好的方法?  
或用mailto:方式突破2048字节限制并添加附件?  
 
在XP浏览文件的窗口里就可以实现启动Outlook  Express并自动添加文件作为附件。  
找了很久都没找到自己实现的方法...

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=703
      

  2.   

    有  API 可以用的 ,outlook 调用 + 几个参数可以做到,其他的没有试过。你自己找找
      

  3.   

    MAPISendMail如何调用默认的邮件客户端阿?
      

  4.   

    outlook express有automation接口,可以象word一样控制outlook收发邮件而不出现可见的窗口网上有很多利用这些接口发送邮件的病毒脚本,看看就知道了
      

  5.   

    谢谢!但问题时必须要出现可见的窗口,比如Outlook或Foxmail新邮件的窗口。
    同时得把内容加上,加到正文或附件里都行。不仅仅是调用Outlook的接口就行,得启动默认的邮件客户端!!!效果类似Windows XP系统里选择一个文件,左边就会有“以电子邮件形式发送此文件”的链接,点击链接后出现Outlook新邮件界面,并把选择的文件作为附件加上。高手救急阿~~~~
      

  6.   

    一个 Delphi 的例子,希望有所帮助
    http://hubdog.csdn.net/Hubdog/outlook.htm
      

  7.   

    继续顶,不仅仅要调用 Outlook ,需要调用默认的邮件客户端,Foxmail等等不固定的东东~
      

  8.   

    http://www.vckbase.net/document/viewdoc/?id=684
    http://www.vckbase.net/document/viewdoc/?id=712
      

  9.   

    兄弟,看看右键菜单上的 sendto 。
      

  10.   

    谢谢上面几位。
    不过都不太符合,需要启动默认的邮件客户端,用MAPI或JMail可以做到吗?
      

  11.   

    TO: badcrow(乌鸦) 我要的就是这个!!
    资源管理器里选择一个文件右击->发送到->邮件接收者  的功能.
    编程如何实现阿~Thanks.
      

  12.   

    只能两者中选择:
    1、沿用ShellExecute(pMainFrm->m_hWnd,"open","mailto:@?body="+mailBody,"","",  SW_SHOW);    
    之后捕获到outlook窗体,发消息继续加入字符串,加附件考虑自动化技术2、直接编代码实现发邮件及附件
      

  13.   

    第一个不太好实现,
    第二个不符合客户需求。我在国外论坛上找到一个方法,自己创建临时.eml文件然后用ShellExecute打开即可。算是临时解决了吧。
    但是默认只能是outlook express打开。寻求更好的办法....
      

  14.   

    //加载MAPI32.DLL动态库
    HMODULE hMod = LoadLibrary("MAPI32.DLL"); if (hMod == NULL) //加载动态库失败
    {
    AfxMessageBox(AFX_IDP_FAILED_MAPI_LOAD);
    return -1;
    } //获取发送邮件的函数地址
    ULONG (PASCAL *lpfnSendMail)(ULONG, ULONG, MapiMessage*, FLAGS, ULONG);
    (FARPROC&)lpfnSendMail = GetProcAddress(hMod, "MAPISendMail"); if (lpfnSendMail == NULL)
    {
    AfxMessageBox(AFX_IDP_INVALID_MAPI_DLL);
    return -1;
    } int nFileCount = nCount; //有多少个附件需要发送 //分配内存保存附件信息 不能使用静态数组,因为不知道要发送附件的个数
    MapiFileDesc* pFileDesc = (MapiFileDesc*)malloc(sizeof(MapiFileDesc) * nFileCount);
    memset(pFileDesc,0,sizeof(MapiFileDesc) * nFileCount); //分配内存保存附件文件路径
    TCHAR* pTchPath = (TCHAR*)malloc(MAX_PATH * nFileCount); CString szText;
    for(int i = 0;i < nFileCount;i++)
    {
    TCHAR* p = pTchPath + MAX_PATH * i;
    strcpy(p,file[i]); (pFileDesc + i)->nPosition = (ULONG)-1;
    (pFileDesc + i)->lpszPathName = p;
    (pFileDesc + i)->lpszFileName = p;
    } //收件人结构信息
    MapiRecipDesc recip;
    memset(&recip,0,sizeof(MapiRecipDesc));

    char caddress[1024];
    memset(caddress,0,1024);
    strcpy(caddress,add);
    CString straddresslist;
    straddresslist=caddress; recip.lpszAddress =caddress;
    recip.ulRecipClass = MAPI_TO;
    // if (straddresslist.IsEmpty())
    // recip.lpszName= "no empty";
    //邮件结构信息
    MapiMessage message;
    memset(&message, 0, sizeof(message));
    message.nFileCount = nFileCount; //文件个数
    message.lpFiles = pFileDesc; //文件信息
    message.nRecipCount = 1; //收件人个数
    message.lpRecips  = &recip; //收件人
    // message.lpszSubject = m_szSubject.GetBuffer(0); //主题
    // message.lpszNoteText= m_szText.GetBuffer(0); //正文内容 //保存本程序窗口指针,因为发完邮件后要返回本程序的窗口
    CWnd* pParentWnd = CWnd::GetSafeOwner(NULL, NULL); //发送邮件
    int nError = lpfnSendMail(0, 0,
    &message, MAPI_LOGON_UI|MAPI_DIALOG, 0); if (nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT 
    && nError != MAPI_E_LOGIN_FAILURE)
    {
    AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
    } //返回程序
    pParentWnd->SetActiveWindow(); //释放分配的内存
    free(pFileDesc);
    free(pTchPath);
    FreeLibrary(hMod);