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 부분을, 제공자 세부 사항이 이미 채워진 컴포넌트 하나로 감쌌어요.

Microsoft 365와 Gmail 프리셋

Provider로 올바른 엔드포인트를 사용하는 mopMicrosoft365 또는 mopGmail을 선택해요. mopCustom은 다른 제공자를 위해 CustomAuthURL, CustomTokenURL, CustomDeviceAuthorizationURL, CustomScope를 받아요.

프로토콜에 따른 스코프

ProtocolsmpSMTP, mpIMAP, mpPOP3의 어떤 조합으로 설정해도 컴포넌트가 그에 맞는 스코프를 요청하며, Microsoft 365에서는 offline_access가 추가돼요. GetScope로 요청될 내용을 확인할 수 있어요.

브라우저 또는 디바이스 코드

Flow로 브라우저와 루프백 리디렉션을 쓰는 mofAuthorizationCodePKCE(LocalServerOptions 참고)나, 서비스와 콘솔 앱에 적합한 mofDeviceCode를 선택해요. 후자는 OnDeviceCode가 보여줄 코드와 URL을 전달해요.

토큰 생애 주기

AccessToken, RefreshToken, ExpiresAt은 항상 최신 상태예요. Refresh는 액세스 토큰을 동기적으로 갱신하며 그때마다 OnTokensChanged가 발생하므로 새 리프레시 토큰을 저장할 수 있어요.

바로 보낼 수 있는 SASL 문자열

GetXOAuth2GetOAuthBearerAUTH XOAUTH2AUTH OAUTHBEARER용 Base64 초기 응답을 반환해요. Raw 변형과 sgcGetXOAuth2 함수는 디버깅과 다른 토큰 소스에 도움이 돼요.

전송 방식과 무관

이 컴포넌트는 메일 연결을 직접 열지 않아요. Indy의 TIdSMTP, TIdIMAP4, TIdPOP3나 원시 SASL 명령을 보낼 수 있는 다른 메일 라이브러리와 함께 사용하며, 토큰 요청의 TLS는 HTTPClientOptions로 제어해요.

사양 및 참조

이 컴포넌트가 구현하는 표준의 공식 출처예요.

문서 및 데모

컴포넌트 레퍼런스 링크, 즉시 실행 가능한 데모 프로젝트, 체험판 다운로드를 제공해요.

온라인 도움말 — TsgcMailOAuth2 전체 속성, 메서드, 이벤트 레퍼런스와 Microsoft 365 및 Gmail 앱 등록 절차예요.
Demo Project — Demos\26.Authentication\06.Mail_OAuth2 브라우저 및 디바이스 코드 로그인, 토큰 갱신, AUTH XOAUTH2로 보내는 테스트 메일이에요. sgcWebSockets 패키지에 포함돼 있어요, 아래에서 체험판을 다운로드하세요.
기술 문서 (PDF) 이 컴포넌트만을 위한 기능, 빠른 시작, Delphi 및 C++ Builder 코드 샘플, 1차 출처 참조예요.
사용자 설명서 (PDF) 라이브러리의 모든 컴포넌트를 다루는 종합 설명서예요.
블로그 — Delphi에서 패스키, SAML SSO, LDAP, TOTP 2FA로 로그인하기 여섯 개의 인증 컴포넌트가 하나의 Delphi 애플리케이션에서 어떻게 맞물리는지 설명해요.
최고의 가성비: All-Access모든 eSeGeCe 제품과 프리미엄 지원이 포함되어 연 €1,059부터 이용할 수 있어요.
All-Access 가격 보기

OAuth2로 메일을 보낼 준비가 됐나요?

무료 체험판을 다운로드하고, Delphi 메일 기능이 Microsoft 365와 Gmail에서 계속 동작하게 하세요.