Ms office 使用统一API使用Office 365发送电子邮件

Ms office 使用统一API使用Office 365发送电子邮件,ms-office,office365,office365api,Ms Office,Office365,Office365api,我们正在尝试使用O365统一API从我们的业务线应用程序发送电子邮件。我使用以下代码发送电子邮件。这会引发DataServiceQueryException异常“Unauthorized” public async Task SendEmailAsUserAsync(EmailMessage message) { try { var graphClient = await _authenticationHelper.GetGraphClientAsync();

我们正在尝试使用O365统一API从我们的业务线应用程序发送电子邮件。我使用以下代码发送电子邮件。这会引发DataServiceQueryException异常“Unauthorized”

public async Task SendEmailAsUserAsync(EmailMessage message)
{
    try
    {
        var graphClient = await _authenticationHelper.GetGraphClientAsync();
        Message m = InitializeMessage(message);
        await graphClient.Me.SendMailAsync(m, true);
    }
    catch (DataServiceQueryException dsqe)
    {
        _logger.Error("Could not get files: " + dsqe.InnerException.Message, dsqe);
        throw;
    }
}

private static Message InitializeMessage(EmailMessage message)
{
    ItemBody body = new ItemBody {Content = message.Body, ContentType = BodyType.HTML};
    Message m = new Message
    {
        Body = body,
        Subject = message.Subject,
        Importance = Importance.Normal,
    };
    //Add all the to email ids
    if (message.ToRecipients != null)
        foreach (Models.Messaging.EmailAddress emailAddress in message.ToRecipients)
        {
            m.ToRecipients.Add(new Recipient { EmailAddress = new Microsoft.Graph.EmailAddress { Address = emailAddress.Address, Name = emailAddress.Name } });
        }
    return m;
}
_authenticationHelper.GetGraphClientAsync()的代码为


任何人都可以指出这里是否有错误。

检查下面的示例项目,这有一个工作示例(在您在app.config中填写ClientID等之后)

对于发送电子邮件,它使用下面的功能,如果设置正确,该功能可以正常工作。它还具有许多用于使用身份验证的功能


实际上,graph API没有程序集包装器

已弃用板条箱

因此,你应该:

  • 处理其余请求:请参见此处:
  • 使用Microsoft.Vipr项目生成包装:请参见此处:

  • 对于身份验证,ADAL工作正常:)

    我目前已经通过使用常规O365 API和使用证书的AppOnly权限解决了我的迫切需要。如果有人能帮助解决这个问题,尽管您的示例使用的是outlookclient,而不是graphservice的统一api,但非常相似,我们将不胜感激。
    public async Task<GraphService> GetGraphClientAsync()
    {
        Uri serviceRoot = new Uri(appConfig.GraphResourceUriBeta + appConfig.Tenant);
        _graphClient = new GraphService(serviceRoot,
            async () => await AcquireTokenAsyncForUser(appConfig.GraphResourceUri, appConfig.Tenant));
        return _graphClient;
    }
    
    private async Task<string> AcquireTokenAsyncForUser(string resource, string tenantId)
    {
        AuthenticationResult authenticationResult = await GetAccessToken(resource, tenantId);
        _accessCode = authenticationResult.AccessToken;
        return _accessCode;
    }
    
    private async Task<AuthenticationResult> GetAccessToken(string resource, string tenantId)
    {
        string authority = appConfig.Authority;
        AuthenticationContext authenticationContext = new AuthenticationContext(authority);
        ClientCredential credential = new ClientCredential(appConfig.ClientId, appConfig.ClientSecret);
        string authHeader = HttpContext.Current.Request.Headers["Authorization"];
        string userAccessToken = authHeader.Substring(authHeader.LastIndexOf(' ')).Trim();
        UserAssertion userAssertion = new UserAssertion(userAccessToken);
        var authenticationResult = await authenticationContext.AcquireTokenAsync(resource, credential, userAssertion);
        return authenticationResult;
    }
    
    public async Task SendEmailAsUserAsync(EmailMessage message)
    {
        try
        {
            var graphClient = await _authenticationHelper.GetGraphClientAsync();
            Message m = InitializeMessage(message);
            //await graphClient.Me.SendMailAsync(m, true); //This did not work
            var user = await graphClient.Me.ExecuteAsync();
            await user.SendMailAsync(m, true);
        }
        catch (DataServiceQueryException dsqe)
        {
            _logger.Error("Could not get files: " + dsqe.InnerException.Message, dsqe);
            throw;
        }  
    }
    
        public async Task SendMail(string to, string subject, string body)
        {
            var client = await this.AuthenticationHelper
                .EnsureOutlookServicesClientCreatedAsync(
                Office365Capabilities.Mail.ToString());
    
            Message mail = new Message();
            mail.ToRecipients.Add(new Recipient() 
            {
                EmailAddress = new EmailAddress
                {
                    Address = to,
                }
            });
            mail.Subject = subject;
            mail.Body = new ItemBody() { Content = body, ContentType = BodyType.HTML };
    
            await client.Me.SendMailAsync(mail, true);
        }