MailKit で提供されるコード例は、IMAP メールボックスにアクセスするには、次のようなコードが必要であることを示唆しています...
var at = "<<Access_Token>>";
using (var client = new ImapClient())
{
client.Connect("imap-mail.outlook.com", 993, SecureSocketOptions.SslOnConnect);
client.Authenticate("<<Email_Address>>", at);
// do stuff...
client.Disconnect(true);
}
このコードを GMail と適切に生成された有効期限が切れていないアクセス トークンで使用すると、これはうまく機能します。
適切に生成されたアクセス トークンを使用した同じコードでも、回線AuthenticationException: Invalid username or password.
上でスローされるだけです。client.Authenticate
このWeb サイトに対してテストを行ったところ、電子メール アドレスとアクセス トークンの値が有効であることがわかりました。Gmail では正しいのに、ここで間違っていることは何ですか?
[編集]この MSDN ページで、次の提案 を見つけました...
アプリ/サーバーは、AUTHENTICATE コマンドでアクセス トークンを IMAP サービスに渡します。以下を含む base64 でエンコードされた文字列を受け入れます。
- ユーザー名。
- ダイレクト OAuth 2.0 リクエストの認証タイプ Bearer。
- MSA によって付与されたアクセス トークン。
たとえば、アプリ/サーバーは次の文字列を base-64 でエンコードします。
user={user@domain.com}^Aauth=Bearer {Access Token}^A^A
ここで、{user@domain.com} はユーザーのアカウント、{Access Token} は MSA によって付与されたアクセス トークン、^A は Ctrl-A 文字 (U+0001) です。
ただし、提案された文字列を作成し、それを「パスワード」値として渡してclient.Authenticate()
無駄にしようとしました。