delphi – 在Office365中使用INDY 10 SMTP

我不熟悉INDY SMTP组件.我想用INDY和Office 365发送邮件.这是一个很好的主题,它帮助了我很多: What do the SMTP Indy component security and authentication properties do?
但我没想出如何使用SASL. Office365地址是smtp.office365.com,端口为587和TLS.所以我在表单中添加一个SMTP和一个OpenSSL-IOHandler并设置了属性.但我没有工作,应用程序只是冻结.我需要知道如何在Office365中使用SASL.

谢谢.

解决方法

Office365仅支持TLS端口587上的LOGIN SASL.

当我尝试它时,以下代码对我来说很好(所有这些设置也可以在设计时设置):

>将TIdSMTP.AuthType属性设置为satDefault,它使用SMTP AUTH LOGIN命令:

var
  idSMTP1: TIdSMTP;
begin
  idSMTP1 := TIdSMTP.Create(nil);
  try
    idSMTP1.IOHandler := TIdSSLIOHandlerSocketopenSSL.Create(idSMTP1);
    idSMTP1.UseTLS := utUseExplicitTLS;
    TIdSSLIOHandlerSocketopenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvSSLv3;

    idSMTP1.Host := 'smtp.office365.com';
    idSMTP1.Port := 587;

    idSMTP1.AuthType := satDefault;
    idSMTP1.Username := ...;
    idSMTP1.Password := ...;

    try
      idSMTP1.Connect;
      try
        idSMTP1.Authenticate;
      finally
        idSMTP1.disconnect;
      end;
      ShowMessage('OK');
    except
      on E: Exception do
      begin
        ShowMessage(Format('Failed!'#13'[%s] %s',[E.ClassName,E.Message]));
        raise;
      end;
    end;
  finally
    idSMTP1.Free;
  end;

>将TIdSMTP.AuthType属性设置为satSASL并使用TIdSAsllogin,它使用相同的SMTP AUTH LOGIN命令:

var
  idSMTP1: TIdSMTP;
  idSAsllogin: TIdSAsllogin;
  idUserPassprovider: TIdUserPassprovider;
begin
  idSMTP1 := TIdSMTP.Create(nil);
  try
    idSMTP1.IOHandler := TIdSSLIOHandlerSocketopenSSL.Create(idSMTP1);
    idSMTP1.UseTLS := utUseExplicitTLS;
    TIdSSLIOHandlerSocketopenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvSSLv3;

    idSMTP1.Host := 'smtp.office365.com';
    idSMTP1.Port := 587;

    idSAsllogin := TIdSAsllogin.Create(idSMTP1);
    idUserPassprovider := TIdUserPassprovider.Create(idSAsllogin);

    idSAsllogin.UserPassprovider := idUserPassprovider;
    idUserPassprovider.Username := ...;
    idUserPassprovider.Password := ...;

    idSMTP1.AuthType := satSASL;
    idSMTP1.SASLMechanisms.Add.SASL := idSAsllogin;

    try
      idSMTP1.Connect;
      try
        idSMTP1.Authenticate;
      finally
        idSMTP1.disconnect;
      end;
      ShowMessage('OK');
    except
      on E: Exception do
      begin
        ShowMessage(Format('Failed!'#13'[%s] %s',E.Message]));
        raise;
      end;
    end;
  finally
    idSMTP1.Free;
  end;

更新:Office365不再支持SSL v3,您必须立即使用TLS v1.x:

(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...