您的位置:首页 > 其它

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

2013-08-01 11:17 148 查看

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

文章编号: 173353 - 查看本文应用于的产品


查看机器翻译免责声明


Microsoft
支持页面的机器翻译

展开全部 | 关闭全部




本页




概要

下面的代码示例演示如何打开附件,并将内容复制到当前目录中的文件。


回到顶端
| 提供反馈




更多信息

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

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

PR_ATTACH_FILENAME 和 PR_ATTACH_NUM。

在附件表中打开的附件。

创建一个文件附件。

将复制到新创建的文件附件的内容。


示例代码


/* 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 站点:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: