【问题标题】:Sending mail with Indy without using external server使用 Indy 发送邮件而不使用外部服务器
【发布时间】:2011-12-21 18:10:10
【问题描述】:

我的应用程序使用 Indy TiDSMTP 客户端组件发送电子邮件。然而,在某些情况下,客户无法或不愿意设置 SMTP 服务器和端口、用户名等,因此我想提供一种无需任何人设置任何东西即可发送电子邮件的解决方案。

我尝试了 TIDSMTPRelay 演示,但我需要显式输入 DNS 服务器 IP 地址(当我这样做时,它在“Project SMTPRelay.exe 引发异常类 EIdHostRequired 并带有消息''”时失败)。我希望有一个不需要用户输入任何设置的 Indy 解决方案——只要他们可以访问互联网,它就可以“开箱即用”。

我还需要提供什么?

TIA, 回复

【问题讨论】:

  • 请注意,如果某些检查(即 MX 记录、反向 DNS 查找、动态 IP 范围等)失败,另一端的某些邮件服务器可能会拒绝传入的邮件。因此,最好通过接收邮件并将其转发到目的地的邮件服务器“中继”。
  • 您的意思是,将我自己公司的电子邮件服务器和身份验证详细信息硬编码到应用程序中,然后使用 TidSMTP(客户端)发送邮件?
  • 可以从根服务器开始解析DNS,无需知道本地配置的DNS服务器IP地址。
  • @Marcus Adams,具有本地 DNS 是标准 TCP/IP 的要求,因此根服务器显然过度工程化。
  • 这就像使用自己的 SMTP 中继服务器一样过度设计。

标签: delphi smtp indy10


【解决方案1】:

您必须将电子邮件直接发送到收件人邮件服务器。这需要执行 DNS 查找来检索每个收件人域的 MX 记录。 Indy 的 TIdSMTPRelay 组件为您处理(通过在内部使用 TIdDNSResolver 组件)。

没有平台中立的方式来查询机器的当前 DNS 配置。这需要特定于平台的 API。 Indy 目前还没有任何东西可以实现自动化,尽管我认为这在未来的版本中并没有超出可能的范围。

您看到的异常是由TIdTCPClient.Connect() 引发的。使用TIdSMTPRelay 时不应手动调用它。在确定每个收件人域要连接到哪个Host 后,它会在内部调用。您需要自己做的就是设置DNSServer 属性,可选择设置RelaySender 属性,然后调用Send() 方法。没有别的了。

【讨论】:

  • 谢谢雷米。 [quote] TIdTCPClient.Connect() 引发了该异常。使用 TIdSMTPRelay 时不应手动调用它。在确定每个收件人域要连接到哪个主机后,在内部调用它。您需要自己做的就是设置 DNSServer 属性,可选择设置 RelaySender 属性,然后调用 Send() 方法。没有别的了。[/quote] 我正在运行TidSMTPRelay 演示示例,一旦我填写了所有字段并单击“发送”,我就认为它已经为我完成了所有这些。我在这里错过了什么?
  • 没有错,只是老了。在btnSendMailClick() 中,删除围绕Send() 调用的Connect()Disconnect() 的两个调用,只需单独调用Send()。您可以在异常处理程序中删除对Connected()Disconnect() 的调用,因为Send() 在退出之前会在内部关闭套接字。除此之外,演示中的其他一切都很好。
  • 差不多:) 编译演示。运行演示。填写字段。检查Log SMTP traffic to file。点击Send Mail。我在线获得 AV:IdLogFile1.Active := True;。在清除复选框的情况下运行一次演示会停止 AV 的发生。
猜你喜欢
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多