微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐