2015-12-18 103 views
1

我想在C#中使用Outlook Mail REST API(客户端版本)在C#中为其设置Office 365集成。我一直在这里使用API​​参考:https://msdn.microsoft.com/office/office365/APi/mail-rest-operationsOffice 365客户端API SendMailAsync返回未授权

我可以登录到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 = "[email protected]" } }); 

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

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

就当我打电话SendMailAsync最后一行发生的错误。我真的不知道还有什么可以尝试,并且找不到有关会导致这种情况的任何信息。

任何帮助,非常感谢!

回答

2

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

+0

非常好,谢谢 - 它正在使用草稿方法。据我记得365 API是在预览,所以希望它是一些将尽快纠正。 –

+0

不错的救了我+1 – EasyE

1

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

+0

嗨贾森,感谢您的链接 - 我测试了它,它看起来对我来说确实,这是scp部分:scp:“Mail.ReadWrite Mail.Send”, –

+0

你能得到一个请求的提琴手踪迹,并看到通过电话发送了什么?确保授权标头中正在发送正确的令牌值。 –

+0

嗨贾森,我刚刚尝试过提琴手,但它似乎并没有显示我尝试连接到Office 365的部分(除非我需要配置它,所以它会显示?)。因此,当我在我的asp mvc应用程序中,在电子邮件表单中,我单击指向控制器操作的“发送电子邮件”按钮,此操作将生成消息详细信息,然后调用SendMailAsync函数。在Fiddler中出现的最后一件事是在我的控制器中调用动作,然后在 –