我想知道在使用TIdSMTPRelay中的indy组件中继邮件时是否有使用我的服务器证书的方法。这就是我代码中的邮件中继部分的样子:

procedure TMyForm.SMTPServerMsgReceive(ASender: TIdSMTPServerContext; AMsg : TStream;
  var LAction: TIdDataReply);
begin
  //The AMsg (TStream) is being transformed to MsgDecode (TIdMessage) and
  // all relay recipients to RelayRecipients (TIdEMailAddressList) using
  // [http://stackoverflow.com/questions/8499524/using-indy-smtpserver]

  // SSLRelayHandler is a TIdSSLIOHandlerSocketOpenSsl indy component and SMTPRelay is
  // a TIdSMTPRelay indy component
  SMTPRelay.DNSServer := myDNSServer;
  SSLRelayHandler.SSLOptions.Method := sslvSSLv23;
  SSLRelayHandler.SSLOptions.KeyFile := myMailServerKey;
  SSLRelayHandler.SSLOptions.CertFile := myMailServerCert;
  SSLRelayHandler.SSLOptions.RootCertFile := myMailServerRootCert;
  SMTPRelay.IOHandler := SSLRelayHandler;
  SMTPRelay.SSLOptions.SSLSupport := SupportSSL;
  try
    SMTPRelay.Send(MsgDecode, RelayRecipients);
  except on e : Exception do
  end;
end;


有时邮件永远不会发送,有时会发送,但是会转到垃圾邮件部分(yahoo),尽管由于我的STARTTLS附加了TIdSSLIOHandlerSocketOpenSSL,我还是发出了TIdSMTPRelay命令。我可以连接到另一个邮件服务器的SMTPS端口465还是TIdSMTPRelay组件只能发送到端口25?有关更多详细信息,这是与yahoo的通信方式:

Stat Connected.
Recv 23.10.2014 ?. 15:32:15: 220 mta1418.mail.gq1.yahoo.com ESMTP ready<EOL>
Sent 23.10.2014 ?. 15:32:15: EHLO mail.mydomain.com<EOL>
Recv 23.10.2014 ?. 15:32:15: 250-mta1418.mail.gq1.yahoo.com<EOL>250-PIPELINING<EOL>250-SIZE      41943040<EOL>250-8BITMIME<EOL>250 STARTTLS<EOL>
Sent 23.10.2014 ?. 15:32:15: STARTTLS<EOL>
Recv 23.10.2014 ?. 15:32:15: 220 Start TLS<EOL>
Sent 23.10.2014 ?. 15:32:16: EHLO mail.mydomain.com<EOL>
Recv 23.10.2014 ?. 15:32:16: 250-mta1418.mail.gq1.yahoo.com<EOL>250-PIPELINING<EOL>250-SIZE 41943040<EOL>250 8BITMIME<EOL>
Sent 23.10.2014 ?. 15:32:16: MAIL FROM:<[email protected]><EOL>
Recv 23.10.2014 ?. 15:32:16: 250 sender <[email protected]> ok<EOL>
Sent 23.10.2014 ?. 15:32:16: RCPT TO:<[email protected]><EOL>
Recv 23.10.2014 ?. 15:32:16: 250 recipient <[email protected]> ok<EOL>
Sent 23.10.2014 ?. 15:32:16: DATA<EOL>
Recv 23.10.2014 ?. 15:32:17: 354 go ahead<EOL>
Sent 23.10.2014 ?. 15:32:17: From: "[email protected]" <[email protected]>   <EOL>Subject: =?UTF-8?B?0JfQsNCz0LvQsNCy0LjQtTIy?=<EOL>To: [email protected]<EOL>Date: Thu, 23     Oct 2014 15:32:17 +0300<EOL>
Sent 23.10.2014 ?. 15:32:17: <EOL>
Sent 23.10.2014 ?. 15:32:17: body of the mail here<EOL>
Sent 23.10.2014 ?. 15:32:17: <EOL>
Sent 23.10.2014 ?. 15:32:17: .<EOL>
Recv 23.10.2014 ?. 15:32:18: 250 ok dirdel<EOL>
Sent 23.10.2014 ?. 15:32:18: QUIT<EOL>
Recv 23.10.2014 ?. 15:32:18: 221 mta1418.mail.gq1.yahoo.com<EOL>
Stat Disconnected.

最佳答案

TIdSMTPRelay可以使用其他端口。您应该将Port属性设置为默认值(25),以便它可以根据内部管理SSL / TLS连接的方式在25和465之间切换。

SSLOptions属性控制TIdSMTPRelay如何管理其SSL / TLS连接。可以将SSLOptions.SSLSupport设置为NoSSLSupportSSLRequireSSL,并且SSLOptions.TryImplicitTLS可以设置为True或False。请参见TIdSMTPRelay.Connect()中的实现。

SSLOptions.TryImplicitTLS为true(端口465)时,Send()将在连接时尝试使用UseTLS=utImplicitTLS。这意味着一旦连接套接字,便会启动SSL / TLS握手。

如果失败,或者SSLOptions.TryImplicitTLS为false(端口25和587),则Send()将使用UseTLS=utNoTLSSupportUseTLS=utUseExplicitTLSUseTLS= utUseRequireTLS,具体取决于SSLOptions.SSLSupport的值:

NoSSL:SMTP会话将不加密。

SupportSSL:SMTP会话将不加密地启动,然后STARTTLS仅在受支持的情况下才发送到SMTP服务器,否则SMTP会话将继续不加密。如果SSL / TLS握手失败,将引发异常。

RequireSSL:SMTP会话将以未加密的形式启动,然后如果支持,将STARTTLS发送到SMTP服务器,否则SMTP会话将关闭,并引发异常。如果SSL / TLS握手失败,将引发异常。

10-04 20:14