Microsoftは、SMTPやPOP3,IMAPの基本認証プロトコルでのアクセス許可を9月30日よりサイト毎に順次停止していく予定だ。
これにより、基本認証を使用してPOP3やIMAPなどでメールを受信するプログラムが動作しなくなる可能性が高くなる。
これは私も承知していて、MailKitのSaslMechanismOAuth2クラスを使用してOAuth2対応にするよう修正していたのだが、その際に使用したMicrosoft.Identity.ClientMicrosoft.Graph.Authライブラリが以前書いたように、非推奨となってしまったので、Azure.Identityに変更してみた。
基本はMicrosoft Graphを使う場合と同じなのだが、注意点として、ユーザーやグループを捜査するMS GraphではスコープのPrefixが必要では無かったのだが、POP3やIMAP,SMTP等では、”https://outlook.office365.com/”のPrefix(ネームスペースなのかな?)が必要となる事。
POP3の場合は以下のようなコードとなる。
・・・
using MimeKit;
using MailKit;
using MailKit.Net.Pop3;
using MailKit.Security;
using MimeKit.Text;
using Azure.Core;
using Azure.Identity;
・・・
// この例では、Resource Owner Password Credentialsフローを使用
// スコープ
string[] scopes = new string[] { "https://outlook.office365.com/POP.AccessAsUser.All" };
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
// ユーザー名,パスワード,テナントID,アプリケーションID(Client ID)から資格情報を得る
var cred = new UsernamePasswordCredential(PopUser,PopPass,Authority,AppID,options);
// スコープを指定してAccess Tokenの取得
var req = new TokenRequestContext(scopes);
var token = await cred.GetTokenAsync(req);
// ユーザー名とAccess Tokenを使用してOAuth2用の認証機構を作成
var oauth2 = new SaslMechanismOAuth2(PopUser, token.Token);
using (Pop3Client cli = new Pop3Client())
{
await cli.ConnectAsync("outlook.office365.com", 995, SecureSocketOptions.SslOnConnect);
// OAuth2で認証
await cli.AuthenticateAsync(oauth2);
・・・
最初、Authentication Failが発生したので、アカウントを変えたり、色々してみたが、全然だめなので、もしやと思い、スコープにPrefixを付けたら、うまく動作した。
OAuth2対応についてはネットで調べても、Microsoft.Identity.Clientを使用した例ばかりで、解決に結構時間が掛かってしまった。