Delphi Mail OAuth2

Microsoft 365 と Gmail は、ほとんどのメールボックスで単純なパスワードをもう受け付けません。OAuth2 トークンを取得して更新し続け、SMTP、IMAP、POP3 のクライアントが必要とする SASL 文字列をそのまま渡せます。

TsgcMailOAuth2

Exchange Online と Gmail 向けの OAuth 2.0 アクセストークンを取得・更新し、XOAUTH2 と OAUTHBEARER の文字列を生成します。メールサーバーとは一切通信しないため、Indy の TIdSMTP、TIdIMAP4、TIdPOP3 や、生の SASL コマンドを送信できる任意のライブラリと組み合わせて使えます。

コンポーネントクラス

TsgcMailOAuth2(ユニット sgcAuth_Mail_OAuth2

プロトコル

SASL OAUTHBEARER (RFC 7628) および XOAUTH2

対応プラットフォーム

Windows, macOS, Linux, iOS, Android

エディション

Enterprise および All-Access、加えて sgcAuth パックでも利用できます。sgcWebSockets .NET でも利用可能です。

一度サインインすれば、何か月もメールを送信できる

Provider と Protocols を選び、ClientId を設定して、保存済みのリフレッシュトークンを再利用するか Start を呼び出し、GetXOAuth2 でメールセッションを認証します。

uses
  IdSMTP, sgcAuth_Mail_OAuth2;

// Mail はフォームフィールドです:Mail: TsgcMailOAuth2;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Mail := TsgcMailOAuth2.Create(Self);
  Mail.Provider := mopMicrosoft365;
  Mail.Protocols := [mpSMTP];
  Mail.TenantId := 'contoso.onmicrosoft.com';
  Mail.ClientId := 'your-application-id';
  Mail.OnTokensChanged := OnMailTokensChanged;

  // 保存済みのリフレッシュトークンを再利用し、使えなくなった場合のみサインインします
  Mail.RefreshToken := LoadRefreshToken;
  if (Mail.RefreshToken = '') or not Mail.Refresh then
    Mail.Start; // ブラウザを開き、PKCE とループバックリダイレクトで認証します
end;

procedure TForm1.OnMailTokensChanged(Sender: TObject; const AccessToken,
  RefreshToken: String; const ExpiresAt: TDateTime);
begin
  SaveRefreshToken(RefreshToken); // 保存先で暗号化してください
end;

// TIdSMTP は UseTLS = utUseExplicitTLS、AuthType = satNone とします
procedure TForm1.Authenticate(aSMTP: TIdSMTP);
begin
  aSMTP.Connect; // EHLO と STARTTLS
  aSMTP.SendCmd('AUTH XOAUTH2 ' + Mail.GetXOAuth2('user@contoso.com'), 235);
end;
// uses: IdSMTP, sgcAuth_Mail_OAuth2
TsgcMailOAuth2 *Mail = new TsgcMailOAuth2(this);
Mail->Provider = mopMicrosoft365;
Mail->Protocols = TsgcMailOAuth2Protocols() << mpSMTP;
Mail->TenantId = "contoso.onmicrosoft.com";
Mail->ClientId = "your-application-id";
Mail->OnTokensChanged = OnMailTokensChanged;

Mail->RefreshToken = LoadRefreshToken();
if (Mail->RefreshToken.IsEmpty() || !Mail->Refresh())
  Mail->Start();

IdSMTP1->Connect();
IdSMTP1->SendCmd("AUTH XOAUTH2 " + Mail->GetXOAuth2("user@contoso.com"), 235);

主な機能

現代のメールに必要な OAuth2 部分を、プロバイダーの詳細を設定済みの1つのコンポーネントにまとめています。

Microsoft 365 と Gmail のプリセット

ProvidermopMicrosoft365 または mopGmail を選ぶと、正しいエンドポイントが設定されます。mopCustom では、他の任意のプロバイダー向けに CustomAuthURLCustomTokenURLCustomDeviceAuthorizationURLCustomScope を指定できます。

プロトコルから決まるスコープ

ProtocolsmpSMTPmpIMAPmpPOP3 を任意に組み合わせて設定すると、コンポーネントが対応するスコープを要求します。Microsoft 365 では offline_access も付与されます。要求内容は GetScope で確認できます。

ブラウザまたはデバイスコード

FlowmofAuthorizationCodePKCE(ブラウザとループバックリダイレクト、LocalServerOptions を参照)または、サービスやコンソール向けの mofDeviceCode を選択できます。後者では OnDeviceCode で表示すべきコードとURLを受け取ります。

トークンのライフサイクル

AccessTokenRefreshTokenExpiresAt は常に最新の状態です。Refresh はアクセストークンを同期的に更新し、OnTokensChanged が毎回発生するため、新しいリフレッシュトークンを永続化できます。

すぐに送信できる SASL 文字列

GetXOAuth2GetOAuthBearerAUTH XOAUTH2AUTH OAUTHBEARER 用の Base64 初期応答を返します。Raw 系のバリアントと sgcGetXOAuth2 関数群は、デバッグや他のトークン発行元との併用に役立ちます。

トランスポートを問わない設計

このコンポーネントはメール接続を一切開きません。Indy の TIdSMTPTIdIMAP4TIdPOP3、あるいは生の SASL コマンドを送信できる任意のメールライブラリを使用でき、トークン要求の TLS は HTTPClientOptions で設定します。

仕様・参考資料

このコンポーネントが実装する標準規格の公式ソースです。

ドキュメント・デモ

コンポーネントリファレンスへの直接リンク、すぐに実行できるデモプロジェクトの入手、体験版のダウンロードができます。

オンラインヘルプ — TsgcMailOAuth2 このコンポーネントのプロパティ、メソッド、イベントの完全なリファレンスに加え、Microsoft 365 と Gmail のアプリ登録手順を掲載しています。
デモプロジェクト — Demos\26.Authentication\06.Mail_OAuth2 ブラウザおよびデバイスコードによるサインイン、トークン更新、AUTH XOAUTH2 で送信するテストメールを収録しています。sgcWebSockets パッケージに同梱されています。以下から体験版をダウンロードできます。
技術ドキュメント (PDF) このコンポーネントの機能、クイックスタート、Delphi および C++ Builder 向けのコードサンプル、一次資料のリファレンスを掲載しています。
ユーザーマニュアル (PDF) ライブラリのすべてのコンポーネントを網羅した総合マニュアルです。
ブログ — Delphi でパスキー、SAML SSO、LDAP、TOTP 2FA によるログインを実現する 6つの認証コンポーネントが1つの Delphi アプリケーションでどう連携するかを解説します。
最もお得な選択: All-AccesseSeGeCe の全製品にプレミアムサポートが付いて、年間 €1,059 からご利用いただけます。
All-Access の価格を見る

OAuth2 でメールを送信しませんか?

体験版をダウンロードして、Delphi のメール機能を Microsoft 365 と Gmail に対応させ続けましょう。