【问题标题】:Outlook rest api V2.0Outlook REST API V2.0
【发布时间】:2018-10-04 09:54:33
【问题描述】:

我创建了一个使用 Outlook Rest api V2.0 的 Web 应用程序。 我可以验证用户并获取邮件消息和日历项目。问题是当我想发送邮件时,我收到 http 错误 400。

我的outlook.php文件

<?php



 class OutlookService 
 {
    private static $outlookApiUrl = "https://outlook.office.com/api/v2.0";
    		
	public static function stuurEmail($access_token, $user_email, $data) 
			{
			
			
			$getMessagesUrl = self::$outlookApiUrl."/Me/sendmail?".http_build_query($data);

			return self::makeApiCall($access_token, $user_email, "POST", $getMessagesUrl);
			
			}	
	 
	 
	 
	 
	 public static function sendMail ($access_token,$user_email)
			{
				$sentMessagesParameters = '{"Message":{"Subject":"Meet for lunch?","Body":{"ContentType":"Text","Content":"The new cafeteria is open."},"ToRecipients":[{"EmailAddress":{"Address":"danny.herremans@rkg.vlaanderen"}}]},"SaveToSentItems":"true"}';
			
			
			

			$json=json_encode($sentMessagesParameters, true);

			 $getMessagesUrl = self::$outlookApiUrl."/me/sendmail?".http_build_query($sentMessagesParameters);


			return self::makeApiCall($access_token, $user_email, "POST",$getMessageUrl,$json);

			} 
	 
	 
	 public static function getPhoto($access_token) 
			{
			  $getUserParameters = array (
				// Only return the user's display name and email address
				"\$select" => "Photo"
			  );

			  $getUserUrl = self::$outlookApiUrl."/Me?".http_build_query($getUserParameters);

			  return self::makeApiCall($access_token, "", "GET", $getUserUrl);
		 
		 
		 
			}
	 
	 public static function getUser($access_token) 
			{
			  $getUserParameters = array 
				(
				// Only return the user's display name and email address
				"\$select" => "DisplayName,EmailAddress,Alias"
			  );

			  $getUserUrl = self::$outlookApiUrl."/Me?".http_build_query($getUserParameters);

			  return self::makeApiCall($access_token, "", "GET", $getUserUrl);
			}

    public static function getMessages($access_token, $user_email) 
			{
			  $getMessagesParameters = array (
				// Only return Subject, ReceivedDateTime, and From fields
				"\$select" => "Subject,ReceivedDateTime,From",
				// Sort by ReceivedDateTime, newest first
				"\$orderby" => "ReceivedDateTime DESC",
				// Return at most 10 results
				"\$top" => "10"
			  );

			  $getMessagesUrl = self::$outlookApiUrl."/Me/MailFolders/Inbox/Messages?".http_build_query($getMessagesParameters);

			  return self::makeApiCall($access_token, $user_email, "GET", $getMessagesUrl);
			}
    
    public static function getEvents($access_token, $user_email) 
			{
			  $getEventsParameters = array (
				// Only return Subject, Start, and End fields
				"\$select" => "Subject,Start,End",
				// Sort by Start, oldest first
				"\$orderby" => "Start/DateTime",
				// Return at most 10 results
				"\$top" => "10"
			  );

			  $getEventsUrl = self::$outlookApiUrl."/Me/Events?".http_build_query($getEventsParameters);

			  return self::makeApiCall($access_token, $user_email, "GET", $getEventsUrl);
			}
    
    public static function getContacts($access_token, $user_email) 
			{
			  $getContactsParameters = array (
				// Only return GivenName, Surname, and EmailAddresses fields
				"\$select" => "GivenName,Surname,EmailAddresses",
				// Sort by GivenName, A-Z
				"\$orderby" => "GivenName",
				// Return at most 10 results
				"\$top" => "10"
			  );

			  $getContactsUrl = self::$outlookApiUrl."/Me/Contacts?".http_build_query($getContactsParameters);

			  return self::makeApiCall($access_token, $user_email, "GET", $getContactsUrl);
			}
    
    public static function makeApiCall($access_token, $user_email, $method, $url, $payload = NULL) 
			{
			  // Generate the list of headers to always send.
			  $headers = array(
				"User-Agent: php-tutorial/1.0",         // Sending a User-Agent header is a best practice.
				"Authorization: Bearer ".$access_token, // Always need our auth token!
				"Accept: application/json",             // Always accept JSON response.
				"client-request-id: ".self::makeGuid(), // Stamp each new request with a new GUID.
				"return-client-request-id: true",       // Tell the server to include our request-id GUID in the response.
				"X-AnchorMailbox: ".$user_email         // Provider user's email to optimize routing of API call
			  );

			  $curl = curl_init($url);

			  switch(strtoupper($method)) {
				case "GET":
				  // Nothing to do, GET is the default and needs no
				  // extra headers.
				  error_log("Doing GET");
				  break;
				case "POST":
				  error_log("Doing POST");
				  // Add a Content-Type header (IMPORTANT!)
				  $headers[] = "Content-Type: application/json";
				  curl_setopt($curl, CURLOPT_POST, true);
				  curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
				  break;
				case "PATCH":
				  error_log("Doing PATCH");
				  // Add a Content-Type header (IMPORTANT!)
				  $headers[] = "Content-Type: application/json";
				  curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PATCH");
				  curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
				  break;
				case "DELETE":
				  error_log("Doing DELETE");
				  curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
				  break;
				default:
				  error_log("INVALID METHOD: ".$method);
				  exit;
			  }

			  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
			  curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
			  $response = curl_exec($curl);
			  error_log("curl_exec done.");

			  $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
			  error_log("Request returned status ".$httpCode);

			  if ($httpCode >= 400) {
				return array('errorNumber' => $httpCode,
							 'error' => 'Request returned HTTP error '.$httpCode);
			  }

			  $curl_errno = curl_errno($curl);
			  $curl_err = curl_error($curl);

			  if ($curl_errno) {
				$msg = $curl_errno.": ".$curl_err;
				error_log("CURL returned an error: ".$msg);
				curl_close($curl);
				return array('errorNumber' => $curl_errno,
							 'error' => $msg);
			  }
			  else {
				error_log("Response: ".$response);
				curl_close($curl);
				return json_decode($response, true);
			  }
			}
    
    // This function generates a random GUID.
    public static function makeGuid()
			{
				if (function_exists('com_create_guid')) {
				  error_log("Using 'com_create_guid'.");
				  return strtolower(trim(com_create_guid(), '{}'));
				}
				else {
				  error_log("Using custom GUID code.");
				  $charid = strtolower(md5(uniqid(rand(), true)));
				  $hyphen = chr(45);
				  $uuid = substr($charid, 0, 8).$hyphen
						 .substr($charid, 8, 4).$hyphen
						 .substr($charid, 12, 4).$hyphen
						 .substr($charid, 16, 4).$hyphen
						 .substr($charid, 20, 12);

				  return $uuid;
				}
			}
  }
?>

所以在我的 home.php 文件中,我有以下用于发送邮件的代码

if(isset($_POST['mailing']))
{				
    @extract($_POST);

      $arr = '{
      "Message": {
      "Subject": "Meet for lunch?",
      "Body": {
        "ContentType": "Text",
        "Content": "The new cafeteria is open."
      },
      "ToRecipients": [
        {
        "EmailAddress": {
          "Address": "xxxxxxxxx@xxxx.xxx"
        }
        }
      ]
      },
      "SaveToSentItems": "true"
    }';
    $data=json_encode($arr, true);

    $message = OutlookService::stuurEmail(oAuthService::getAccessToken($redirectUri), $_SESSION['user_email'], $data);

    print_r($message);



    echo"
      <div class='alert alert-success'>
      <a href='#' title='Sluit deze melding'
      class='close' data-dismiss='alert' aria-label='close'>&times;
      </a>

      <br>".$_SESSION['access_token']."<br>".$_SESSION['user_email']."<br>$data<br>


      </div>

      ";

}

当我不发送邮件时,我收到以下错误:

警告:http_build_query():参数 1 应为数组或对象。 /var/www/vhosts/rkgvlaande05001/test/outlook.php 第 14 行数组中给出的值不正确([errorNumber] => 400 [error] => 请求返回 HTTP 错误 400)

知道代码中有什么不正确的地方,或者有人有 Outlook Rest api V2.0 的工作示例吗?

谢谢

【问题讨论】:

    标签: office365api outlook-restapi


    【解决方案1】:

    我检查了你的代码,sendMessagesParameters 内容是正确的。但是,我发现这篇文章提到,“如果你想使用 REST API 发送邮件消息,你需要在 Azure AD 中为 O365 Exchange Online '以用户身份发送邮件'权限”。请看以下链接:

    Outlook Rest Api sending Mail Request returned status 400

    【讨论】:

    • 嗨,西蒙,谢谢您的回复。我发现了 https 400 错误。 http_build_query($data) 有问题。它没有传递 JSON 字符串。
    • 太棒了。也许您可以将您的回复标记为答案并关闭帖子。
    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多