2012-09-06 87 views
1

我没有运气使用php-ews从Exchange 2010服务器获取邮件正文。这是我的代码:PHP和Exchange Web服务:使用php-ews获取邮件正文

$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 
} 

“if”循环被输入,但$ message变量不包含任何内容。通常它应该是我可以从中检索电子邮件正文的对象。

我在做什么错?

这个我试过了,如果()语句中,我得到了$消息对象:

$message = $result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message; 
print_r($message);exit; 

的“RootFolder”属性缺失。但是,得到的$ message变量不包含任何包含电子邮件正文的“body”属性。这是的print_r($消息)如何看起来像:

stdClass Object 

( [项目Id] => stdClass的对象 ( [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 
      ) 

    ) 

我还需要发件人和收件人的电子邮件地址。这里只显示名字和姓氏。请帮助这个变得非常紧急。

回答

0

$message是一个包含整个消息(包括头部)的对象,而不是包含消息正文的字符串。 要获取包含邮件正文,邮件正文类型等的对象,请使用$message->body,如果您只是对打印邮件正文内容感兴趣,请使用$message->body->_

+1

我非常明白$ message变量是一个对象而不是一个字符串......手头的问题是我得到一个空的$ message变量,例如当我var_dump变量时我得到NULL 。我还能如何检索电子邮件的内容? – Lin

+2

这是因为您的修改代码获取文件夹内容列表,而不是完整的消息。使用该信息中的项目ID使用我在这里发布的代码获取整个消息http://stackoverflow.com/questions/10846245/php-exchange-web-services-get-message-body – c2h5oh

+0

我明白了......以及如何我确保只读取未读电子邮件吗?目前它提取收件箱中的所有电子邮件..在响应中,我看到一个名为“IsRead”的属性,该属性为空。应该在任何地方使用? – Lin

3

我终于搞定了!以下是您如何从Exchange 2010服务器检索未读电子邮件的方法:

$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. 

     } 

    } 

} 
1

这里是一个更好的解决方案。您不希望每次都发出GetItem请求来发送消息。这是昂贵且低效的,并且在包含数千封电子邮件的文件夹中获取电子邮件非常缓慢。另请注意,如果交换返回1封电子邮件与多封电子邮件,则某些对象会嵌入数组中,因此您的代码需要对其进行解释。如果可用,此代码段将带回多个电子邮件消息主体。

$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); 
} 
相关问题