Php 如何从未读答案打印邮件正文和主题?

Php 如何从未读答案打印邮件正文和主题?,php,email,exchange-server,exchangewebservices,Php,Email,Exchange Server,Exchangewebservices,我只想获取收件箱中未读邮件的邮件主题和正文 我想一次读一封未读的邮件,然后将其标记为已读 我需要的主题,从地址和邮件正文 下面的代码显示了所有未读邮件的邮件ID。 require_once ('../mail3/php-ews-master/ExchangeWebServices.php'); require_once ('../mail3/php-ews-master/EWS_Exception.php'); require_once ('../mail3/php-ews-master/EWS

我只想获取收件箱中未读邮件的邮件主题和正文

  • 我想一次读一封未读的邮件,然后将其标记为已读
  • 我需要的主题,从地址和邮件正文
  • 下面的代码显示了所有未读邮件的邮件ID。

    require_once ('../mail3/php-ews-master/ExchangeWebServices.php');
    require_once ('../mail3/php-ews-master/EWS_Exception.php');
    require_once ('../mail3/php-ews-master/EWSType.php');
    require_once ('../mail3/php-ews-master/NTLMSoapClient.php');
    
    function __autoload($class_name)
    {
    // Start from the base path and determine the location from the class name,
    $base_path = '../mail3/php-ews-master';
    $include_file = $base_path . '/' . str_replace('_', '/', $class_name) . '.php';
    
    return (file_exists($include_file) ? require_once $include_file : false);
    }
    
    $ews = new ExchangeWebServices("servername", "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);
    

    我看到您正在使用
    php-ews
    jamesiarmes/php-ews
    版本,因此我将尝试回答这个问题。我可能有点不喜欢,因为我不使用那个版本,我会首先鼓励你升级到我维护和更新的fork,因为它更容易使用,你会得到更多的支持,它是PSR-2和4兼容的,并且仍然是维护的。它叫。我将首先给出我的答案,因为它简单明了,然后转到您使用的代码库

    使用garethp/php-ews进行求解 基本上有三个部分。获取、读取和标记为已读。第一种方法是只从服务器上获取未读的电子邮件,这样做也是如此

    $item = $unreadMail[0];
    $item = $api->getItem($item->getItemId());
    
    $subject = $item->getSubject();
    $sender = $item->getSender()->getMailbox()->getEmailAddress();
    $body = (string) $item->getBody();
    
    解决方案的第二部分是阅读该项。在获取邮件列表时,EWS不会返回邮件的正文。它将body视为第二类属性,因此您需要专门请求一个邮件项目的信息来获取body。因此,为了做到这一点,我们做了以下几点

    $api->markMailAsRead($item->getItemId());
    
    最后一部分是对,这是这样做的

    require_once "vendor/autoload.php";
    
    use jamesiarmes\PEWS\API\Type;
    use jamesiarmes\PEWS\Mail\MailAPI;
    
    $api = MailAPI::withUsernameAndPassword('server', 'username', 'password');
    
    $unreadMail = $api->getUnreadMailItems();
    
    foreach ($unreadMail as $item) {
        $item = $api->getItem($item->getItemId());
    
        $subject = $item->getSubject();
        $sender = $item->getSender()->getMailbox()->getEmailAddress();
        $body = (string) $item->getBody();
    
        $api->markMailAsRead($item->getItemId());
    }
    
    邮件项目现在应显示为已读。所以,如果我们把它们放在一起,结果应该是这样的

    $result = $ews->FindItem($request);
    
    foreach ($result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message as $item) {
        $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 = $item->ItemId->Id; 
    
        $response = $ews->GetItem($request);
    
        //You may have to do a var_dump on the $response here. I'm only guessing that this is how you locate the message item, since I don't use this code base any more.
        $item = $response->ResponseMessages->GetItemResponseMessage->Items->Message;
    
        //You should do a var_dump on the $item to see how to get the body, subject and sender here. I'm not 100% sure how to do it on this one.
    
        //Mark the item as read (hopefully)
        $request = new EWSType_UpdateItemType();
        $request->MessageDisposition = 'SaveOnly';
        $request->ConflictResolution = 'AlwaysOverwrite';
        $request->ItemChanges = [];
    
        $change = new EWSType_ItemChangeType();
    
        $change = new EWSType_ItemChangeType();
        $change->ItemId = new EWSType_ItemIdType();
        $change->ItemId->Id = $item->ItemId->Id;
        $change->ItemId->ChangeKey = $item->ItemId->ChangeKey;
        $change->Updates = new EWSType_NonEmptyArrayOfItemChangeDescriptionsType();
        $change->Updates->SetItemField = array(); // Array of fields to be update
    
        // Update Firstname (simple property)
        $field = new EWSType_SetItemFieldType();
        $field->FieldURI->FieldURI = 'message:IsRead';
        $field->Message = new EWSType_MessageItemType();
        $field->Message->IsRead = true;
    
        $change->Updates->SetItemField[] = $field;
    
        // Set all changes
        $request->ItemChanges[] = $change;
    
        // Send request
        $response = $ews->UpdateItem($request);
        echo '<pre>'.print_r($response, true).'</pre>';
    }
    
    使用jamesiarmes/php-ews进行求解 这分为三个步骤(见上文):获取、读取和标记为读取。很明显,你知道怎么取。因此,我们将跳到其中的其他两部分

    $result=$ews->FindItem($request);
    foreach($result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Messageas$item){
    $request=new-EWSType_GetItemType();
    $request->ItemShape=new-EWSType\u itemsresponseshapetype();
    $request->ItemShape->BaseShape=EWSType\u DefaultShapeNamesType::ALL\u属性;
    $request->ItemIds=new-EWSType_NonEmptyArrayOfBaseItemIdsType();
    $request->ItemIds->ItemId=new-EWSType_ItemIdType();
    $request->ItemIds->ItemId->Id=$item->ItemId->Id;
    $response=$ews->GetItem($request);
    //您可能必须在这里对$response执行var_转储。我只是猜测这就是您定位消息项的方式,因为我不再使用此代码库。
    $item=$response->ResponseMessages->GetItemResponseMessage->Items->Message;
    //你应该在$item上做一个var_转储,看看如何在这里获取主体、主题和发送者。我不是100%确定如何在这个上面做。
    //将项目标记为已读(希望如此)
    $request=newewstype\u UpdateItemType();
    $request->MessageDisposition='SaveOnly';
    $request->ConflictResolution='AlwaysOverwrite';
    $request->ItemChanges=[];
    $change=新的EWSType_ItemChangeType();
    $change=新的EWSType_ItemChangeType();
    $change->ItemId=new-EWSType\u ItemIdType();
    $change->ItemId->Id=$item->ItemId->Id;
    $change->ItemId->ChangeKey=$item->ItemId->ChangeKey;
    $change->Updates=new-EWSType_nonemptyarayofItemChangeDescriptionsType();
    $change->Updates->SetItemField=array();//要更新的字段数组
    //更新名字(简单属性)
    $field=new-EWSType_SetItemFieldType();
    $field->FieldURI->FieldURI='message:IsRead';
    $field->Message=new-EWSType_-MessageItemType();
    $field->Message->IsRead=true;
    $change->Updates->SetItemField[]=$field;
    //设置所有更改
    $request->ItemChanges[]=$change;
    //发送请求
    $response=$ews->UpdateItem($request);
    回显“”。打印($response,true)。“”;
    }
    

    在没有实际测试的情况下,这应该是大致的操作方法。你可能需要玩弄它才能让它发挥作用。你可以看到为什么我建议在这个问题上使用我的fork。

    嘿,Gareth,我如何检查用户是否经过身份验证?你有没有关于它的示例代码<代码>$api=MailAPI::with用户名和密码('xx.xx.xx.xx','xxxxxx','xxxxx')在使用username和password执行
    之后,您可以尝试一个非常简单的请求,如,如果它没有经过身份验证,您将得到一个unauthenticatedexception
    
    require_once "vendor/autoload.php";
    
    use jamesiarmes\PEWS\API\Type;
    use jamesiarmes\PEWS\Mail\MailAPI;
    
    $api = MailAPI::withUsernameAndPassword('server', 'username', 'password');
    
    $unreadMail = $api->getUnreadMailItems();
    
    foreach ($unreadMail as $item) {
        $item = $api->getItem($item->getItemId());
    
        $subject = $item->getSubject();
        $sender = $item->getSender()->getMailbox()->getEmailAddress();
        $body = (string) $item->getBody();
    
        $api->markMailAsRead($item->getItemId());
    }
    
    $result = $ews->FindItem($request);
    
    foreach ($result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->Message as $item) {
        $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 = $item->ItemId->Id; 
    
        $response = $ews->GetItem($request);
    
        //You may have to do a var_dump on the $response here. I'm only guessing that this is how you locate the message item, since I don't use this code base any more.
        $item = $response->ResponseMessages->GetItemResponseMessage->Items->Message;
    
        //You should do a var_dump on the $item to see how to get the body, subject and sender here. I'm not 100% sure how to do it on this one.
    
        //Mark the item as read (hopefully)
        $request = new EWSType_UpdateItemType();
        $request->MessageDisposition = 'SaveOnly';
        $request->ConflictResolution = 'AlwaysOverwrite';
        $request->ItemChanges = [];
    
        $change = new EWSType_ItemChangeType();
    
        $change = new EWSType_ItemChangeType();
        $change->ItemId = new EWSType_ItemIdType();
        $change->ItemId->Id = $item->ItemId->Id;
        $change->ItemId->ChangeKey = $item->ItemId->ChangeKey;
        $change->Updates = new EWSType_NonEmptyArrayOfItemChangeDescriptionsType();
        $change->Updates->SetItemField = array(); // Array of fields to be update
    
        // Update Firstname (simple property)
        $field = new EWSType_SetItemFieldType();
        $field->FieldURI->FieldURI = 'message:IsRead';
        $field->Message = new EWSType_MessageItemType();
        $field->Message->IsRead = true;
    
        $change->Updates->SetItemField[] = $field;
    
        // Set all changes
        $request->ItemChanges[] = $change;
    
        // Send request
        $response = $ews->UpdateItem($request);
        echo '<pre>'.print_r($response, true).'</pre>';
    }