【C#】Office 365のアカウントのOAUTH2を使用したメール送受信プログラム(IMAP/POP/SMTP):MailKit使用

Sponsored Links
Sponsored Links

Azureの設定

API permissions

Azure側の設定としてApp registrationsにアプリケーションの登録を行う。
Active Directory > 左のメニューよりApp registrationsと進む。

App registrationsページでは、NameとSupported account typesを選択すれば、登録できる。

registrationが完了後は、API permissionsの設定などを行う。

API permissionsページでは、Microsoft Graphをクリックし、特定のIMAP/SMTPアカウントユーザに対し、そのユーザのみのInbox、そのユーザからメールを送信する際などは、Delegated permissionsを選択する。Application permissionsを選択すると、特定のIMAP/SMTPユーザでそのサービスにログインしたとしても、そのユーザ以外のInboxの操作などを行う権限となるため、注意が必要となる。


Select permissionsしたのテキストボックスにimap等のキーワードを入力すると、該当のpermissionが出力されるので、それらを追加する。

POP3/SMTP/IMAPを追加するとこのように表示される。

権限の追加したのちに、この登録しているapplicationをユーザに使用させる同意をアドミン権限のあるユーザが行う必要がある。
Directoryのすべてのユーザに対し、このapplicationの設定を適用させる際は、上のスクリーンショットの「✅ Grant admin consent for Default Directory」をクリックする。

Authentication

applicationのAuthenticationの設定を行う。
ここでは、外部プログラムからでもこのapplicationを使用することができるように設定、どのようなアプリから、このapplicationが実行されるかを定義する。

Platform configurationsしたのAdd a platformをクリックするし、呼び出し側の設定を行う。
一定の間隔でタスクスケジュールから実行されるexeプログラムから、このapplicationを使用する際は、Mobile and desktop applicationsを選択する。

一番上を選択し、完了させる。

最後に、外部プログラムから実行を許可する。
Advanced settingsのAllow public client flowsをYesにして保存する。

ここまで完了させ、overview画面のApplication ID / Directory IDは、後ほどC#から使用する。

C#

MailKitはNuGetより取得する。IMAP/SMTP/POPなどのクライアント機能を備えている。

IMAP

            var options = new PublicClientApplicationOptions
            {
                ClientId = "Azureから取得するApplication ID",
                TenantId = "Azureから取得するDirectory ID",
                RedirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient"
            };

            var publicClientApplication = PublicClientApplicationBuilder
                .CreateWithApplicationOptions(options)
                .Build();

            var scopes = new string[] {
                            "email",
                            "offline_access",
                            "https://outlook.office.com/IMAP.AccessAsUser.All", // Only needed for IMAP
                                                                                //"https://outlook.office.com/POP.AccessAsUser.All",  // Only needed for POP
                                                                                //"https://outlook.office.com/SMTP.Send", // Only needed for SMTP
            };

            //var authToken = await publicClientApplication.AcquireTokenInteractive(scopes).ExecuteAsync();
            AuthenticationResult authToken = await publicClientApplication.AcquireTokenByUsernamePassword(scopes, "SMTPユーザID", "SMTPユーザパスワード").ExecuteAsync();

            var oauth2 = new SaslMechanismOAuth2(authToken.Account.Username, authToken.AccessToken);

            using (var client = new ImapClient())
            {
                await client.ConnectAsync("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect);
                await client.AuthenticateAsync(oauth2);

                var inbox = client.Inbox;
                inbox.Open(FolderAccess.ReadWrite);
                await client.DisconnectAsync(true);
            }
        }

SMTP

IMAPとほぼおなじコードを使用できる。ImapClientの代わりに、SmtpClientを使用する。

               var options = new PublicClientApplicationOptions
                {
                    ClientId = "Azureから取得するApplication ID",
                    TenantId = "Azureから取得するDirectory ID",
                    RedirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient"
                };

                var publicClientApplication = PublicClientApplicationBuilder
                    .CreateWithApplicationOptions(options)
                    .Build();

                var scopes = new string[] {
                            "email",
                            "offline_access",
                            //"https://outlook.office.com/IMAP.AccessAsUser.All", // Only needed for IMAP
                                                                                //"https://outlook.office.com/POP.AccessAsUser.All",  // Only needed for POP
                                                                                "https://outlook.office.com/SMTP.Send", // Only needed for SMTP
            };

                //var authToken = await publicClientApplication.AcquireTokenInteractive(scopes).ExecuteAsync();

                AuthenticationResult authToken = await publicClientApplication.AcquireTokenByUsernamePassword(scopes, "SMTPアカウントユーザID", "SMTPアカウントユーザパスワード").ExecuteAsync();

                var oauth2 = new SaslMechanismOAuth2(authToken.Account.Username, authToken.AccessToken);

                using (var client = new MailKit.Net.Smtp.SmtpClient())
                {
                    await client.ConnectAsync(Settings.SMTPServer, int.Parse(Settings.SMTPPort), SecureSocketOptions.Auto);
                    await client.AuthenticateAsync(oauth2);
                    await client.DisconnectAsync(true);
                }



IT
Sponsored Links
Sponsored Links
Sponsored Links
ようさんチョットでぶ
Copied title and URL
Bitnami