从 sgcIndy 2024.5.0 起支持 XOAuth2 身份验证机制。SASL XOAUTH2 机制用于 IMAP AUTHENTICATE、POP AUTH 和 SMTP AUTH 命令。此机制允许使用 OAuth 2.0 访问令牌对用户的 Gmail 账户进行身份验证。
TIdSASLXOAuth2
TIdSASLXOAuth2 具有 OnAuthenticate 事件,该事件在授权完成之前调用。事件包含 2 个参数:
- Username:发送邮件的账户用户名
- Token:OAuth2 令牌。必须使用第三方组件(如 sgcWebSockets 库中的 TsgcHTTP_OAuth2_Client)获取。
如果要使用 TIdSMTP 组件发送邮件,只需将 TIdSASLXOAuth2 组件添加为新的 SASLMechanism。
xOAuth2 := TIdSASLXOAUTH2.Create(nil); smtp := TIdSMTP.Create(nil); ... smtp.AuthType := satSASL; smtp.SASLMechanisms.Clear; smtp.SASLMechanisms.Add.SASL := xoauth2;
配置 SMTP 和 XOAuth2 组件后,使用 SMTP 组件发送邮件,当需要授权时将调用 OnAuthenticate 事件。只需在此设置 Username 和 Access Token。
procedure OnXOAuth2Authenticate(Sender: TObject; var Username,
Token: string);
begin
Token := 'OAuth2 Access Token';
Username := 'your mail account';
end;
OAuth2 客户端
OAuth2 访问令牌可使用 sgcWebSockets 库中的 TsgcHTTP_OAuth2_Client 获取。
以下是配置 OAuth2 客户端从 Google 用户账户获取 OAuth2 访问令牌的示例。
OAuth2 := TsgcHTTP_OAuth2_Client.Create(nil);
OAuth2.OnAfterAccessToken := OnOAuth2AfterAccessTokenEvent;
OAuth2.OAuth2Options.GrantType := auth2CodePKCE;
OAuth2.LocalServerOptions.IP := '127.0.0.1';
OAuth2.LocalServerOptions.Port := 0;
OAuth2.AuthorizationServerOptions.AuthURL := 'https://accounts.google.com/o/oauth2/auth';
OAuth2.AuthorizationServerOptions.TokenURL := 'https://accounts.google.com/o/oauth2/token';
OAuth2.AuthorizationServerOptions.Scope.Text := 'https://mail.google.com/';
OAuth2.OAuth2Options.ClientId := '<your oauth2 client id>';
OAuth2.OAuth2Options.ClientSecret := '<your oauth2 client secret>';
OAuth2.Start;
procedure OnOAuth2AfterAccessTokenEvent(Sender: TObject; const
Access_Token, Token_Type, Expires_In, Refresh_Token, Scope, RawParams:
String; var Handled: Boolean);
begin
ShowMessage(Access_Token);
end;
Delphi XOAuth2 演示
以下演示展示了使用 sgcWebSockets 库的 OAuth2 客户端通过 SMTP 协议发送邮件的 XOAuth2 组件。选择 XOAuth2 标签页使用此类认证并填写以下字段:
- 用户名
- OAuth2 客户端 ID
- OAuth2 客户端密钥
- 收件人地址
