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