Reputation: 273
I am having no luck fetching the message body of an email from an Exchange 2010 server using php-ews. This is my code :
$ews = new ExchangeWebServices("hostname", "username","password",ExchangeWebServices::VERSION_2010);
$request = new EWSType_FindItemType();
$itemProperties = new EWSType_ItemResponseShapeType();
$itemProperties->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES;
$itemProperties->BodyType = EWSType_BodyTypeResponseType::BEST;
$request->ItemShape = $itemProperties;
//If I do not include the below three sentences I get a PHP Fatal error saying "Basepoint" not found
$request->IndexedPageItemView = new EWSType_IndexedPageViewType();
$request->IndexedPageItemView->BasePoint = 'Beginning';
$request->IndexedPageItemView->Offset = 0;
$request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType();
$request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType();
$request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::INBOX;
$request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW;
$result = new EWSType_FindItemResponseMessageType();
$result = $ews->FindItem($request);
if ($result->ResponseMessages->FindItemResponseMessage->ResponseCode == 'NoError' && $result->ResponseMessages->FindItemResponseMessage->ResponseClass == 'Success'){
$message = $result->ResponseMessages->FindItemResponseMessage->Items->Message;
//This if loop is entered but the $message variable contains nothing
print_r($message);exit;
//var_dump($message) displays NULL
}
The "if" loop is entered however the $message variable contains nothing. Typically it should be an object from which I can retrieve the body of the email.
What am I doing wrong ?
I tried this inside the if() statement and I got the $message object :
$message = $result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message;
print_r($message);exit;
The "RootFolder" attribute was missing. However the resulting $message variable does not contain any "body" attribute that contains the body of the email. This is how the print_r($message) looks like :
stdClass Object
( [ItemId] => stdClass Object ( [Id] => AAMkADZjOTZhNjNkLTBmZTAtNDdkZi04NGI5LTdiZWY0ZWYzOGNhMwBGAAAAAABI9LX/rIDdRr5XMdDM8RGZBwAL3uOTQAYYQ4U8CTQP/+wKAAAAWsnbAAAL3uOTQAYYQ4U8CTQP/+wKAAAAWvd0AAA= [ChangeKey] => CQAAABYAAAAL3uOTQAYYQ4U8CTQP/+wKAAAAWyCi )
[ParentFolderId] => stdClass Object
(
[Id] => AQMkADZjOTZhNjNkLTBmZTAtNDdkZi04NGI5LTdiZWY0ZWYzOGNhMwAuAAADSPS1/6yA3Ua+VzHQzPERmQEAC97jk0AGGEOFPAk0D//sCgAAAVrJ2wAAAA==
[ChangeKey] => AQAAAA==
)
[ItemClass] => IPM.Note
[Subject] => Test
[Sensitivity] => Normal
[DateTimeReceived] => 2012-09-05T13:03:08Z
[Size] => 4754
[Importance] => Normal
[IsSubmitted] =>
[IsDraft] =>
[IsFromMe] =>
[IsResend] =>
[IsUnmodified] => 1
[DateTimeSent] => 2012-09-05T13:03:00Z
[DateTimeCreated] => 2012-09-05T13:03:08Z
[DisplayCc] =>
[DisplayTo] => sara cooper
[HasAttachments] =>
[Culture] => en-IN
[EffectiveRights] => stdClass Object
(
[CreateAssociated] =>
[CreateContents] =>
[CreateHierarchy] =>
[Delete] => 1
[Modify] => 1
[Read] => 1
)
[LastModifiedName] => Lin T
[LastModifiedTime] => 2012-09-05T13:03:08Z
[IsAssociated] =>
[WebClientReadFormQueryString] => ?ae=Item&a=Open&t=IPM.Note&id=RgAAAABI9LX%2frIDdRr5XMdDM8RGZBwAL3uOTQAYYQ4U8CTQP%2f%2bwKAAAAWsnbAAAL3uOTQAYYQ4U8CTQP%2f%2bwKAAAAWvd0AAAJ&exvsurl=1
[ConversationId] => stdClass Object
(
[Id] => AAQkADZjOTZhNjNkLTBmZTAtNDdkZi04NGI5LTdiZWY0ZWYzOGNhMwAQAJ56TrE0QUIAk59ALIqWrrY=
)
[Sender] => stdClass Object
(
[Mailbox] => stdClass Object
(
[Name] => Lin T
[MailboxType] => OneOff
)
)
[IsReadReceiptRequested] =>
[ConversationIndex] => Í‹fÃIžzN±4AB“Ÿ@,Š–®¶
[ConversationTopic] => Test
[From] => stdClass Object
(
[Mailbox] => stdClass Object
(
[Name] => Lin T
[MailboxType] => OneOff
)
)
[InternetMessageId] => <[email protected]>
[IsRead] =>
[ReceivedBy] => stdClass Object
(
[Mailbox] => stdClass Object
(
[Name] => sara cooper
[MailboxType] => OneOff
)
)
[ReceivedRepresenting] => stdClass Object
(
[Mailbox] => stdClass Object
(
[Name] => sara cooper
[MailboxType] => OneOff
)
)
)
I also need the EMAIL ADDRESS of the sender and the receiver. Here only the first name and last names are displayed. Please help this is getting really urgent.
Upvotes: 1
Views: 6500
Reputation: 17277
Here is a better solution. You do not want to issue a GetItem request each time for a message. It is costly and inefficient and fetching emails in folders containing thousands of emails is terribly slow. Also note, if exchange returns 1 email vs. multiple emails, some objects get embedded into an array, so your code needs to account for it. This code snippet will bring back multiple email message bodies, if available.
$ews = new ExchangeWebServices("hostname", "username", "password", ExchangeWebServices::VERSION_2010);
$request = new EWSType_FindItemType();
$itemProperties = new EWSType_ItemResponseShapeType();
$itemProperties->BaseShape = EWSType_DefaultShapeNamesType::ID_ONLY;
$itemProperties->BodyType = EWSType_BodyTypeResponseType::TEXT;
$request->ItemShape = $itemProperties;
$request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType();
$request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType();
$request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::INBOX;
$request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW;
$result = new EWSType_FindItemResponseMessageType();
$result = $ews->FindItem($request);
if ($result->ResponseMessages->FindItemResponseMessage->ResponseCode == 'NoError' && $result->ResponseMessages->FindItemResponseMessage->ResponseClass == 'Success') {
$count = $result->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView;
$request = new EWSType_GetItemType();
$request->ItemShape = new EWSType_ItemResponseShapeType();
$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES;
for ($i = 0; $i < $count; $i++){
$message_id = $result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message[$i]->ItemId->Id;
$messageItem = new \EWSType_ItemIdType();
$messageItem->Id = $message_id;
$request->ItemIds->ItemId[] = $messageItem;
}
// Here is your response
$response = $ews->GetItem($request);
}
Upvotes: 1
Reputation: 273
I finally got it working! Here is how you retrieve unread emails from a Exchange 2010 Server:
$ews = new ExchangeWebServices("hostname", "username", "password",ExchangeWebServices::VERSION_2010);
$request = new EWSType_FindItemType();
$itemProperties = new EWSType_ItemResponseShapeType();
$itemProperties->BaseShape = EWSType_DefaultShapeNamesType::ID_ONLY;
$itemProperties->BodyType = EWSType_BodyTypeResponseType::BEST;
$request->ItemShape = $itemProperties;
$fieldType = new EWSType_PathToUnindexedFieldType();
$fieldType->FieldURI = 'message:IsRead';
$constant = new EWSType_FieldURIOrConstantType();
$constant->Constant = new EWSType_ConstantValueType();
$constant->Constant->Value = "0";
$IsEqTo = new EWSType_IsEqualToType();
$IsEqTo->FieldURIOrConstant = $constant;
$IsEqTo->Path = $fieldType;
$request->Restriction = new EWSType_RestrictionType();
$request->Restriction->IsEqualTo = new EWSType_IsEqualToType();
$request->Restriction->IsEqualTo->FieldURI = $fieldType;
$request->Restriction->IsEqualTo->FieldURIOrConstant = $constant;
$request->IndexedPageItemView = new EWSType_IndexedPageViewType();
$request->IndexedPageItemView->BasePoint = 'Beginning';
$request->IndexedPageItemView->Offset = 0;
$request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType();
$request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType();
$request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::INBOX;
$request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW;
$result = new EWSType_FindItemResponseMessageType();
$result = $ews->FindItem($request);
/*echo '<pre>';
print_r($result);exit;*/
if ($result->ResponseMessages->FindItemResponseMessage->ResponseCode == 'NoError' && $result->ResponseMessages->FindItemResponseMessage->ResponseClass == 'Success'){
$count = $result->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView;
for ($i = 0; $i < $count; $i++){
$message_id = $result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message[$i]->ItemId->Id;
$request = new EWSType_GetItemType();
$request->ItemShape = new EWSType_ItemResponseShapeType();
$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES;
$request->ItemIds = new EWSType_NonEmptyArrayOfBaseItemIdsType();
$request->ItemIds->ItemId = new EWSType_ItemIdType();
$request->ItemIds->ItemId->Id = $message_id;
$response = $ews->GetItem($request);
//print_r($response);exit;
if( $response->ResponseMessages->GetItemResponseMessage->ResponseCode == 'NoError' &&
$response->ResponseMessages->GetItemResponseMessage->ResponseClass == 'Success' ) {
$message = $response->ResponseMessages->GetItemResponseMessage->Items->Message;
//process the message data.
}
}
}
Upvotes: 3
Reputation: 4560
$message
is an object containing whole message (including headers for example), not a string with message body.
To get object containing message body, message body type etc use $message->body
and if you are simply interested in printing message body content use $message->body->_
Upvotes: 0