2011-12-21 118 views
2

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

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

我还需要提供什么?

TIA, [R

+3

请注意,如果某些检查(例如MX记录,反向DNS查询,动态IP范围等)失败,则另一端的某些邮件服务器可能拒绝接收邮件。因此,最好通过邮件服务器“中继”,邮件服务器将接受邮件并将它们转发到目的地。 – 2011-12-21 19:05:28

+0

您的意思是,将我自己公司的电子邮件服务器和身份验证详细信息硬编码到应用程序中,并使用TidSMTP(客户端)发送邮件? – rossmcm 2011-12-21 19:58:14

+0

您可以从根服务器开始解析DNS,无需知道本地配置的DNS服务器IP地址。 – 2011-12-21 20:58:02

回答

10

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

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

您看到的例外情况是由TIdTCPClient.Connect()引发的。使用TIdSMTPRelay时,您不应该手动调用该功能。它在确定要为每个收件人域连接哪个Host后在内部调用。您只需要设置DNSServer属性,可选地设置RelaySender属性,然后调用Send()方法。没有其他的。

+0

谢谢雷米。 [quote] TIdTCPClient.Connect()引发了这个异常。使用TIdSMTPRelay时,不应该手动调用它。它在确定为每个收件人域连接哪个主机后在内部调用。您只需设置DNSServer属性,可选择设置RelaySender属性,然后调用Send()方法。 [/ quote] 我正在运行'TidSMTPRelay'演示例子,我曾经假设我完成了所有这些工作,只要填写完所有字段并单击“发送”即可。我在这里错过了什么? – rossmcm 2011-12-21 19:29:00

+0

那么TIdSMTPRelay示例代码错了? – rossmcm 2011-12-21 21:33:43

+0

没错,只是老了。在'btnSendMailClick()'中,除去调用'Send()'的'Connect()'和'Disconnect()'两个调用,只调用'Send()'。您可以在异常处理程序中移除对“Connected()”和“Disconnect()”的调用,因为Send()在退出之前会在内部关闭套接字。除此之外,演示中的其他一切都很好。 – 2011-12-22 00:41:50

相关问题