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);
}