Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在vps计算机内执行IdSMTP时无法发送电子邮件_Delphi_Indy - Fatal编程技术网

Delphi 在vps计算机内执行IdSMTP时无法发送电子邮件

Delphi 在vps计算机内执行IdSMTP时无法发送电子邮件,delphi,indy,Delphi,Indy,我想发送一封电子邮件Hotmail>Gmail,其中包含一个附加文件,我在下面挂载了这段代码,在我自己的计算机上执行时工作正常,在vps计算机内执行时已不发送任何消息 //////////////////////////////////////////////// 这个代码有什么问题 版本: 错误是: 身份验证失败 从错误消息中可以清楚地看出,服务器在发送电子邮件之前拒绝了您的身份验证尝试 在我详细讨论您的问题之前,让我给您一些信息,以便您了解tidstp身份验证的一般工作原理 默认情况下

我想发送一封电子邮件Hotmail>Gmail,其中包含一个附加文件,我在下面挂载了这段代码,在我自己的计算机上执行时工作正常,在vps计算机内执行时已不发送任何消息

////////////////////////////////////////////////

这个代码有什么问题



版本:

错误是:

身份验证失败


从错误消息中可以清楚地看出,服务器在发送电子邮件之前拒绝了您的身份验证尝试

在我详细讨论您的问题之前,让我给您一些信息,以便您了解
tidstp
身份验证的一般工作原理

默认情况下,
tidstp.AuthType
属性为
satDefault
,而
tidstp.validateAthlogencability
属性为True。这意味着
tidstp.Username
tidstp.Password
属性是使用不安全的
AUTH LOGIN
命令发送的(大多数服务器在没有建立SSL/TLS会话的情况下不会接受该命令),但前提是服务器的
EHLO
回复表明
登录
是可接受的身份验证(许多服务器都不报告,即使它们确实接受)

因此,
tidstp.Authenticate()
(您不需要手动调用,
tidstp.Send()
为您调用它)甚至可能在
AuthType=satDefault
时不会尝试向服务器进行身份验证,然后对
tidstp.Send()
的后续调用可能会因身份验证错误而失败(您可以通过将Indy的
TIdLog…
组件之一分配给
TIdSMTP.Intercept
属性来验证这一点,然后查看
TIdSMTP
发送的实际SMTP命令)

因此,请尝试将
tidstp.validateAthlogincability
设置为False,以便
tidstp.Authenticate()
将始终在
AuthType=satDefault
时发送
AUTH LOGIN
,无论服务器是否报告它是可接受的。如果服务器不接受它,至少它将在该阶段而不是在
send()
阶段失败身份验证

但是,现在大多数SMTP服务器接受/需要比
LOGIN
更强的身份验证方案,例如
CRAM-SHA1
CRAM-MD5
。因此,您可以改为设置
AuthType=satsal
,然后使用相关的
tidsal
派生组件填充
tidsmp.SASLMechanisms
集合(包括
tidsallogin
以在支持时处理
AUTH LOGIN
),并将它们链接到
TIdUserPassProvider
以获取
用户名
密码
(在SASL身份验证过程中不使用
tidstp.Username
tidstp.Password
属性)

话虽如此,我还是用
smtp.live.com
测试了
tidmtp
,事实上,它在SSL/TLS会话建立后报告了对
LOGIN
身份验证的支持,因此
validateAthlogincapability
不适用于该服务器。使用
AuthTyp时会发送
AUTH LOGIN
命令e=satDefault
,或将
TIdSASLLogin
AuthType=satSASL
一起使用时

但是,当使用我的真实Hotmail密码时,服务器会拒绝我使用
AUTH login
登录的尝试,这是因为我的帐户启用了两步验证。因此,为了
tidmtp
正确登录,我必须使用web浏览器进入我的Hotmail帐户,并在securit中创建应用程序密码y设置,然后将
tidstp
配置为使用该密码而不是我的真实密码。然后
AUTH LOGIN
成功

如果在Hotmail帐户上启用了两步验证,则必须执行相同的操作

SMTP.AuthType := satDefault;
SMTP.IOHandler := SSLHandler;
SMTP.Host := 'smtp.live.com';
SMTP.Port := 587;
SMTP.Username := 'real hotmail email here';
SMTP.Password := 'app password here'; // <--
SMTP.UseTLS := utUseExplicitTLS;
SMTP.AuthType:=satDefault;
SMTP.IOHandler:=SSLHandler;
SMTP.Host:=“SMTP.live.com”;
SMTP.端口:=587;
SMTP.Username:=“此处为真正的hotmail电子邮件”;

SMTP.Password:='app Password here';//从错误消息中可以清楚地看到,服务器在发送电子邮件之前拒绝了您的身份验证尝试

在我详细讨论您的问题之前,让我给您一些信息,以便您了解
tidstp
身份验证的一般工作原理

默认情况下,
tidstp.AuthType
属性是
satDefault
,而
tidstp.validateAthlogencability
属性是True。这意味着
tidstp.Username
tidstp.Password
属性是使用不安全的
AUTH LOGIN
命令发送的(如果没有已建立的SSL/TLS会话,大多数服务器将不接受此验证),但只有当服务器的
EHLO
回复表明
LOGIN
是可接受的身份验证时(许多服务器即使接受此验证,也不会报告此验证)

因此,
tidstp.Authenticate()
(您不需要手动调用,
tidstp.Send()
为您调用它)甚至可能在
AuthType=satDefault
时不会尝试向服务器进行身份验证,然后对
tidstp.Send()
的后续调用可能会因身份验证错误而失败(您可以通过将Indy的
TIdLog…
组件之一分配给
TIdSMTP.Intercept
属性来验证这一点,然后查看
TIdSMTP
发送的实际SMTP命令)

因此,请尝试将
tidstp.validateAthlogincability
设置为False,以便
tidstp.Authenticate()
将始终在
AuthType=satDefault
时发送
AUTH LOGIN
,无论服务器是否报告它是可接受的。如果服务器不接受它,至少它将在该阶段而不是在
send()
上失败身份验证
    try
      SMTP.Connect;
      SMTP.Authenticate;
    except
      on E:Exception do
      begin
        MessageDlg('' +
          E.Message, mtWarning, [mbOK], 0);
        Exit;
      end;
    end;

    try
      SMTP.Send(Email);
      MessageDlg('Sent!', mtInformation, [mbOK], 0);
    except
      On E:Exception do
      begin
        MessageDlg('' +
          E.Message, mtWarning, [mbOK], 0);
      end;
    end;

  finally
    SMTP.Disconnect;
    SMTP.Free;
    Email.Free;
    SSLHandler.Free;
  end;
SMTP.AuthType := satDefault;
SMTP.IOHandler := SSLHandler;
SMTP.Host := 'smtp.live.com';
SMTP.Port := 587;
SMTP.Username := 'real hotmail email here';
SMTP.Password := 'app password here'; // <--
SMTP.UseTLS := utUseExplicitTLS;