Используйте REST API Outlook / Office365 для отправки почты с подключенного адреса электронной почты

Я пытаюсь отправить электронное письмо с помощью REST API Outlook / Office 365, и я пытаюсь отправить его как адрес, который у меня есть как «Подключенная учетная запись». Попытка отправить сообщение возвращает ошибку. Однако API позволит создать черновик с этим адресом.

Кроме того, я могу без проблем отправлять черновик, созданный API, а также создавать и отправлять сообщения с помощью этой учетной записи из веб-интерфейса.

Есть ли способ авторизовать API, чтобы иметь возможность отправлять сообщение в качестве адреса для подключенной учетной записи?


person Corey Larson    schedule 29.06.2016    source источник


Ответы (2)


Нет, сегодня API этого не поддерживает. Это связано с объемом разрешений, на которые вы соглашаетесь. «Разрешить этому приложению отправлять почту так же, как и вы» относится к отправке из вашей учетной записи, но не из другой учетной записи, даже если вам был предоставлен доступ.

person Jason Johnston    schedule 29.06.2016
comment
Это что-то в дорожной карте или вряд ли это будет поддерживаться? - person Corey Larson; 29.06.2016
comment
Это что-то обсуждается, но не однозначно. - person Jason Johnston; 29.06.2016
comment
Если вам нужна история, чтобы оправдать эту функцию, вот наш пример использования. Наше приложение отправляет электронные письма. Люди могут регистрироваться у нас, используя другую учетную запись, отличную от той, которую они собираются использовать для отправки электронных писем (например, зарегистрироваться с личной учетной записью, но хотят отправлять электронные письма из нашего приложения, используя свою корпоративную учетную запись). Это ограничивает нас, позволяя только тем, кто хочет отправлять сообщения с помощью Outlook / O365, зарегистрироваться с адресом, с которого они хотят отправлять. GMail действительно позволяет нам отправлять сообщения из подключенных учетных записей, если учетная запись, которую мы хотим отправить, настроена должным образом. Еще раз спасибо за ваше время! - person Corey Larson; 29.06.2016
comment
@JasonJohnston можете ли вы обновлять на основе API сегодня? Теперь есть разрешения для делегированной отправки почты от имени других. Однако мой код для этого всегда терпит неудачу с ошибкой 400 Bad Request. Тот же самый код работает, когда я отправляю его из своего почтового ящика. Кроме того, я могу отправлять электронную почту как этот пользователь из Outlook. В настоящее время я не могу найти образцы кода для отправки от имени других, поэтому не уверен, все ли это подключено или ?? - person Steve Peschka; 24.01.2017
comment
Да, области разрешений есть, и API должен их поддерживать. Я постараюсь сделать быстрый образец и обновить свой ответ. - person Jason Johnston; 25.01.2017
comment
Перечитывая вопрос OP, он спрашивает о подключенных учетных записях, которые не совпадают с делегатами. Подключенная учетная запись - это, например, если вы добавляете свою личную учетную запись GMail (она находится в настройках OWA). API не поддерживает подключенные учетные записи. Однако делегаты (где делегат находится в вашей организации Office 365) должны работать. - person Jason Johnston; 25.01.2017
comment
Просто хотел проследить: способ, которым я заставил это работать, заключается в том, что вы отправляете сообщение POST в /me/sendmail, но вы устанавливаете свойство From в сообщении для пользователя, который предоставил аутентифицированному пользователю права «Отправить как» или «Отправить от имени». - person Jason Johnston; 07.02.2017

Еще одна вещь, о которой вы можете подумать, - это использовать аутентификацию только для приложений. Вы можете настроить приложение Azure AD для проверки подлинности только для приложений. После этого все запросы будут выполняться от имени этого идентификатора приложения, и вы сможете делегировать этот идентификатор приложения для отправки электронной почты кому угодно от имени пользователя, которого вы хотите. Следующие шаги:

  • Создайте приложение Azure AD.
  • Настройте приложение Azure AD, чтобы разрешить использование токена только для приложений, следуя Создание приложений служб и демонов в Office 365. Вам также понадобится сертификат для запроса токена только для приложения.
  • Перейдите в свое приложение Azure AD-> Конфигурация, нажмите «Добавить приложение», чтобы добавить «Office 365 Exchange Online». В раскрывающемся списке «Разрешение приложения» выберите «Отправить электронную почту от имени любого пользователя». Это позволяет вашему приложению 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/[email protected]/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 = "[email protected]" } } }
        }
    };
    
    //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.
    }
    

Чтобы получить полное объяснение, обратитесь к моему блогу Отправка электронной почты от имени учетной записи службы с помощью Office Graph API

Надеюсь, это поможет, и дайте мне знать, если у вас возникнут вопросы.

person Verona Chen    schedule 01.07.2016