【问题标题】:How to to print mail body and subject from unread answer?如何从未读答案打印邮件正文和主题?
【发布时间】:2016-02-15 05:15:19
【问题描述】:

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

  1. 我想一次阅读一封未读邮件,然后将其标记为已读
  2. 我需要主题发件人地址邮件正文

下面的代码显示了所有未读邮件的邮件 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);

收到邮件后如何标记为已读?

  stdClass Object
  (
  [ResponseMessages] => stdClass Object
   (
    [FindItemResponseMessage] => stdClass Object
    (
      [ResponseCode] => NoError
      [ResponseClass] => Success
      [RootFolder] => stdClass Object
         (
           [Items] => stdClass Object
             (
               [Message] => Array
                 (
                   [0] => stdClass Object
                     (
                       [ItemId] => stdClass Object
                         (
                           [Id] => AAMkADM1NjQ4ZjU0LWI3OWYtNGZiMC1iYTgzLTU4N2E1MGMwYWNkMQBGAAAAAADANtAZyWYTTKe/pt+BZ+SXBwD+fIgCJQITS5O3LAEwY6+oAAAANbjBAAB51OTN2pqDQbTnOkGjBC0FAAGN2YkTAAA=
                           [ChangeKey] => CQAAABYAAAD+fIgCJQITS5O3LAEwY6+oAAC4WS4O
                         )

                     )

                   [1] => stdClass Object
                     (
                       [ItemId] => stdClass Object
                         (
                           [Id] => AAMkADM1NjQ4ZjU0LWI3OWYtNGZiMC1iYTgzLTU4N2E1MGMwYWNkMQBGAAAAAADANtAZyWYTTKe/pt+BZ+SXBwD+fIgCJQITS5O3LAEwY6+oAAAANbjBAAB51OTN2pqDQbTnOkGjBC0FAAGN2YkSAAA=
                           [ChangeKey] => CQAAABYAAAD+fIgCJQITS5O3LAEwY6+oAAC4WS35
                         )
                     )
                 )
             )
           [IndexedPagingOffset] => 2
           [IncludesLastItemInRange] => 1
           [TotalItemsInView] => 2
         )
      )
   )
 )

【问题讨论】:

    标签: php email exchange-server exchangewebservices


    【解决方案1】:

    我看到您使用的是php-ewsjamesiarmes/php-ews 版本,所以我会尝试回答这个问题。我可能有点偏离,因为我不使用那个版本,并且会首先鼓励你升级到我维护和更新的 fork,因为它更容易使用,你会得到更多的支持,它是 PSR-2 和 4兼容并仍在维护。它被称为garethp/php-ews。我将首先给出我的答案,因为它简短易懂,然后转到您使用的代码库

    用 garethp/php-ews 解决

    基本上包含三个部分。获取、读取和标记为已读。第一种是只从服务器获取未读邮件,就是这样完成的

    require_once "vendor/autoload.php";
    
    use jamesiarmes\PEWS\API\Type;
    use jamesiarmes\PEWS\Mail\MailAPI;
    
    $api = MailAPI::withUsernameAndPassword('server', 'username', 'password');
    
    $unreadMail = $api->getUnreadMailItems();
    

    解决方案的第二部分是阅读项目。当您获取邮件项目的列表时,EWS 不会返回邮件项目的正文。它将正文视为第二类属性,因此您需要专门询问该邮件的信息以获取正文。因此,为了做到这一点,我们执行以下操作

    $item = $unreadMail[0];
    $item = $api->getItem($item->getItemId());
    
    $subject = $item->getSubject();
    $sender = $item->getSender()->getMailbox()->getEmailAddress();
    $body = (string) $item->getBody();
    

    最后一部分是到mark an item as read,就是这样完成的。

    $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());
    }
    

    用 jamesiarmes/php-ews 解决

    这分为三个步骤(见上文):获取、读取和标记为已读。显然,您知道如何获取。所以我们将直接跳到其他两个部分。

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

    没有实际测试它,这应该是你大致的做法。您可能必须玩弄它才能使其正常工作。你可以明白为什么我建议使用我的叉子。

    【讨论】:

    • 嘿 Gareth,我如何检查用户是否经过身份验证?你有任何示例代码吗? $api = MailAPI::withUsernameAndPassword('xx.xx.xx.xx', 'xxxxxx', 'xxxxx');
    • withUsernameAndPassword之后,你可以尝试一个非常简单的请求,比如getServerTimezones(),如果它没有被Authenticated,你会得到一个UnauthenicatedException
    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    相关资源
    最近更新 更多