Cómo configurar la información del destinatario
La estructura del destinatario MAPI es como se muestra en la figura (extraída de MSDN):
Cada entrada representa un grupo de información del destinatario, y cada grupo de información puede constar de múltiples información Compuesto, por ejemplo, el siguiente código representa la información de un destinatario:
aEntries[0].rgPropVals[0].Value.ul = MAPI_TO;
aEntries[0]. [0].Value.ul=MAPI_TO;
aEntries[0].rgPropVals[0].Value.
aEntries[0].rgPropVals[0].Value.ul = MAPI_TO;// Escriba, MAPI_TO significa establecer en el campo TO, correspondientemente MAPI_CC y MAPI_BCC.
ulPropTag = PR_ADDRTYPE; //Establece el tipo de dirección, normalmente SMTP
aEntries[0].rgPropVals[1].Value.LPSZ = _T("SMTP");
aEntries[ 0].rgPropVals[2].ulPropTag = PR_EMAIL_ADDRESS; // Dirección del destinatario
aEntries[0].rgPropVals[2].Value.LPSZ = _T("1234567");
Establecer destinatarios a través de IMessage:.ModifyRecipients.Value.LPSZ: el siguiente ejemplo de código muestra cómo configurar las propiedades TO, CC y BCC:
INT nRecipientCount = 3 //Indica que hay 3 información de contacto
INT nListBufSize = CbNewADRLIST(nRecipientCount); //Calcula el espacio de almacenamiento requerido para 3 contactos
LPADRLIST pAddressList = NULL;
MAPIAllocateBuffer (nListBufSize, (LPVOID FAR * )&pAddressList)); //asignar espacio
memset(pAddressList, 0, nBufSize);
pAddressList->cEntries = 3 //indica que un **** tiene 3 información de contacto
///Establecer en
INT nCurIndex = 0;
MAPIAllocateBuffer(sizeof(SPropValue) * 3, ( LPVOID FAR *)&pAddressList- >aEntries[nCurIndex].(LPVOID FAR *)&pAddressList->aEntries[nCurIndex].rgPropVals));//Asignar espacio memset(pAddressList->aEntries[nCurIndex].rgPropVals, 0, sizeof(SPropValue ) * 3);
pAddressList->aEntries [nCurIndex].rgPropVals[0].rgPropVals[1].ulPropTag=PR_ADDRTYPE;
pAddressList->aEntries[nCurIndex].rgPropVals [1].Value. LPSZ=_T("SMTP");
pAddressList->aEntries[nCurIndex].rgPropVals[2].Value.LPSZ=_T("SMTP")rgPropVals[2]. p>
pAddressList->aEntries[nCurIndex].rgPropVals[2].Value.LPSZ = _T("1234567");
pAddressList->aEntries[nCurIndex]. //Indica que hay 3 propiedades a configurar para changi
ng el contacto
// Igual que arriba, ahora establezca CC
nCurIndex = 1;
MAPIAllocateBuffer(sizeof(SPropValue) * 3, (LPVOID FAR * )&pAddressList->aEntries[nCurIndex].cValues = 3;;
pAddressList->aEntries[nCurIndex].rgPropVals)); //asignar espacio memset(pAddressList->aEntries[nCurIndex].rgPropVals , 0 , sizeof(SPropValue) * 3);
pAddressList->aEntries[nCurIndex].rgPropVals[0].ulPropTag = PR_RECIPIENT_TYPE;
pAddressList->aEntries[nCurIndex]. rgPropVals[ 0].Value.rgPropVals[2].Value.LPSZ = _T("7654321");
Lista de direcciones->aEntries[nCurIndex].cValues = 3; hay 3 atributos que se deben configurar para el contacto de cambio
// Igual que arriba, ahora configure BCC
nCurIndex = 2;
MAPIAllocateBuffer(sizeof( SPropValue) * 3, (LPVOID FAR *)&pAddressList->aEntries[nCurIndex].rgPropVals)); //asignar espacio 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 //Indica escritura; CC
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; // Indica que hay 3 propiedades que deben configurarse al cambiar un contacto
//Llame a ModifyRecipients para agregar un contacto. Una vez completado, recuerde liberar el contacto. La memoria pMsg se utiliza para el M que desea operar.
La instancia del objeto de mensaje. Para saber cómo obtenerla, consulte el artículo anterior. pMsg->ModifyRecipients(MODRECIP_ADD, pAddressList)
for(INT i = 0; i < nRecipientCount; i++)
MAPIFreeBuffer(pAddressList->aEdit)(pAddressList->aEdit)) > aEntries[i].rgPropVals);
MAPIFreeBuffer(pAddressList);
(6) Cómo obtener información del destinatario
A continuación comenzamos a discutir cómo Obtener información de contacto, que es más similar a la información de configuración Aquí hay un ejemplo:
IMAPITable* pTable = NULL;
// Obtenga la lista de información de contacto a través de GetRecipientTable
pMsg-. >GetRecipientTable( NULL, &pTable );
LPADRLIST pRecipentRows = NULL;
// Obtenga la información de cada contacto, el método aquí es similar a enumerar carpetas, etc.
while(!FAILED(hr = pTable->QueryRows(1, 0, (LPSRowSet*)& pRecipentRows)))
{
if( pRecipentRows ->cEntries == 0 )
romper;
for(int n = 0; n < pRecipentRows->cEntries; n++ )
{
/Cada entrada representa una información de contacto y cada información de contacto, a su vez, incluye múltiples atributos
for(int i = 0; i < pRecipentRows->aEntries[n].cValues; i++)
{
// Determina si es el atributo PR_EMAIL_ADDRESS, se encuentra la dirección de contacto
if( PR_EMAIL_ADDRESS == pRecipentRows->aEntries[n].rgPropVals [i ].ulPropTag )
{
//Dirección de contacto
CString strContact = pRecipentRows->aEntries[n].rgPropVals[i].Value. lpszW
/Seguimiento
}
}
}
{
// Una vez hecho esto, recuerde liberar pRecipentRows y su contenido; consulte el artículo anterior sobre cómo configurar la información de contacto para obtener detalles sobre cómo hacerlo.
......
}
El fragmento de código anterior solo demuestra brevemente los pasos básicos para obtener información de contacto. A través de este ejemplo, también puede hacerlo. Familiarícese con el uso de IMAPITable. IMAPITable se utiliza en muchos lugares de MAPI.
Este ejemplo también puede familiarizarlo con el uso de IMAPITable.
(7) Configurar archivos adjuntos de correo electrónico
Este artículo presentará cómo configurar archivos adjuntos de correo electrónico y el siguiente artículo presentará cómo obtener archivos adjuntos. Para abreviar la historia, el siguiente ejemplo hará lo siguiente:
1) Para prepararlo, primero coloque algunas imágenes en el directorio Temp. En este ejemplo, puse dos imágenes JPG en el directorio Temp. , respectivamente. Son 1.jpg y 2.jpg. Pondré estas dos imágenes en Mensaje y generaré dos archivos adjuntos.
2) Cree un nuevo mensaje en la carpeta Borradores de Outlook.
3) Añadir archivos adjuntos al mensaje.
Cómo crear un nuevo mensaje en la carpeta Borradores de Outlook. Creo que el artículo anterior lo ha explicado claramente, por lo que no entraré en detalles aquí. Supongamos que hemos obtenido el puntero del objeto IMessage*. . Primero, se propone una función auxiliar: MAPIHelp_AddAttachment se utiliza para agregar el archivo especificado como un archivo adjunto al mensaje especificado. Se define de la siguiente manera:
BOOL MAPIHelp_AddAttachment( IMessage* pMsg, LPCTSTR szFilePath, LPCTSTR szFileName ) ;
pMsg: puntero al objeto de destino del mensaje
szFilePath: la ruta completa del archivo que debe agregarse como archivo adjunto
szFileName: el nombre del archivo que debe agregarse como archivo adjunto
La siguiente es la implementación específica de la función:
BOOL MAPIHelp_AddAttachment( IMessage* pMsg, LPCTSTR szFilePath, LPCTSTR szFileName ) p>
{
if( NULL == pMsg || NULL == szFilePath )
return FALSE;
BOOL bRet = FALSE; p>
ULONG ulAttachNum = 0;
LPATTACH pAttach = NULL ;
IStream* pStream = NULL;
HANDLE hFile = NULL;
SPropValue rgpropsTo[1] = {0};
DWORD dwChunkSize = 4096;
DWORD dwSizeRead = 0;
// Preparar BUFFER para leer y escribir archivos contenido
LPBYTE pData = new BYTE[dwChunkSize];
if( NULL == pData )
Devuelve FALSE;
// Cree un archivo adjunto y devuelva un objeto IAttach. Cada objeto IAttach corresponde a un archivo adjunto. ulAttachNum es el ID de este objeto. Podemos leer este archivo adjunto pasando este ID durante IMessage::OpenAttach, el método específico se presentará a continuación. artículo.
if( FAILED(pMsg->CreateAttach( NULL, NULL, &ulAttachNum, &pAttach )))
ir a Salir;
//Establecer nombre del archivo adjunto p> p>
rgpropsTo[0 ].ulPropTag = PR_ATTACH_FILENAME;
rgpropsTo[0].Value.lpszW = (LPTSTR)szFileName;
If( FAILED(pAttach- >SetProps (1, rgpropsTo, NULL)) )
goto Exit;
// Obtener el objeto IStream a través de OpenProperty Podemos leer y escribir datos usando el objeto IStream. Para IAttach:: Para IAttach::OpenProperty, CE solo admite el atributo PR_ATTACH_DATA_BIN.
if( FAILED(pAttach->OpenProperty( PR_ATTACH_DATA_BIN, NULL, NULL, MAPI_MODIFY, (LPUNKNOWN *)&pStream )).)
ir a Salir
//La siguiente parte es la parte de lectura/escritura del archivo, que lee datos del archivo original y los escribe en el archivo adjunto
hFile = ::CreateFile( szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ ATTRIBUTE_NORMAL, NULL );
if( INVALID_HANDLE_VALUE == hFile )
ir a Salir;
while( ReadFile( hFile, pData, dwChunkSize, &.dwSizeRead, NULL ) )
{
if( 0 >= dwSizeRead )
romper
pStream->Write( pData, dwSizeRead, &dwSizeRead );
}
bRet = TRUE;
Salir:
Libera el objeto adquirido una vez completado.
RELEASE_OBJ(pStream);
RELEASE_OBJ(pAttach);
DELETE_OBJ(pData);
if( INVALID_HANDLE_VALUE != hFile )
::CloseHandle( hFile );
return bRet;
}
Usando la función auxiliar anterior, cuando queremos agregar Adjunto, podemos llamar a esta función de la siguiente manera:
MAPIHelp_ AddAttachment( pMsg, _T("//Temp/1.jpg"), _T("1.jpg") );
MAPIHelp_AddAttachment(pMsg,_T("//Temp/2.jpg"),_T("2.jpg"));
(8) Leer archivos adjuntos de mensajes
En En el artículo anterior sobre cómo configurar archivos adjuntos para MESSAGE, continuaremos discutiendo el tema de los archivos adjuntos. Utilizando el ejemplo anterior, veremos a continuación cómo obtener información adjunta para MESSAGE. Lo siguiente se completará a través de dos funciones auxiliares:
BOOL MAPIHelp_SaveAttachFile( LPATTACH pAttach, LPCTSTR szFile )
Función: leer el contenido de un único archivo adjunto y guardarlo en la ubicación especificada
pAttach: p>
szFile: Objeto adjunto. p>
szFile: guardar el nombre del archivo
BOOL MAPIHelp_GetAttachment( IMessage* pMsg, LPCTSTR szFilePath)
Propósito: obtener todos los archivos adjuntos de un solo mensaje y guardarlos Al directorio especificado
pMsg: objeto de mensaje de destino
szFilePath: directorio de destino
El siguiente es el método de implementación:
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;
DWORD dwWrite = 0;
BOOL bRet = FALSE;
ULONG ulRead = 0;
//O Abra el archivo adjunto y obtenga el objeto IStream en obtenga el contenido del archivo, de acuerdo con Según la explicación de MSDN, aquí solo se admite el atributo PR_ATTACH_DATA_BIN.
if(FAILED(pAttach->OpenProperty (PR_ATTACH_DATA_BIN, NULL, STGM_READ, MAPI_MODIFY,
reinterpret_cast
{
ir a EXIT;
}
/ Crear archivo de destino
hFile = ::CreateFile(szFile, GENERIC_WRITE, 0, NULL , OPEN_ ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE == hFile)
{
ir a SALIR;
p> p>
Crear archivo de destino
.