使用 Outlook/Office365 REST API 从连接的电子邮件地址发送邮件
Use the Outlook/Office365 REST API to send mail from connected email address
我正在尝试使用 Outlook/Office 365 REST API 发送电子邮件,并且我正在尝试将其作为我的 "Connected Account" 地址发送。正在尝试发送消息 returns `` 错误。但是,API 将 让我用这个地址创建草稿。
此外,我可以很好地发送 API 创建的草稿,我还可以从 Web 界面使用此帐户创建和发送消息。
有没有办法授权 API 能够将消息作为连接帐户的地址发送?
不,API 今天不支持此功能。它与您同意的权限范围有关。 "Allow this app to send mail as you" 包括从您的帐户发送,但不包括从其他帐户发送,即使您已被授予访问权限。
您可以考虑的另一件事是利用仅限应用程序的身份验证。可以将 Azure AD 应用配置为具有仅限应用的身份验证。之后,所有请求都将代表该应用程序 ID,您应该能够委托该应用程序 ID 代表您想要的用户向任何人发送电子邮件。
以下是步骤:
- 创建 Azure AD 应用程序。
- 将您的 Azure AD 应用程序配置为允许 App-only 令牌
正在关注 Build service and daemon apps in Office 365。你也是
需要一个证书用于仅应用程序令牌请求。
- 转到您的 Azure AD 应用程序->配置,单击“添加
申请”添加"Office 365 Exchange Online"。Select“发送邮件
作为任何用户”在 "Application permission" 下拉框下。它允许
您的 Azure AD 应用程序有权代表发送电子邮件
某人。
配置 Azure AD 应用程序后,您可以参考
以下代码代表特定用户发送电子邮件。
string tenantId = "yourtenant.onmicrosoft.com";
string clientId = "your client id";
string resourceId = "https://outlook.office.com/";
string resourceUrl = "https://outlook.office.com/api/v2.0/users/service@contoso.com/sendmail"; //this is your on behalf user's UPN
string authority = String.Format("https://login.windows.net/{1}", AUTHORITYURL, tenantId);
string certificatPath = @"c:\test.pfx"; //this is your certficate location.
string certificatePassword = "xxxx"; // this is your certificate password
var itemPayload = new
{
Message = new
{
Subject = "Test email",
Body = new { ContentType = "Text", Content = "this is test email." },
ToRecipients = new[] { new { EmailAddress = new { Address = "test@cotoso.com" } } }
}
};
//if you need to load from certficate store, use different constructors.
X509Certificate2 certificate = new X509Certificate2(certficatePath, certificatePassword, X509KeyStorageFlags.MachineKeySet);
AuthenticationContext authenticationContext = new AuthenticationContext(authority, false);
ClientAssertionCertificate cac = new ClientAssertionCertificate(clientId, certificate);
//get the access token to Outlook using the ClientAssertionCertificate
var authenticationResult = await authenticationContext.AcquireTokenAsync(resourceId, cac);
string token = authenticationResult.AccessToken;
//initialize HttpClient for REST call
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
client.DefaultRequestHeaders.Add("Accept", "application/json");
//setup the client post
HttpContent content = new StringContent(JsonConvert.SerializeObject(itemPayload));
//Specify the content type.
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json;odata=verbose");
HttpResponseMessage result = await client.PostAsync(url, content);
if(result.IsSuccessStatusCode)
{
//email send successfully.
}else
{
//email send failed. check the result for detail information from REST api.
}
完整的解释请参考我的博客Send email on behalf of a service account using Office Graph API
希望对您有所帮助,如果您有任何疑问,请告诉我。
我正在尝试使用 Outlook/Office 365 REST API 发送电子邮件,并且我正在尝试将其作为我的 "Connected Account" 地址发送。正在尝试发送消息 returns `` 错误。但是,API 将 让我用这个地址创建草稿。
此外,我可以很好地发送 API 创建的草稿,我还可以从 Web 界面使用此帐户创建和发送消息。
有没有办法授权 API 能够将消息作为连接帐户的地址发送?
不,API 今天不支持此功能。它与您同意的权限范围有关。 "Allow this app to send mail as you" 包括从您的帐户发送,但不包括从其他帐户发送,即使您已被授予访问权限。
您可以考虑的另一件事是利用仅限应用程序的身份验证。可以将 Azure AD 应用配置为具有仅限应用的身份验证。之后,所有请求都将代表该应用程序 ID,您应该能够委托该应用程序 ID 代表您想要的用户向任何人发送电子邮件。 以下是步骤:
- 创建 Azure AD 应用程序。
- 将您的 Azure AD 应用程序配置为允许 App-only 令牌 正在关注 Build service and daemon apps in Office 365。你也是 需要一个证书用于仅应用程序令牌请求。
- 转到您的 Azure AD 应用程序->配置,单击“添加 申请”添加"Office 365 Exchange Online"。Select“发送邮件 作为任何用户”在 "Application permission" 下拉框下。它允许 您的 Azure AD 应用程序有权代表发送电子邮件 某人。
配置 Azure AD 应用程序后,您可以参考 以下代码代表特定用户发送电子邮件。
string tenantId = "yourtenant.onmicrosoft.com"; string clientId = "your client id"; string resourceId = "https://outlook.office.com/"; string resourceUrl = "https://outlook.office.com/api/v2.0/users/service@contoso.com/sendmail"; //this is your on behalf user's UPN string authority = String.Format("https://login.windows.net/{1}", AUTHORITYURL, tenantId); string certificatPath = @"c:\test.pfx"; //this is your certficate location. string certificatePassword = "xxxx"; // this is your certificate password var itemPayload = new { Message = new { Subject = "Test email", Body = new { ContentType = "Text", Content = "this is test email." }, ToRecipients = new[] { new { EmailAddress = new { Address = "test@cotoso.com" } } } } }; //if you need to load from certficate store, use different constructors. X509Certificate2 certificate = new X509Certificate2(certficatePath, certificatePassword, X509KeyStorageFlags.MachineKeySet); AuthenticationContext authenticationContext = new AuthenticationContext(authority, false); ClientAssertionCertificate cac = new ClientAssertionCertificate(clientId, certificate); //get the access token to Outlook using the ClientAssertionCertificate var authenticationResult = await authenticationContext.AcquireTokenAsync(resourceId, cac); string token = authenticationResult.AccessToken; //initialize HttpClient for REST call HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); client.DefaultRequestHeaders.Add("Accept", "application/json"); //setup the client post HttpContent content = new StringContent(JsonConvert.SerializeObject(itemPayload)); //Specify the content type. content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json;odata=verbose"); HttpResponseMessage result = await client.PostAsync(url, content); if(result.IsSuccessStatusCode) { //email send successfully. }else { //email send failed. check the result for detail information from REST api. }
完整的解释请参考我的博客Send email on behalf of a service account using Office Graph API
希望对您有所帮助,如果您有任何疑问,请告诉我。