Delphi 邮件 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 部分,封装在一个已预置好各提供者细节的组件中。

Microsoft 365 与 Gmail 预设

Provider 选择 mopMicrosoft365mopGmail,并自动使用正确的端点。mopCustom 通过 CustomAuthURLCustomTokenURLCustomDeviceAuthorizationURLCustomScope 支持任意其他提供者。

根据协议生成作用域

Protocols 设置为 mpSMTPmpIMAPmpPOP3 的任意组合,组件会请求对应的作用域,并在 Microsoft 365 上附加 offline_accessGetScope 会显示将要请求的内容。

浏览器或设备代码

Flow 可选择 mofAuthorizationCodePKCE(浏览器加回环重定向,见 LocalServerOptions),或适合服务与控制台程序的 mofDeviceCode,此时 OnDeviceCode 会提供需要展示的代码和 URL。

令牌生命周期

AccessTokenRefreshTokenExpiresAt 始终保持最新。Refresh 会同步刷新访问令牌,每次都会触发 OnTokensChanged,方便您持久化新的刷新令牌。

可直接发送的 SASL 字符串

GetXOAuth2GetOAuthBearer 返回用于 AUTH 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) 涵盖库中每个组件的综合手册。
博客:使用通行密钥、SAML SSO、LDAP 和 TOTP 2FA 登录 Delphi 六个身份验证组件如何在一个 Delphi 应用中协同工作。
超值之选:All-AccesseSeGeCe 全部产品,含高级支持,每年 €1,059 起。
查看 All-Access 价格

准备好使用 OAuth2 发送邮件了吗?

下载免费试用版,让您的 Delphi 邮件功能持续兼容 Microsoft 365 和 Gmail。