Retrofit 2 send mail via MS graph api returns 参数'Message'的值为空

Retrofit 2 send mail via MS graph api returns The value of the parameter 'Message' is empty

我有一个 Java Spring 项目,它使用 Retrofit 2 对来自 Microsoft 的 Graph API 进行 API 调用。我能够验证身份、阅读邮箱和 retrieve/read 电子邮件。但是我正在努力发送邮件。

我有以下发送电子邮件的代码:

权限:包含Mail.send

    private String[] scopes = [
            "openid",
            "email",
            "profile",
            "User.Read",
            "Mail.Read",
            "Mail.Send",
            "Mail.ReadWrite",
            "Calendars.Read",
            "Calendars.ReadWrite",
            "Contacts.Read",
            "Contacts.ReadWrite",
            "offline_access"
    ];

改造调用:

    @Headers("Content-Type: application/json")
    @POST("/v1.0/me/sendMail")
    Call<Message> sendMessage(
            @Body String messageObject
    );

发送的字符串是JSONString:

"{\"Message\":{\"toRecipients\":[{\"address\":\"test@test.be\",\"name\":\"test@test.be\"}],\"Body\":{\"ContentType\":\"text/html\",\"Content\":\"value(Email_body)=%3Cp%3Etesttext%3C%2Fp%3E\"},\"Subject\":\"testsubject\"},\"SaveToSentItems\":\"true\"}"

HTTP 响应:

 <-- 400 Bad Request https://graph.microsoft.com/v1.0/me/sendMail (101ms)
 Cache-Control: private
 Transfer-Encoding: chunked
 Content-Type: application/json
 request-id: 94d19c39-4b84-4ee9-98d2-d42d36886e40
 client-request-id: 0c9d2c63-28bf-49c4-9ad6-08d81c6fd4b0
 x-ms-ags-diagnostic: {"ServerInfo":{"DataCenter":"West Europe","Slice":"SliceC","Ring":"5","ScaleUnit":"003","RoleInstance":"AGSFE_IN_27"}}
 Strict-Transport-Security: max-age=31536000
 Date: Wed, 09 Oct 2019 07:41:54 GMT

 {
  "error": {
    "code": "ErrorInvalidParameter",
    "message": "The value of the parameter 'Message' is empty.",
    "innerError": {
      "request-id": "94d19c39-4b84-4ee9-98d2-d42d36886e40",
      "date": "2019-10-09T07:41:54"
    }
  }
}
<-- END HTTP (253-byte body)

知道导致错误的原因吗?

我认为当 json 数据 实际上 被发送时,您不应该使用 escaping 字符作为双引号。

因此发出的字符串应该是未转义的,看起来像这样。

{"Message":{"toRecipients":[{"address":"test@test.be","name":"test@test.be"}],"Body":{"ContentType":"text/html","Content":"value(Email_body)=%3Cp%3Etesttext%3C%2Fp%3E"},"Subject":"testsubject"},"SaveToSentItems":"true"}

此外,你会发现

  • address 不是 toRecipients 的有效 属性,您应该在 emailAddress 属性
  • name 属性 无效,应删除。
  • ContentType 值可以是 texthtml

因此,发送出去的json应该是这样的。

{
  "Message": {
    "toRecipients": [
      {
        "emailAddress": {
            address:"test@test.be"
        }
      }
    ],
    "Body": {
      "ContentType": "html",
      "Content": "value(Email_body)=%3Cp%3Etesttext%3C%2Fp%3E"
    },
    "Subject": "testsubject"
  },
  "SaveToSentItems": "true"
}

您还可以在以下 link

阅读更多关于 sendMail api 的信息

https://docs.microsoft.com/en-us/graph/api/user-sendmail?view=graph-rest-1.0&tabs=http

所以我想通了,post raw json with retrofit 2 的正确方法是:

    @Headers("Content-Type: application/json")
    @POST("/v1.0/me/sendMail")
    Call<Message> sendMessage(
            @Body HashMap<String, Object> messageObject
    );