delphi 使用应用程序特定密码通过GMail发送电子邮件

dfty9e19  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(260)

我维护和开发了一个程序,(除其他外)通过GMail发送电子邮件。
到目前为止,发送电子邮件没有任何问题,但几天前,这个功能停止工作,并显示一条消息“无效的凭据”。我查看了Gmail的帮助,发现了以下解释/警告/what-have-you:
为确保您的账户安全,自2022年5月30日起, Google不再支持使用要求您仅使用用户名和密码登录Google帐户的第三方应用程序或设备。
解决方案是使用“应用程序特定”密码。
我看了看this question,上面写着:
我最近的一次尝试是在Gmail上创建一个“应用特定”密码
但是附加的代码实际上并没有显示密码是如何发送的。
阅读了问题和答案后,我对程序做了一些修改:

Port := 995
UseTLS := utUseImplicitTLS
SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]

在这些更改之后,我尝试发送一封测试邮件(仍然没有应用程序特定的密码),我得到了响应
回复代码无效:+确定
这可能意味着我的程序失败了,因为它没有发送应用程序特定的密码。
我想知道的是:如何发送密码?
下面是我的代码,它作为一个线程执行,因此所有组件都在代码中定义:

email:= TIdMessage.Create (nil);
 try
  email.LoadFromFile (FFileName);
  email.OnInitializeISO:= DoInitializeISO;
  //  DeleteFile (FFileName);

  smtp:= TIdSMTP.Create (nil);
  try
   smtp.OnFailedRecipient:= FailedRecipient;
   ssl:= TIdSSLIOHandlerSocketOpenSSL.Create (smtp);
   ssl.SSLOptions.SSLVersions:= [sslvTLSv1];

   smtp.OnStatus := DoStatus;
   smtp.IOHandler:= ssl;
   smtp.Host:= FHost;
   smtp.Password:= FPassword;   // now app passord
   smtp.Username:= FUsername;
   smtp.UseTLS:= utUseExplicitTLS;
   smtp.Port:= 587;

   smtp.Connect;
   try
    smtp.Send (email);
   finally
    smtp.Disconnect;
   end;
  finally
   ssl.free;
   smtp.Free;
  end;
 finally
  email.Free;
 end;
ssm49v7z

ssm49v7z1#

特定于应用程序的密码就是Gmail为您生成的密码,您可以使用它来代替普通密码(例如,在TIdSMTP.Password属性中)。Gmail文档中对此进行了说明:
Sign in with App Passwords

bbmckpt7

bbmckpt72#

你可以用应用程序密码替换密码。假设你的代码ID类似于下面的代码。记住你需要启用2fa才能创建应用程序密码。

smtp.OnStatus := DoStatus;
   smtp.IOHandler:= ssl;
   smtp.Host:= FHost;
   smtp.Password:= AppsPassword;   // Password from Apps Password
   smtp.Username:= FUsername;
   smtp.UseTLS:= utUseExplicitTLS;
   smtp.Port:= 587;

另一个选项是使用Xoauth2。

相关问题