我将从可能的解决方案开始,然后解释为什么其他替代方案在最好的情况下都存在问题:
可能的解决方案:
1. 不要从客户端计算机发送电子邮件,使用 Web 服务传递消息。无论您的网站使用什么技术,它都可以处理已发布的表单并发送电子邮件。只需将用户的问题 POST 到您的 Web 服务,让您的 Web 服务使用电子邮件将其发送给您或将其保存到数据库中。如果用户认为他已连接到互联网,他可能会这样说,因为他的浏览器工作了,但是这仅表示 HTTP 正常工作:SMTP 可能被公司防火墙或 ISP 阻止。这是我首选的解决方案。
2. 使用您的 SMTP 服务器和凭据发送电子邮件。从用户地址发送电子邮件非常不可靠。您可以在“回复”头中包含用户的电子邮件地址,或者简单地将其放在消息正文中。您可以使用 Indy 组件来执行此操作,因为这是您的 SMTP 服务器和凭据,您知道所有细节。如前面所述,这可能会失败,因为用户的防火墙或 ISP 的防火墙可能会阻止 SMTP。
关于 SMTP:
首先,对 SMTP 协议本身进行一些介绍,因为其他所有内容都基于此:
1. SMTP 是发送电子邮件的协议。有其他特定于实现的协议,但所有电子邮件服务器都需要实现 SMTP。
2. SMTP 设计之前没有垃圾邮件。它允许任何计算机将电子邮件发送到任何服务器。理论上不需要任何身份验证即可发送电子邮件消息,并且服务器的 SMTP 服务器地址存储在 DNS 中作为 MX 记录。
3. SMTP 本身没有包括验证发件人的方法,也没有尝试检查用户是否真的是“发件人”字段中的那个人。
从用户的电子邮件地址发送电子邮件存在什么问题:
从用户地址发送电子邮件的第一个选项是使用本地安装的客户端和自动化,因此他们会看到一个填好的 Outlook(或 Firefox 或其他)电子邮件表单,只需点击“发送”即可。但是你说你希望你的解决方案即使在没有本地电子邮件安装的情况下也能工作,所以这不是一个选项。
您提到希望通过仅询问用户的电子邮件地址(没有服务器详细信息,我假设没有用户名和密码)来实现此目标。SMTP 协议实际上允许这样做,因为它没有内置机制来验证发件人。垃圾邮件发送者利用了这一点,称之为“欺骗发件人地址”。为了防止这种情况发生,发生了两件事:
- SMTP主机不再接受来自任何人的电子邮件,它们会尝试对发送SMTP服务器进行身份验证。换句话说,您的 SMTP服务器将拒绝您发送给自己的伪造电子邮件!解决此问题的方法是使用SMTP中继。但是...
- SMTP中继不再中继来自未知用户的电子邮件!SMTP本身并不提供任何身份验证机制,但通常的解决方法是先阅读电子邮件(因为该部分需要身份验证),然后再发送电子邮件。这由您可能正在使用的发送SMTP组件自动完成,但无论如何,这都需要用户名和密码。
如果这还不够,请换一种思路考虑:您是否希望任何知道您的电子邮件地址的人都能够使用您的电子邮件地址发送电子邮件?