如何: 保存到文件的邮件附件

来源:互联网 发布:拉菲尔定律工资计算法 编辑:程序博客网 时间:2024/06/05 12:49

如何: 保存到文件的邮件附件

文章编号: 173353 - 查看本文应用于的产品
展开全部 | 关闭全部

本页

概要

下面的代码示例演示如何打开附件,并将内容复制到当前目录中的文件。
回到顶端 | 提供反馈

更多信息

使用以下步骤来打开附件,并将内容复制到当前目录中的文件:

  1. 打开 (Attachments) 表格,其中包括以下列:

    PR_ATTACH_FILENAME 和 PR_ATTACH_NUM。
  2. 在附件表中打开的附件。
  3. 创建一个文件附件。
  4. 将复制到新创建的文件附件的内容。

示例代码

   /* This code assumes that you already have an IMessage object,      pointed to by the variable pMsg. This IMessage object      should have been opened with the MAPI_MODIFY flag.      This code also assumes that PR_ATTACH_METHOD equals      ATTACH_BY_VALUE. See the note that follows this sample       code for more information.   */    /* You should have the following define and include lines for this      code to compile and link correctly:          #define USES_IID_IMAPITable          #define INITGUID          #include <initguid.h>          #include <mapiutil.h>   */     HRESULT WriteAttachToFile ( LPMESSAGE pMsg )    {      SizedSPropTagArray(1,g_sptMsgProps) = {1,                                             PR_HASATTACH};      LPSPropValue pProps = NULL;      HRESULT hRes = 0;      ULONG cVals = 0;      if (FAILED(hRes = pMsg->GetProps((LPSPropTagArray) &g_sptMsgProps,                                       0,                                       &cVals,                                       &pProps)))        goto Quit;      else        hRes = S_OK;      if (PR_HASATTACH == pProps[0].ulPropTag && pProps[0].Value.b)      {        LPMAPITABLE pAttTbl = NULL;        LPSRowSet pRows = NULL;        static SizedSPropTagArray(2,sptCols) = {2,PR_ATTACH_LONG_FILENAME,                                                  PR_ATTACH_NUM};        if (SUCCEEDED(hRes = pMsg -> OpenProperty(PR_MESSAGE_ATTACHMENTS,                                                  &IID_IMAPITable,                                                  0,                                                  0,                                                  (LPUNKNOWN *) &pAttTbl)))        {          if (SUCCEEDED(hRes = pAttTbl -> SetColumns(                                              (LPSPropTagArray) &sptCols,                                              TBL_BATCH)))          {            if (SUCCEEDED(hRes = HrQueryAllRows(pAttTbl,                                              (LPSPropTagArray) &sptCols,                                              NULL,                                              NULL,                                              0,                                              &pRows)))            {              for (ULONG i = 0; i < pRows -> cRows; i++)              {                LPATTACH lpAttach = NULL;                // Verify we received a filename from GetProps                if (! PR_ATTACH_FILENAME ==                      pRows->aRow[i].lpProps[0].ulPropTag)                  break;                // Verify we received an Attachment Index from GetProps                if (! PR_ATTACH_NUM == pRows->aRow[i].lpProps[1].ulPropTag)                   break;                // Open the attachment                if (SUCCEEDED(hRes = pMsg->OpenAttach (                                  pRows->aRow[i].lpProps[1].Value.l,                                  NULL, MAPI_BEST_ACCESS, &lpAttach)))                {                  LPSTREAM pStrmSrc = NULL, pStrmDest = NULL;                  STATSTG StatInfo;                  // Open the property of the attachment                  // containing the file data                  if (FAILED(hRes = lpAttach->OpenProperty(                                                 PR_ATTACH_DATA_BIN,                                                 (LPIID)&IID_IStream,                                                 0,                                                 MAPI_MODIFY,                                                 (LPUNKNOWN *)&pStrmSrc)))                     break;                   // Open an IStream interface and create the file at the                   // same time. This code will create the file in the                   // current directory.                   if (FAILED(hRes = OpenStreamOnFile(                                     MAPIAllocateBuffer,                                     MAPIFreeBuffer,                                     STGM_CREATE | STGM_READWRITE,                                     pRows->aRow[i].lpProps[0].Value.lpszA,                                     NULL,                                     &pStrmDest)))                     break;                   pStrmSrc -> Stat(&StatInfo, STATFLAG_NONAME);                   hRes = pStrmSrc -> CopyTo(pStrmDest,                                             StatInfo.cbSize,                                             NULL,                                             NULL);                   // Commit changes to new stream                   pStrmDest -> Commit(0);                   // Release each of our streams                   pStrmDest -> Release();                   pStrmSrc -> Release();                 }                 // Release the attachment                 lpAttach -> Release();              }            }          }        }        FreeProws(pRows);        if (pAttTbl)          pAttTbl -> Release();      }    Quit:        MAPIFreeBuffer((LPVOID) pProps);        return hRes;    }
注意: 如果消息或结构化的存储 (OLE 对象),该附件,没有 PR_ATTACH_DATA_BIN 属性。另一个附件的属性,PR_ATTACH_METHOD,实质上是可以包含四个不同的值来告诉您要执行的操作:
  • ATTACH_BY_VALUE 意味着使用 PR_ATTACH_DATA_BIN 属性。
  • ATTACH_BY_REFERENCE 意味着使用 PR_ATTACH_PATHNAME ;该文件不是实际包含的。
  • 在 PR_ATTACH_DATA_OBJ,这将使您返回IMessageIStorage接口分别调用OpenProperty的 ATTACH_EMBEDDED_MESSAGE 或 ATTACH_OLE 的平均值。
PR_ATTACH_METHOD 属性的详细信息,请参阅下面的 Microsoft 开发人员网络 (MSDN) Web 站点:
原创粉丝点击