Outlook Rest Api发送邮件请求返回状态400

时间:2016-05-31 13:17:58

标签: php json email curl outlook-restapi

我尝试使用Outlook Rest Api和Curl从已签名的Outlook帐户发送电子邮件,然后我收到此错误

Request returned status 400

这是我发送邮件的代码

private static $outlookApiUrl = "https://outlook.office.com/api/v2.0";

  public static function sendMail ($access_token,$user_email,$subject,$Content,$email){

    $arr= array(
        "Message" =>array(
       'Subject' => $subject,
      "Body"=>array(
          "Content-Type"=>"HTML",
          "Content"=>$Content,
        ),
      "ToRecipients"=>array(
        array(
            "EmailAddress"=>array(
                "Address"=>$email,
              )
          ),
        ),
    ));

    $json=json_encode($arr, true);

     $getMessagesUrl = self::$outlookApiUrl."/me/sendmail";


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

 } 

这是CURL的代码

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",         
        "Authorization: Bearer ".$access_token, 
        "Accept: application/json",             
        "client-request-id: ".self::makeGuid(), 
        "return-client-request-id: true", 
        "X-AnchorMailbox: ".$user_email
        );

    $curl = curl_init($url);

    switch(strtoupper($method)) {
      case "POST":
      error_log("Doing POST");
      $headers[] = "Content-Type: application/json";
      curl_setopt($curl, CURLOPT_POST, true);
      curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
      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.");

    $curl_errno = curl_errno($curl);
    $curl_err = curl_error($curl);
    if ($curl_errno) {
       //PRINT ERROR
    }
    else {
      error_log("Response: ".$response);
      curl_close($curl);
      return json_decode($response, true);
    }
  }

然后我在主页上调用sendMail方法

  $send=OutlookService::sendMail($_SESSION["access_token"], $_SESSION["user_email"],"testing","<html><body>testing email.</body></html>","example@gmail.com");

    echo var_dump($send);

我可以知道我的代码有什么问题吗?为什么我会收到这个错误?

1 个答案:

答案 0 :(得分:1)

“Microsoft.OutlookServices.ItemBody”类型中不存在“Content-Type”属性,它应该是“ContentType”。有关详细信息,请参阅此文档: https://msdn.microsoft.com/office/office365/api/complex-types-for-mail-contacts-calendar#ItemBody

如果要使用REST API发送邮件消息,还需要在Azure AD中为O365 Exchange Online“以用户身份发送邮件”权限。您还可以参考以下文章了解更多详情: https://dev.outlook.com/restapi/tutorial/php