首页 > 解决方案 > Microsoft graph 电子邮件附件状态码 405。方法不允许

问题描述

我收到状态代码 405,发送带有附件的电子邮件时出现方法不允许错误。我正在使用 HttpClient 将我的请求发布到 API 而不是 Microsoft Graph 客户端。不想依赖 Microsoft Graph 库。我发送不带附件的电子邮件工作正常,但不带附件。

        try
        {
            const string url = "https://graph.microsoft.com/v1.0/users/myemail@outlook.com/sendMail";

            var path = "C:\\Attachments\\image1.jpg";

            using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri(url);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);

                byte[] bytes = File.ReadAllBytes(path);
                string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);

                var email = new Email
                {
                    Message = new Message
                    {
                        Subject = "Test subject",
                        Body = new Body
                        {
                            ContentType = "Text",
                            Content = "message"
                        },
                        ToRecipients = new List<Recipients>
                        {
                            new Recipients
                            {
                                EmailAddress = new EmailAddress
                                {
                                    Address = "testemail@outlook.com"
                                }
                            }
                        },
                        Attachments = new List<Attachment>
                        {
                            new Attachment
                            {
                                Name = "image1.jpg",
                                ContentBytes = base64String,
                                ContentType = "image/jpeg"
                            }
                        }
                    }
                };

                var jsonMessage = JsonConvert.SerializeObject(email);
                var content = new StringContent(jsonMessage, Encoding.UTF8, "application/json");

                HttpResponseMessage response = client.PostAsync(url, content).Result;
                response.EnsureSuccessStatusCode();
            }
        }
        catch (HttpRequestException e)
        {
            Console.WriteLine(e.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

标签: c#microsoft-graph-apidotnet-httpclientmicrosoft-graph-mail

解决方案


如果其他人遇到同样的问题,以下是答案

对于“附件”对象,Microsoft Graph 需要'@odata.type'属性值为'#microsoft.graph.fileAttachment'

Attachments = new List<Attachment>
{
    new Attachment
    {
        //GraphDataType property name will be changed to @odata.type
        GraphDataType = "#microsoft.graph.fileAttachment",
        Name = "image1.jpg",
        ContentBytes = base64String,
        ContentType = "image/jpeg"
    }
}

用“ @odata.type”替换序列化对象中的“GraphDataType”

var jsonMessage = JsonConvert.SerializeObject(email);
jsonMessage = jsonMessage.Replace("GraphDataType", "@odata.type");

推荐阅读