Delphi 邮件 OAuth2
Microsoft 365 和 Gmail 已不再接受大多数邮箱使用明文密码登录。获取 OAuth2 令牌,保持其有效,并向 SMTP、IMAP 或 POP3 客户端提供它所需的准确 SASL 字符串。
Microsoft 365 和 Gmail 已不再接受大多数邮箱使用明文密码登录。获取 OAuth2 令牌,保持其有效,并向 SMTP、IMAP 或 POP3 客户端提供它所需的准确 SASL 字符串。
获取并刷新 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 部分,封装在一个已预置好各提供者细节的组件中。
Provider 选择 mopMicrosoft365 或 mopGmail,并自动使用正确的端点。mopCustom 通过 CustomAuthURL、CustomTokenURL、CustomDeviceAuthorizationURL 和 CustomScope 支持任意其他提供者。
将 Protocols 设置为 mpSMTP、mpIMAP 和 mpPOP3 的任意组合,组件会请求对应的作用域,并在 Microsoft 365 上附加 offline_access。GetScope 会显示将要请求的内容。
Flow 可选择 mofAuthorizationCodePKCE(浏览器加回环重定向,见 LocalServerOptions),或适合服务与控制台程序的 mofDeviceCode,此时 OnDeviceCode 会提供需要展示的代码和 URL。
AccessToken、RefreshToken 和 ExpiresAt 始终保持最新。Refresh 会同步刷新访问令牌,每次都会触发 OnTokensChanged,方便您持久化新的刷新令牌。
GetXOAuth2 和 GetOAuthBearer 返回用于 AUTH XOAUTH2 和 AUTH OAUTHBEARER 的 Base64 初始响应。Raw 变体以及 sgcGetXOAuth2 函数有助于调试及使用其他令牌来源。
该组件从不建立邮件连接。可搭配 Indy 的 TIdSMTP、TIdIMAP4 或 TIdPOP3,或任何能够发送原始 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 应用中协同工作。 | 打开 |