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