【问题标题】:Office 365 client API SendMailAsync returns UnauthorizedOffice 365 客户端 API SendMailAsync 返回未经授权
【发布时间】:2015-12-18 15:33:25
【问题描述】:

我正在尝试从我的 C# ASP MVC Web 应用程序设置 Office 365 集成,为此我使用 Outlook Mail REST API(客户端版本)。我一直在这里使用 API 参考:https://msdn.microsoft.com/office/office365/APi/mail-rest-operations

我可以正常登录 Office 365,获取令牌,然后阅读邮件文件夹(即已发送邮件/收件箱),但是当我尝试发送电子邮件时,我收到以下错误:


未经授权

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:Microsoft.OData.Client.DataServiceClientException:未经授权


我已经添加了读/写和发送电子邮件的权限,所以当我登录 Office 365 时会显示:

Office Integration Test App needs permission to:

Access your data anytime
Sign in as you
Send mail as you
Read and write access to your mail 

所以我认为“以您的身份发送邮件”是我需要的。但是我仍然收到 Unathorized 错误消息。

这是我正在运行以发送电子邮件的代码:

    string AccessToken = (string)Session["Office365Token"];

    OutlookServicesClient client = new OutlookServicesClient(new Uri("https://outlook.office.com/api/v2.0"),
        async () =>
        {
            return AccessToken;
        });

    ItemBody EmailBody = new ItemBody
    {
        Content = "Test email from the project",
        ContentType = BodyType.HTML
    };

    List<Recipient> toRecipients = new List<Recipient>();

    toRecipients.Add(new Recipient() { EmailAddress = new EmailAddress() { Address = "testemail@test.com" } });

    Message newMessage = new Message
    {
        Subject = "Test Subject For Email",
        Body = EmailBody,
        ToRecipients = toRecipients
    };

    await client.Me.SendMailAsync(newMessage, true);

当我调用 SendMailAsync 时,错误发生在最后一行。我不确定还有什么可以尝试的,也找不到任何关于什么会导致这种情况的信息。

非常感谢任何帮助!

【问题讨论】:

    标签: c# asp.net-mvc api email office365


    【解决方案1】:

    我也一直在尝试使用OutlookServicesClient 的 SendMailAsync 方法并收到未经授权的响应。

    Fiddler 透露,SendMailAsync 创建的请求中不包含令牌,但是当OutlookServicesClient 生成读取消息的 Get 请求时,我可以看到包含令牌。 this GitHub issue 向我证实了这一点,它还表示它曾经在库的 1.0.22 版本中工作,但从 1.0.34 版本开始就没有了。

    再环顾四周后,我发现其他人尝试了alternative approach to sending mail,首先创建草稿,然后发送。这是它的样子:

    OutlookServicesClient outlookClient = new OutlookServicesClient(new Uri("https://outlook.office.com/api/v2.0"),
        async () =>
        {
            // already retrieved my AccessToken using AuthenticationContext
            return AccessToken;
        });
    
    // Save to Drafts folder
    await outlookClient.Me.Messages.AddMessageAsync(newMessage);
    
    // Now send
    await newMessage.SendAsync();
    

    我的结论是 SendMailAsync 方法被破坏了。通过首先将新消息保存为草稿,我们可以解决它。

    【讨论】:

    • 太好了,谢谢 - 它正在使用草稿方法工作。据我所知,365 API 处于预览阶段,所以希望他们很快会更正这一点。
    【解决方案2】:

    检查您的代币价值。如果您复制字符串并转到http://jwt.calebb.net/,您可以将其粘贴并解析出来。检查scp 声明并确保Mail.Send 存在。

    【讨论】:

    • 嗨,Jason,感谢您提供的链接 - 我对其进行了测试,对我来说它看起来不错,这是 scp 部分:scp: "Mail.ReadWrite Mail.Send",
    • 你能得到请求的 Fiddler 跟踪并查看通过网络发送的内容吗?确保在 Authorize 标头中发送正确的令牌值。
    • 嗨,Jason,我刚刚尝试了 Fiddler,但它似乎没有显示我尝试连接到 Office 365 的部分(除非我需要在其上配置某些内容才能显示? )。因此,当我在我的 asp mvc 应用程序中时,在电子邮件表单中单击指向控制器操作的“发送电子邮件”按钮,此操作会建立消息详细信息,然后调用 SendMailAsync 函数。 Fiddler 中出现的最后一件事是调用我的控制器中的操作,然后就没有其他任何东西了
    • @MattF,确保您已将 Fiddler 配置为解密 https 流量。在 Fiddler 中,转到工具 -> Fiddler 选项 -> HTTPS 并勾选相应的框。您可能需要重新启动才能生效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2016-10-13
    相关资源
    最近更新 更多