Office 365客户端API SendMailAsync返回Unauthorized

时间:2015-12-18 15:33:26

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

我正在尝试使用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:Unauthorized

我已经添加了读/写和发送电子邮件的权限,因此当我登录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时,错误发生在最后一行。我不确定还有什么可以尝试,但无法找到导致此问题的任何信息。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

我也一直在尝试使用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方法被破坏了。首先将新消息保存为草稿,我们可以解决它。

答案 1 :(得分:1)

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