【发布时间】:2016-09-04 20:02:44
【问题描述】:
我正在尝试使用 Office 365 API 发送电子邮件,我无法使用 Microsoft.Office365 包进行发送,因为它们目前不支持我们的身份验证,但我确实有一个有效的令牌来访问 API ,获取请求工作正常,但是当我尝试发布到“https://outlook.office.com/api/v2.0/me/sendmail”时,我收到了上述错误。虽然我不能使用 Microsoft.Office365 中提供的发送功能,但我正在使用消息对象来创建我的电子邮件,然后进行序列化和发布。
public void SendMail(string Subject, string Body) {
HttpClient client = new HttpClient();
string accessToken = userCache.UserAccessToken;
Uri uri = new Uri("https://outlook.office.com/api/v2.0/me/sendmail");
client.DefaultRequestHeaders.Add("User-Agent", agent);
client.DefaultRequestHeaders.Add("client-request-id", requestGuid);
client.DefaultRequestHeaders.Add("return-client-request-id", "true");
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
List<string> recipients = new List<string>();
recipients.Add(userCache.Email);
#region Create Email Message
Message email = new Message();
email.Body = new ItemBody();
email.Body.Content = Body;
email.Body.ContentType = 0;//0=text, 1=html
email.From = new Recipient();
email.From.EmailAddress = new EmailAddress();
email.From.EmailAddress.Address = userCache.Email;//set from email to email of current logged in user
email.Importance = Importance.Normal;
email.Sender = email.From;
email.Subject = Subject;
email.ToRecipients = recipients;
#endregion
try {
dynamic mailObject = new ExpandoObject();
mailObject.Message = email;
mailObject.SaveToSentItems = "true";
HttpResponseMessage hrm = client.PostAsJsonAsync<Object>(uri, mailObject as ExpandoObject).Result;
} catch (Exception e) { }
}
这会将下面的 json 提交给 API:
{
"Message": {
"Subject": "Products",
"Body": {
"ContentType": 0,
"Content": "Products"
},
"BodyPreview": null,
"Importance": 0,
"HasAttachments": null,
"ParentFolderId": null,
"From": {
"EmailAddress": {
"Name": null,
"Address":"andrew.branoff@paretobiz.com"
}
},
"Sender": {
"EmailAddress": {
"Name": null,
"Address": "andrew.branoff@paretobiz.com"
}
},
"ToRecipients": [
{
"EmailAddress": {
"Name": null,
"Address": "andrew.branoff@paretobiz.com"
}
}
],
"CcRecipients": [],
"BccRecipients": [],
"ReplyTo": [],
"ConversationId": null,
"UniqueBody": null,
"DateTimeReceived": null,
"DateTimeSent": null,
"IsDeliveryReceiptRequested": null,
"IsReadReceiptRequested": null,
"IsDraft": null,
"IsRead": null,
"WebLink": null,
"Attachments": [],
"ChangeKey": null,
"Categories": [],
"DateTimeCreated": null,
"DateTimeLastModified": null,
"Id": null
},
"SaveToSentItems": "true"
}
据我所知,这是 API 正在寻找的,因为我使用他们自己的对象来构建它,但无论我做什么,它似乎都会拒绝我发送的内容。我尝试过先使用序列化
JsonConvert.SerializeObject(mailObject, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
不发送空值,认为它可能不接受值,即使是空值,对于它计算的东西,如正文预览,但没有变化。
【问题讨论】:
-
该错误表明当 API 需要一个字符串值时,您正在发送一个整数值
0。事实上,here 文档表明Message.Body.ContentType应该是一个字符串:"ContentType": "Text"。 -
你是绝对正确的@dbc 我只是觉得奇怪的是他们的 API 期望的东西与要发送到 API 的对象所包含的不同。
标签: c# json post office365api