如何设置收件人信息

如何设置收件人信息,第1张

发件人和收件人是邮件和消息很常用的几个属性之一,关于发件人的设置和获取是很简单的,只需要处理PR_SENDER_EMAIL_ADDRESS属性即可,下面主要讲述的收件人的设置和获取。

MAPI收件人结构如图(摘自MSDN):

每一个Entry代表了一个收件人信息组,每个信息组又可以有多项信息组成,举个例子,下面的代码代表了一个收件人的信息:

aEntries[0].rgPropVals[0].ulPropTag = PR_RECIPIENT_TYPE //类型,MAPI_TO代表是设置到TO字段上的,相应的还有MAPI_CC和MAPI_BCC。

aEntries[0].rgPropVals[0].Value.ul= MAPI_TO

aEntries[0].rgPropVals[1].ulPropTag= PR_ADDRTYPE //设置地址类型,一般为SMTP

aEntries[0].rgPropVals[1].Value.LPSZ = _T("SMTP")

aEntries[0].rgPropVals[2].ulPropTag= PR_EMAIL_ADDRESS //收件人地址

aEntries[0].rgPropVals[2].Value.LPSZ = _T("1234567")

设置收件人是通过IMessage:: ModifyRecipients来实现的,以下的代码举例说明了如何设置TO、CC和BCC属性:

INT nRecipientCount= 3 //表示有3个联系人信息

INT nListBufSize = CbNewADRLIST(nRecipientCount) //计算3个联系人需要的存储空间

LPADRLIST pAddressList = NULL

MAPIAllocateBuffer(nListBufSize, (LPVOID FAR *)&pAddressList)) //分配空间

memset(pAddressList, 0, nBufSize)

pAddressList->cEntries = 3 //表明一共有3个联系人信息

//设置To

INT nCurIndex = 0

MAPIAllocateBuffer(sizeof(SPropValue) * 3, (LPVOID FAR *)&pAddressList->aEntries[nCurIndex].rgPropVals)) //分配空间 memset(pAddressList->aEntries[nCurIndex].rgPropVals, 0, sizeof(SPropValue) * 3)

pAddressList->aEntries[nCurIndex].rgPropVals[0].ulPropTag = PR_RECIPIENT_TYPE

pAddressList->aEntries[nCurIndex].rgPropVals[0].Value.ul = MAPI_TO //表明是写到To

pAddressList->aEntries[nCurIndex].rgPropVals[1].ulPropTag = PR_ADDRTYPE

pAddressList->aEntries[nCurIndex].rgPropVals[1].Value.LPSZ = _T("SMTP")

pAddressList->aEntries[nCurIndex].rgPropVals[2].ulPropTag = PR_EMAIL_ADDRESS

pAddressList->aEntries[nCurIndex].rgPropVals[2].Value.LPSZ = _T("1234567")

pAddressList->aEntries[nCurIndex].cValues = 3 //表明改联系人有3个属性要设置

//同上,现在设置CC

nCurIndex= 1

MAPIAllocateBuffer(sizeof(SPropValue) * 3, (LPVOID FAR *)&pAddressList->aEntries[nCurIndex].rgPropVals)) //分配空间 memset(pAddressList->aEntries[nCurIndex].rgPropVals, 0, sizeof(SPropValue) * 3)

pAddressList->aEntries[nCurIndex].rgPropVals[0].ulPropTag = PR_RECIPIENT_TYPE

pAddressList->aEntries[nCurIndex].rgPropVals[0].Value.ul = MAPI_CC //表明是写到CC

pAddressList->aEntries[nCurIndex].rgPropVals[1].ulPropTag = PR_ADDRTYPE

pAddressList->aEntries[nCurIndex].rgPropVals[1].Value.LPSZ= _T("SMTP")

pAddressList->aEntries[nCurIndex].rgPropVals[2].ulPropTag = PR_EMAIL_ADDRESS

pAddressList->aEntries[nCurIndex].rgPropVals[2].Value.LPSZ= _T("7654321")

pAddressList->aEntries[nCurIndex].cValues = 3 //表明改联系人有3个属性要设置

//同上,现在设置BCC

nCurIndex= 2

MAPIAllocateBuffer(sizeof(SPropValue) * 3, (LPVOID FAR *)&pAddressList->aEntries[nCurIndex].rgPropVals)) //分配空间 memset(pAddressList->aEntries[nCurIndex].rgPropVals, 0, sizeof(SPropValue) * 3)

pAddressList->aEntries[nCurIndex].rgPropVals[0].ulPropTag = PR_RECIPIENT_TYPE

pAddressList->aEntries[nCurIndex].rgPropVals[0].Value.ul = MAPI_BCC //表明是写到CC

pAddressList->aEntries[nCurIndex].rgPropVals[1].ulPropTag = PR_ADDRTYPE

pAddressList->aEntries[nCurIndex].rgPropVals[1].Value.LPSZ = _T("SMTP")

pAddressList->aEntries[nCurIndex].rgPropVals[2].ulPropTag = PR_EMAIL_ADDRESS

pAddressList->aEntries[nCurIndex].rgPropVals[2].Value.LPSZ = _T("88888888")

pAddressList->aEntries[nCurIndex].cValues = 3 //表明改联系人有3个属性要设置

//调用ModifyRecipients添加联系人,完了记的释放申请的内存,pMsg为你想 *** 作的Message的对象实例,关于如何获取可以参考以前的文章。 pMsg->ModifyRecipients(MODRECIP_ADD, pAddressList)

for(INT i = 0i <nRecipientCounti++)

MAPIFreeBuffer(pAddressList->aEntries[i].rgPropVals)

MAPIFreeBuffer(pAddressList)

(六)如何获取收件人信息

接下来开始讲讲如何获取联系人信息,它与设置信息比较相近,以下举例说明:

IMAPITable* pTable = NULL

//通过GetRecipientTable获取联系人信息列表

pMsg->GetRecipientTable( NULL, &pTable )

LPADRLIST pRecipentRows = NULL

//获取每个联系人信息,这里的做法可以看出和枚举Folder等都相似

while(!FAILED(hr = pTable->QueryRows(1, 0, (LPSRowSet*)&pRecipentRows)))

{

if( pRecipentRows->cEntries == 0 )

break

for(int n = 0n <pRecipentRows->cEntriesn++ )

{

//每个Entry代表一个联系人信息,每个联系人信息又有多个属性组成

for(int i = 0i <pRecipentRows->aEntries[n].cValues i++)

{

//判断如果是PR_EMAIL_ADDRESS属性,那么就找到了联系人地址

if( PR_EMAIL_ADDRESS == pRecipentRows->aEntries[n].rgPropVals[i].ulPropTag )

{

//联系人地址

CString strContact = pRecipentRows->aEntries[n].rgPropVals[i].Value.lpszW

//后续 *** 作

}

}

}

//完了记得要释放pRecipentRows和它里面的内容,释放方法见上一篇关于设置联系人信息的介绍。

……

}

上面的代码片段只简单演示了获取联系人信息的基本 *** 作步骤,通过这个例子也可以熟悉IMAPITable的用法,MAPI里面还是有很多地方会用到这个接口,用处还是比较大的。

(七)设置Message附件

本篇主要介绍如何设置Message的附件内容,下一篇会介绍如何获取附件。长话短说,下面的例子将完成如下的事情:

1) 准备工作,在Temp目录下先放上几张图片,在这个例子里面,我在Temp目录放两张JPG图片,1.jpg,2.jpg,我将把这两张图片放到一个Message里面,生成两个附件。

2) 在Outlook草稿箱里面创建出一条新的Message。

3) 为Message添加附件。

如何在Outlook草稿箱里面创建一条新的Message,我想通过前面的文章已经解释清楚了,这里就不罗嗦了,以下假设我们已经获取了IMessage*对象指针。首先提出一个帮助函数:MAPIHelp_AddAttachment,该函数作用是为指定的Message添加指定文件作为附件,定义如下:

BOOL MAPIHelp_AddAttachment( IMessage* pMsg, LPCTSTR szFilePath, LPCTSTR szFileName )

pMsg : Message目标对象指针

szFilePath : 需要作为附件添加的文件全路径

szFileName : 需要作为附件添加的文件名称,作为附件的名称

以下是函数具体实现:

BOOL MAPIHelp_AddAttachment( IMessage* pMsg, LPCTSTR szFilePath, LPCTSTR szFileName )

{

if( NULL == pMsg || NULL == szFilePath )

return FALSE

BOOL bRet = FALSE

ULONG ulAttachNum = 0

LPATTACH pAttach = NULL

IStream* pStream = NULL

HANDLE hFile = NULL

SPropValue rgpropsTo[1] = {0}

DWORD dwChunkSize = 4096

DWORD dwSizeRead = 0

//预备BUFFER,用来读写文件内容

LPBYTE pData = new BYTE[dwChunkSize]

if( NULL == pData )

return FALSE

//创建附件,返回IAttach对象,每个IAttach对象对应于一个附件, ulAttachNum是这个对象的标识,我们可以通过IMessage:: OpenAttach时传入这个ID来读取这个附件,具体的方法会在下篇时介绍。

if( FAILED(pMsg->CreateAttach( NULL, NULL, &ulAttachNum, &pAttach )) )

goto Exit

//设置附件名称

rgpropsTo[0].ulPropTag = PR_ATTACH_FILENAME

rgpropsTo[0].Value.lpszW= (LPTSTR)szFileName

if( FAILED(pAttach->SetProps(1, rgpropsTo, NULL)) )

goto Exit

//通过OpenProperty获取IStream对象,有了IStream对象,我们就可以读写数据。对于IAttach:: OpenProperty,CE上只支持PR_ATTACH_DATA_BIN属性。

if( FAILED(pAttach->OpenProperty( PR_ATTACH_DATA_BIN, NULL, NULL, MAPI_MODIFY, (LPUNKNOWN *)&pStream )) )

goto Exit

//下面部分是文件读写部分,从原始文件里读出数据,再写到附件里面去

hFile = ::CreateFile( szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL )

if( INVALID_HANDLE_VALUE == hFile )

goto Exit

while( ReadFile( hFile, pData, dwChunkSize, &dwSizeRead, NULL ) )

{

if( 0 >= dwSizeRead )

break

pStream->Write( pData, dwSizeRead, &dwSizeRead )

}

bRet = TRUE

Exit:

//完毕以后记的释放获取的对象。

RELEASE_OBJ(pStream)

RELEASE_OBJ(pAttach)

DELETE_OBJ(pData)

if( INVALID_HANDLE_VALUE != hFile )

::CloseHandle( hFile )

return bRet

}

有了上面的帮助函数,当我们想为一条Message添加附件时,可以按照如下调用:

MAPIHelp_AddAttachment( pMsg, _T("//Temp//1.jpg"), _T("1.jpg") )

MAPIHelp_AddAttachment( pMsg, _T("//Temp//2.jpg"), _T("2.jpg") )

(八)读取Message附件

在上一篇里面讲述了如何为一条MESSAGE设置附件,下面将继续关于附件的话题,利用上一个例子,我们接下来来看看如何获取一条MESSAGE的附件信息。下面将通过两个帮助函数来完成:

BOOL MAPIHelp_SaveAttachFile( LPATTACH pAttach, LPCTSTR szFile )

作用:读取单个附件文件内容,并保存到指定位置

pAttach: 附件对象

szFile: 保存文件名

BOOL MAPIHelp_GetAttachment( IMessage* pMsg, LPCTSTR szFilePath )

作用:获取一条Message的全部附件,并保存到指定目录下

pMsg: 目标消息对象

szFilePath: 目标目录

下面来看看具体实现:

BOOL MAPIHelp_SaveAttachFile( LPATTACH pAttach, LPCTSTR szFile )

{

if( NULL == pAttach || NULL == szFile )

return FALSE

HANDLE hFile = INVALID_HANDLE_VALUE

IStream* pstmAttachment = NULL

char *pBuffer= NULL

int i = 0

DWORDdwWrite= 0

BOOL bRet = FALSE

ULONGulRead = 0

//打开附件,获取IStream对象,用于获取文件内容,根据MSDN的解释,这里只支持PR_ATTACH_DATA_BIN属性。

if(FAILED(pAttach->OpenProperty (PR_ATTACH_DATA_BIN, NULL, STGM_READ, MAPI_MODIFY,

reinterpret_cast <IUnknown **>(&pstmAttachment))))

{

goto EXIT

}

//创建目标文件

hFile = ::CreateFile(szFile, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)

if(INVALID_HANDLE_VALUE == hFile)

{

goto EXIT

1、由于 iMessage 是通过网络来发送信息的,所以在发送之前,请先把手机接入蜂窝移动网络或者是无线网络。然后,接下来要做的是激活 iMessage 服务,在 iPhone 主屏上找到“设置”图标,点击打开。

2、进入设置之后,按图片提示往下划,知道找到“信息”然后,点击 iMessage 开关,将其打开,在打开“发送已读回执”。之后,看到下面“发送与接收”,点击进入。

3、我们可以看到有邮件地址和手机号码,手机号码就是手机卡的号码、邮件地址默认是Apple ID的邮件地址。点击“添加其他电子邮件地址”、输入你想要在iMessage上使用的另一个邮箱地址,等待苹果发送验证邮箱的E-mail,点击链接完成验证。验证完成后你就可以收发iMessage信息使用你自己添加的邮箱地址。

在“开始新对话使用”下方不同的账号前打勾,可以选择使用不同的账号进行。

4、imessage的信息界面是蓝色的,区别于一般短信的绿色。既可以发送文字,也可以发送图片。还可以知道信息投递状态“已送达”、“已读”、“尚未送达”等。

第一步iMessage便捷犹如短信,传情达意不再止于翰墨。照片、视频、通讯录、地位信息,只需轻轻触动即可及时发送。

1.设置-信息-iMessage-选择on。

第二步2.然后便是进入正常的短信界面,发短信如果对方有开通iMessage,将自动转成iMessage发出,颜色是蓝色的,跟正常的短信绿色相互区别。

第三步3.注意,使用时设备必须是联网状态,而接收信息的工具也是开通iMessage并联网的人


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11715472.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存