Outlook Mail Rest Api转发电子邮件请求返回状态400

时间:2016-10-01 11:59:11

标签: php json email outlook outlook-restapi

这是转发电子邮件的代码:

public static function sendForwardMessage($access_token, $user_email, $data, $message_id) {
    $getMessagesUrl = self::$outlookApiUrl . "/Me/messages/" . $message_id . "/forward";

    return self::makeApiCall($access_token, $user_email, "POST", $getMessagesUrl, $data);
}

这是CURL的代码:

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

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.");
    //echo "test";print_r($response);
    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    //echo "test".$httpCode;
    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);
    }
}

这是$ data值:

$arr= array(
    "Message" =>array(
   "Comment" => "Hi",      
  "ToRecipients"=>array(
    array(
        "EmailAddress"=>array(
            "Address"=>$forward_email,
          )
      )
    )
));

$data=json_encode($arr, true);

然后我调用sendForwardMessage函数:

$message = OutlookService::sendForwardMessage($_SESSION['access_token'], $_SESSION['user_email'], $data, $message_id);
print_r($message);

我查过了与此相关的其他帖子。点击here 它没有帮助。

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

1 个答案:

答案 0 :(得分:0)

很可能它是您阵列上的Message位。如果我没有弄错,那将序列化为:

{
  "Message": {
    "Comment": "Hi",
    "ToRecipients": [
      {
        "EmailAddress": {
          "Address": "foo@bar.com"
        }
      }
    ]
  }
}

根据API reference for Forward,它看起来应该更像:

{
  "Comment": "Hi",
  "ToRecipients": [
    {
      "EmailAddress": {
        "Address": "foo@bar.com"
      }
    }
  ]
}

请尝试使用此代码:

$arr= array(
  "Comment" => "Hi",      
  "ToRecipients"=>array(
    array(
      "EmailAddress"=>array(
        "Address"=>$forward_email,
      )
    )
  )
);