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

2023-12-10

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

  1. 我想一次阅读一封未读邮件并将其标记为read然后。
  2. 我需要subject, 发件人地址 and 邮件正文.

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

我看到你正在使用jamesiarmes/php-ews的版本php-ews,所以我会尝试回答这个问题。我可能有点偏离,因为我不使用该版本,并且首先鼓励您升级到我维护和更新的分叉,因为它更容易使用,您会获得更多支持,它是 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();

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

$item = $unreadMail[0];
$item = $api->getItem($item->getItemId());

$subject = $item->getSubject();
$sender = $item->getSender()->getMailbox()->getEmailAddress();
$body = (string) $item->getBody();

最后一部分是将项目标记为已读,就是这样完成的。

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

在没有实际测试的情况下,这应该是大致的做法。您可能需要尝试一下才能使其发挥作用。你可以明白为什么我建议使用我的叉子了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何打印未读答案中的邮件正文和主题? 的相关文章

  • 如何从 Laravel 中的表中选择所有列名称?

    我试图从表中获取所有列名Teller 功能 public function getTableColumns tables return DB select DB raw SELECT COLUMN NAME DATA TYPE COLUMN
  • Zend Framework 生成唯一的字符串

    我想生成一个唯一的 4 6 个字符长的字母数字字符串 以便与每个记录 用户 一起保存在数据库中 db 字段具有唯一索引 因此尝试保存预先存在的字符串会生成错误 现在我正在生成一个随机字符串并使用 try catch 因此在添加新记录时如果抛
  • openssl_pkey_get_details($res) 不返回公共指数

    我在用着这个例子 https stackoverflow com a 12575951 2016196使用 php 生成的密钥进行 javascript 加密openssl图书馆 但是 details openssl pkey get de
  • 简单的 PHP 条件帮助: if($Var1 = in list($List) and $Cond2) - 这可能吗?

    这是一个可能的功能吗 我需要检查一个变量是否存在于我需要检查的变量列表中 并且 cond2 是否为 true 例如 if row name 1 2 3 Cond2 doThis 它对我不起作用 我在复制粘贴中更改的只是我的列表和变量名称 i
  • 通过 Ajax 加载内容时,WORDPRESS 音频播放器未加载,MediaElement.js 未应用

    我正在创建一个 WordPress 主题 当我使用 ajax 加载内容时 它不会将 MediaElements js 应用于我的音频播放器 因此不会显示音频 我认为这是因为 MediaElement js 加载了 wp footer 并且此
  • 重定向而不改变url

    我总是不喜欢 htaccess 我正在尝试建立一个所有请求都通过index php 的网站 但我希望URL 类似于www sample com home 该网址实际上会加载 www sample com index php page hom
  • 优雅地处理没有数据的 amcharts

    我想知道我的 dataProvider 是否为空 amCharts绘制时默认为null 我怎样才能动态地处理它 var chart AmCharts makeChart chartdiv theme none type serial dat
  • FPDI/FPDF:水印和打印多页

    我修改了这个堆栈问题 当用户尝试下载文件时在 pdf 文件上应用水印 https stackoverflow com questions 3983432 applying watermarks on pdf files when users
  • 如何从父类函数访问子类中定义的常量?

    我从 php net 看到这个例子 但 c MY CONST 仅在 5 3
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • 扩展蓝图类?

    我想覆盖timestamps 函数中发现Blueprint班级 我怎样才能做到这一点 e g public function up Schema create users function Blueprint table table gt
  • 使用 luasocket smtp 和 ssl 发送电子邮件

    我一直在尝试使用帖子中描述的代码发送电子邮件 lua使用gmail账户发送邮件 https stackoverflow com questions 11070623 lua send mail with gmail account 代码由米
  • 如何使用 Exchange Web 服务 CalendarView 进行分页

    如果我这样做 calendar CalendarFolder Folder Bind service WellKnownFolderName Calendar var findResults calendar FindAppointment
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • CURL 中的 data-urlencode 是什么意思?

    我搜索了很多个小时试图弄清楚 php curl 中的 data urlencode 是什么 我尝试过这个 但我认为这是不对的 xmlpost object1 file https www lob com goblue pdf 在文档中是 d
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • Magento - 自定义支付模块

    这是一个非常普遍的问题 但这里是 我正在尝试在 Magento 中创建一个自定义支付模块 我创建了一个 常规 模块 可以连接到 Magento 事件 观察者模型 但是我如何告诉 Magento 将模块视为支付模块 以便它显示在管理后端和结账
  • 如何使用 PHPExcel 库从 Excel 获取日期

    我正在尝试使用 PHPExcel 从 Excel 获取日期 但我没有得到日期 我得到的字符串值不是 1970 以来的秒数 我尝试过的代码是 InvDate trim excel gt getActiveSheet gt getCell B

随机推荐

  • np.将 ND 张量/数组与一维数组连接起来

    我有两个数组a和b a shape 5 4 3 array 0 0 0 0 0 0 0 0 0 0 10772717 0 604584 0 41664413 0 0 0 0 0 0 0 10772717 0 604584
  • Maven 3 和时间戳

    我有关于 Maven 3 和 Nexus 存储库的各种问题 在我们的 Nexus 存储库中 我只想解决时间戳依赖性 也就是说 我想阻止将带时间戳的依赖项下载到我的本地存储库 而且在我的 Nexus 配置中 只有最新的快照 jar 版本是完全
  • 如何禁用 UITextField 键盘而不隐藏它?

    我有一个动画 在此期间我想禁用键盘但不隐藏它 我什至尝试过self view userInteractionEnabled NO 但这隐藏了键盘 我想它必须调用resignFirstResponder 要禁用所有功能 您可以使用 UIApp
  • Rails:获取http响应值

    在rails中 我向api发布了帖子并得到了响应 但我不知道如何获取信息并找到 code 变量的值 response
  • 从 xml 加载 richtextbox 内容

    我有一个 RichTextBox 用户可以在其中格式化文本并另存为 xml 文档 我将 RichtextBox Rtf 内容保存在 xml 文档中 当我尝试从 xml 加载保存的数据时 RichTextBox 不会根据 XML 中的 Rtf
  • 单元测试中的 Gradle java.util.logging.Logger 输出

    抱歉 这可能是一个非常简单的问题 我在用gradle对于我的开发环境 效果很好 我编写了一个简单的单元测试 使用HtmlUnit和我自己的包裹 对于我自己的包 我使用java util Logger HtmlUnit seems使用公共日志
  • opencv 在 GUI 中创建一个输入文本框并读取它

    只是想知道 OpenCV 中是否有任何命令可以为 C 中的 GUI 创建输入 文本框 或 编辑文本框 类似姓名框 输入姓名 PS 我使用的是Linux Ubuntu 正如 Miki 所说 OpenCV 本身没有这样的设施 但没有什么可以阻止
  • 对于 Internet Explorer,“控制台”是未定义的错误

    我正在使用 Firebug 并有一些类似的声明 console log 在我的页面中 在 IE8 可能也是早期版本 中 我收到脚本错误 提示 控制台 未定义 我尝试将其放在页面顶部 我仍然收到错误 有什么办法可以消除错误吗 Try if w
  • 如何使用多个可选参数来类型重载函数?

    我有一个带有多个默认值的 kwargs 的函数 其中之一 在中间的某个地方 是控制返回类型的布尔切换 我想为此方法创建两个重载Literal True False 但保留默认值 我的想法如下 from typing import overl
  • 使用 CSS 更改特定单词的格式

    文本可以来自不同的来源 获取文本后 它将显示在站点上 从本文中 我需要使用 CSS 更改特定单词的格式 在下面的例子中database这个词必须改变 通过 JavaScript 可以轻松完成JSFiddle但我需要通过CSS而不是JavaS
  • 防止项目在其他(父/子)元素中“可放置”

    我使用 Knockout sortable js 让用户拖放项目以赋予它们不同的顺序 但是当我的页面上有多个 放置区域 时 我遇到了问题 我有嵌套集 所有这些都可以排序 但是not可互换 My code div class sortable
  • BundleTable.Bundles.GetBundleFor() 返回但不返回内部的项目

    Briefly 包含以下项目的捆绑包VirtualPath 由自定义 VirtualPathProvider 提供服务 不起作用 哈希值不是在v 并解决它们表明 Items财产为空 详细的 假设我们有一个捆绑注册 bundles Clear
  • ExtJS 4 - 网格 - 禁用特定列的行选择

    我用 extjs 4 创建了一个网格 Selection CheckboxModel 已实现 这意味着无论您在何处单击特定行 都会选择 取消选择该行 现在我想在最后一列上禁用此选择 因为它包含自定义按钮 如果单击按钮 我不想选择该行 有什么
  • Swift 4 中的 JSON 解析具有复杂和嵌套的数据

    我目前正在尝试使用 JSON 制作一个天气应用程序https openweathermap org但我在处理 JSON 文件中的天气部分时遇到了问题 我不确定如何访问对象内的 id 值 base stations clouds all 36
  • Openlayers 中的 KML 图层无法在本地主机上运行

    我在 OpenLayers 中渲染 KML 文件时遇到奇怪的问题 这似乎很容易 但事实并非如此 我从这里开始一个例子OpenLayer 示例 我想添加我自己的 KML 它不起作用 我使用绝对 URL 创建了该示例的本地副本 如下所示
  • 使用自定义小部件 kivy

    我正在尝试使用一些自定义小部件构建一个 kivy 应用程序 然而 每当我尝试使用它们时 它们都不会与我的布局配合使用 使用普通按钮 import kivy kivy require 1 8 0 from kivy app import Ap
  • python特定频率去除(陷波滤波器)?

    complie by python3 only test py import pyaudio import numpy as np import wave import time import math from pydub import
  • 如何从 PHP 中的 URL 字符串中提取查询参数?

    用户可以在我的网站上使用 HTML 表单输入 URL 因此他们可能会输入如下内容 它可以是任何东西 我需要提取某个查询参数的值 在本例中为 test 值 123 有没有办法做到这一点 您可以使用parse url and parse str
  • 检测客户端是平板电脑还是手机的最佳方法是什么?

    我目前正在开发一个客户端应用程序 该应用程序将为智能手机和平板电脑设计 因此它将得到两种不同的布局模式 虽然用户可以在两种模式之间切换 但我必须在第一次使用该应用程序时预先设置模式 因此 我正在寻找一种可靠的方法来自动检测用户是否带有平板电
  • 如何打印未读答案中的邮件正文和主题?

    我想获取收件箱中未读邮件的邮件主题和正文 我想一次阅读一封未读邮件并将其标记为read然后 我需要subject 发件人地址 and 邮件正文 下面的代码显示了所有未读邮件的邮件 ID require once mail3 php ews