MailKit と ASP.NET Core Web API を使用した Outlook の単純な認証の問題の修正

OAuth2

ASP.NET Core と MailKit での Outlook 認証の問題について

Outlook の電子メール機能を MailKit を使用すると、開発者は認証の問題に遭遇することがよくあります。よくある問題の 1 つは、「535: 5.7.139 認証に失敗しました」というエラー メッセージです。これは通常、Outlook サーバーで基本認証方法が無効になっている場合に発生し、接続の試行が失敗します。

基本認証はかつて広く使用されていましたが、セキュリティを強化するために Microsoft などのサービス プロバイダーによって無効化されることが増えています。代わりに、OAuth2 などの最新の認証方法が推奨されます。この変更は、特にユーザー名とパスワードを直接使用することに慣れている開発者にとって混乱を引き起こす可能性があります。

このシナリオでは、正しい Outlook SMTP サーバー設定とアプリ固有のパスワードを使用していても、認証エラーが発生した可能性があります。これらの問題を効率的に解決するには、基本認証が失敗する理由を理解することが重要です。このエラーは、コード自体の問題ではなく、セキュリティ ポリシーの適用を示しています。

この記事では、このエラーが発生する理由、根本的な原因、問題を解決するために実行できる手順について説明します。また、Outlook サーバーとの安全で正常な通信を確保するための OAuth2 などの代替認証方法についても説明します。

指示 使用例
ConfidentialClientApplicationBuilder.Create() このコマンドは、OAuth2 認証用の機密クライアント アプリケーションを構築するために使用されます。これは Microsoft Identity Client (MSAL) ライブラリの一部であり、クライアント ID を使用してアプリを初期化し、安全な通信のためのトークンを取得できるようにします。
SaslMechanismOAuth2() このコマンドは MailKit に固有であり、電子メールの送信時に OAuth2 トークンで認証するために使用されます。 OAuth2 プロトコルを介したより安全な方法を使用することで、基本認証をバイパスします。
AcquireTokenForClient(scopes).ExecuteAsync() このメソッドは、クライアント アプリケーションの OAuth2 トークンを取得します。これは MSAL ライブラリの一部であり、Microsoft Graph や SMTP サーバーなどの API のアクセス トークンを生成するために不可欠です。
GraphServiceClient このオブジェクトは、Microsoft Graph API で Microsoft サービスと対話するために使用されます。これにより、開発者は OAuth2 トークンを使用して、電子メールの送信、ユーザーの管理、または Microsoft 365 内の他のリソースとの対話を行うことができます。
DelegateAuthenticationProvider() このコマンドは、Microsoft Graph API 要求の認証プロセスをセットアップするために使用されます。各 API リクエストに OAuth2 トークンを動的に割り当て、安全な通信を確保します。
SendMail(message, false).Request().PostAsync() このコマンドは、構築された電子メール メッセージを非同期的に送信する Graph API の一部です。 Microsoft Graph の安全な電子メール送信機能を使用して、メッセージをユーザーのメールボックスに投稿します。
SmtpClient.AuthenticateAsync() MailKit では、このコマンドにより、クライアントは OAuth2 トークンなどの資格情報を使用して電子メール サーバーで認証できるようになります。これは、従来のユーザー名とパスワードの認証方法に代わるものです。
SecureSocketOptions.StartTls このコマンドは、SMTP サーバーに接続するときに使用され、STARTTLS プロトコル経由で安全な暗号化された接続を強制し、ネットワーク上でデータが安全に転送されるようにします。
MimeMessage このクラスは、MailKit ライブラリ内の電子メール メッセージを表します。これには、電子メールの送信者、受信者、件名、本文などの詳細が含まれます。これは、送信前に電子メールのコンテンツを作成およびフォーマットするために不可欠です。

安全な電子メール送信のための OAuth2 統合の検討

上記で提供されているスクリプトは、次のような問題に対処するように設計されています。 ASP.NET Core Web API の MailKit を使用して Outlook の SMTP サーバー経由で電子メールを送信するときに発生します。このエラーは、Microsoft がセキュリティを強化するために基本認証を無効にし、開発者がより安全な認証方法である OAuth2 の採用を強制しているために発生します。最初のソリューションでは、OAuth2 トークンを持つ MailKit を使用して認証し、電子メールを送信しました。 OAuth2 では、ユーザー名とパスワードに依存する代わりに、Microsoft Identity Client (MSAL) によって生成され、要求を安全に認証するために使用されるトークンが必要です。

まず、ソリューションは MSAL ライブラリの一部である `ConfidentialClientApplicationBuilder.Create()` メソッドを使用してクライアント アプリケーションを作成します。この手順では、OAuth2 トークンの生成に必要なクライアント ID、テナント ID、クライアント シークレットなどの重要な資格情報を使用してアプリケーションを初期化します。アプリケーションが構築されると、`AcquireTokenForClient()` メソッドは Outlook の SMTP サーバーでの認証に必要なトークンを取得します。 「SaslMechanismOAuth2()」メカニズムを使用することにより、MailKit はこのトークンを使用して電子メール送信プロセスを認証し、基本認証を完全にバイパスできます。この方法により、アプリケーションが最新のセキュリティ プロトコルに準拠し、非推奨のメソッドを回避できるようになります。

2 番目のソリューションでは、Microsoft Graph API を使用して、SMTP サーバーと直接対話せずに電子メールを送信します。 Microsoft Graph は、Outlook 電子メールなどの Microsoft サービスを管理するためのオールインワン ソリューションを提供します。 Graph API は、「DelegateAuthenticationProvider()」を通じて OAuth2 認証を利用し、各リクエストに OAuth2 トークンを割り当てます。このトークンは、MSAL を使用して同様に生成されます。 `GraphServiceClient` オブジェクトは Microsoft サーバーとの安全な通信を容易にし、API が電子メールをシームレスに送信できるようにします。この方法は、SMTP などの個々のサービスへの直接接続を減らして、幅広い Microsoft サービスを処理したい場合に特に便利です。

最後に、3 番目のソリューションでは、組み込みの .NETの名前空間。この方法では認証に依然として OAuth2 が使用されますが、電子メールの送信には MailKit が System.Net.Mail の SMTP クライアントに置き換えられます。 OAuth2 トークンは、通常のユーザー名とパスワードの組み合わせではなく、資格情報として渡されます。電子メールは、一般的な `MailMessage` および `SmtpClient` オブジェクトを使用して作成および送信されます。このアプローチは、ネイティブ .NET ライブラリを使用したいが、電子メールの送信には安全な OAuth2 認証が必要な開発者にとって役立ちます。

これらの方法はすべて、基本認証が無効になる問題を解決するだけでなく、ASP.NET Core Web API の電子メール送信機能を将来も保証します。各ソリューションは、時代遅れで安全性の低い認証方法を置き換える OAuth2 によるセキュリティの重要性を強調しています。 MSAL や Microsoft Graph などの最新の認証ライブラリを活用することで、開発者は信頼性の高い電子メール送信機能を提供しながら、アプリケーションが最新のセキュリティ標準に準拠していることを確認できます。

解決策 1: Outlook 認証を OAuth2 に切り替える

このアプローチでは、ASP.NET Core と MailKit を使用し、基本認証を OAuth2 に置き換えます。OAuth2 は、Outlook での安全な電子メール送信に推奨される方法です。

// Step 1: Install required NuGet packages
// MailKit, MimeKit, and Microsoft.Identity.Client for OAuth2

using MailKit.Net.Smtp;
using MimeKit;
using Microsoft.Identity.Client;

// Step 2: Configure OAuth2 authentication
var clientId = "your-client-id";
var tenantId = "your-tenant-id";
var clientSecret = "your-client-secret";

var cca = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithClientSecret(clientSecret)
    .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
    .Build();

var scopes = new[] { "https://outlook.office365.com/.default" };
var result = await cca.AcquireTokenForClient(scopes).ExecuteAsync();

// Step 3: Send email using OAuth2 token
var emailMessage = new MimeMessage();
emailMessage.From.Add(new MailboxAddress("Your Name", "your-email@outlook.com"));
emailMessage.To.Add(new MailboxAddress("Recipient", "recipient@example.com"));
emailMessage.Subject = "Subject";
emailMessage.Body = new TextPart("plain") { Text = "Hello, this is a test email." };

using (var smtpClient = new SmtpClient())
{
    await smtpClient.ConnectAsync("smtp.office365.com", 587, SecureSocketOptions.StartTls);
    await smtpClient.AuthenticateAsync(new SaslMechanismOAuth2("your-email@outlook.com", result.AccessToken));
    await smtpClient.SendAsync(emailMessage);
    await smtpClient.DisconnectAsync(true);
}

解決策 2: Microsoft Graph API を使用して電子メールを送信する

この方法では、Microsoft Graph API を使用して ASP.NET Core バックエンドから電子メールを送信し、SMTP 構成を完全にバイパスします。

// Step 1: Add Microsoft.Graph NuGet package
using Microsoft.Graph;
using Microsoft.Identity.Client;

// Step 2: Configure Graph API and authentication
var confidentialClient = ConfidentialClientApplicationBuilder.Create(clientId)
    .WithTenantId(tenantId)
    .WithClientSecret(clientSecret)
    .Build();

var graphClient = new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) =>
{
    var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync();
    requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
}));

// Step 3: Prepare and send email via Graph API
var message = new Message
{
    Subject = "Test Email",
    Body = new ItemBody
    {
        ContentType = BodyType.Text,
        Content = "Hello, this is a test email sent via Microsoft Graph API."
    },
    ToRecipients = new List<Recipient>()
    {
        new Recipient { EmailAddress = new EmailAddress { Address = "recipient@example.com" } }
    }
};

await graphClient.Users["your-email@outlook.com"].SendMail(message, false).Request().PostAsync();

解決策 3: SMTP で OAuth2 を使用する (異なるライブラリ)

このアプローチでは、同じ OAuth 認証方法を使用して、MailKit ではなく OAuth2 で電子メールを送信するために System.Net.Mail を使用します。

// Step 1: Configure OAuth2 with System.Net.Mail
var smtpClient = new SmtpClient("smtp.office365.com")
{
    Port = 587,
    EnableSsl = true,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential("your-email@outlook.com", accessToken)
};

// Step 2: Construct the email message
var mailMessage = new MailMessage
{
    From = new MailAddress("your-email@outlook.com"),
    Subject = "Test Email",
    Body = "This is a test email sent using System.Net.Mail with OAuth2.",
    IsBodyHtml = true
};

mailMessage.To.Add("recipient@example.com");

// Step 3: Send the email
await smtpClient.SendMailAsync(mailMessage);

電子メール送信のための最新のセキュリティ標準の実装

最新の電子メール システムのコンテキストでは、基本認証は時代遅れで安全ではないという認識がますます高まっています。これは、OAuth2 などのより安全なメカニズムを適用するために基本認証を無効にしている Outlook などの主要なサービス プロバイダーに特に当てはまります。ユーザー名とパスワードのみに依存する基本認証はブルート フォース攻撃に対して脆弱であり、資格情報が盗まれた場合に侵害される可能性があります。したがって、Microsoft が推奨しているように OAuth2 に移行すると、ユーザーの資格情報を公開することなくトークンが安全に交換されるようになります。

OAuth2 の実装における重要な側面の 1 つは、アクセス トークンの概念です。 SMTP サーバーを介した直接認証に依存する代わりに、OAuth2 は電子メール サービスなどのリソースへの安全なアクセスを可能にする期限付きトークンを発行します。これらのトークンは承認サーバーによって付与され、開発者は Microsoft Identity Client (MSAL) などのライブラリを使用して取得できます。これらのトークンを使用すると、アプリケーションはユーザーのアカウントへの限定的なアクセスを取得し、長期にわたる静的な資格情報に関連するリスクを軽減します。

さらに、OAuth2 を採用すると、アプリケーションが最新のセキュリティ慣行に適合するだけでなく、将来の開発に備えることもできます。クラウドベースのサービスを含む多くの API は、現在、安全な通信のために OAuth2 に大きく依存しています。これにより、サービスが進化しても電子メール送信機能が引き続き機能し、安全性が確保されます。統合する開発者向け と OAuth2 を利用すると、トークンベースの認証から STARTTLS などのプロトコルを介した暗号化された送信に至るまで、さまざまなセキュリティが強化されます。

  1. Outlook で 535: 5.7.139 エラーが発生する原因は何ですか?
  2. このエラーは、Outlook の SMTP サーバーの基本認証が無効になっているために発生します。 Microsoft では現在、安全な認証のために OAuth2 を要求しています。
  3. MailKit で OAuth2 を有効にするにはどうすればよいですか?
  4. 次を使用して OAuth2 を実装できます。 アプリケーションを設定し、 トークンを使用して電子メール送信を認証します。
  5. Outlook で電子メールを送信するための基本認証に代わるものは何ですか?
  6. OAuth2 が推奨される代替手段です。ユーザー名とパスワードの代わりにトークンを使用して、安全で時間制限のある認証を実現します。
  7. Microsoft Graph API は電子メールの送信に SMTP を使用するよりも優れていますか?
  8. Microsoft Graph API は、電子メールの送信以外にも処理できる広範なサービスです。より汎用性が高く、さまざまな Microsoft 365 リソースにアクセスする必要がある場合にお勧めします。
  9. OAuth2 がアプリケーションで正しく動作しているかどうかをテストするにはどうすればよいですか?
  10. 単体テストを実装して、OAuth2 トークンが生成され、電子メール送信サービスに正しく渡されていることを確認できます。

Outlook の基本認証エラーを解決するには、OAuth2 などの最新のセキュリティ標準を採用する必要があります。このアプローチにより、基本認証の脆弱性が排除され、Outlook の SMTP サーバー経由でメッセージを送信するためのより安全な方法が提供されます。

OAuth2 を ASP.NET Core および MailKit と統合することで、開発者はアプリケーションの将来性を保証し、安全な通信と更新されたサービス プロバイダーの要件への準拠を確保できます。これにより、認証の問題が解決されるだけでなく、全体的なセキュリティと機能も強化されます。

  1. Microsoft による基本認証と OAuth2 実装の廃止に関する詳細なドキュメント: Microsoft Exchange Online の基本認証の廃止
  2. .NET での電子メール機能用の MailKit および MimeKit の使用に関する包括的なガイド: MailKit ドキュメント
  3. OAuth2 認証に関する MSAL (Microsoft Identity Client) ライブラリのドキュメント: Microsoft ID プラットフォーム (MSAL) の概要