2015-12-18 101 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中出現的最後一件事是在我的控制器中調用動作,然後在 –