我可以使用HTML5发送客户端邮件吗?

7

我希望能够在HTML5中发送电子邮件。我不想强制用户打开电子邮件客户端,我想直接从网页发送电子邮件。

顺便问一下,有没有办法用JavaScript实现这个功能?我知道可能不可能,只是想知道是否有任何巧妙的方法可以通过完全通过客户端来完成它。


5
如果可能的话,您的网络浏览器可能被用于发送垃圾邮件,这可能是恶意行为。 - dvhh
同意。浏览器厂商会不惜一切代价防止这种情况发生。 - Mark At Ramp51
我认为这是可能的。请看下面的帖子。它可能被恶意使用,但我不认为浏览器供应商一定能够阻止它。实际上,像谷歌这样的公司会因为试图使用这些技术来建立 SMTP 僵尸网络的网站而将其列为恶意软件黑名单。 - JTew
安全漏洞:如果你连接的SMTP服务器需要密码验证,则需要将该密码(及其对应的用户名)暴露给客户端。也就是说,你用户的Web浏览器可以看到这些信息。如果你的用户留意到并提取了你的密码,则他们可以使用你的SMTP服务器发送垃圾邮件,直到你重置密码。他们甚至可能使用密码和用户名更改服务器上的密码,将你锁在外面。编辑:除非你的SMTP服务器支持令牌,就像smtpjs.com所说的那样。 - user82216
6个回答

13

简而言之,不可以直接从客户端发送邮件(除非使用黑客技术)。

您可以通过向服务器发出ajax调用并发送电子邮件来完成此操作。

从客户端发送邮件而不使用邮件客户端的问题比较复杂。例如,大多数普通用户ISP都有自己的SMTP中继,所有25端口上的出站邮件都必须经过传输。您的网站将难以获得正确的信息来完成此操作。其次,Web浏览器不了解SMTP协议,XMLHttpRequest对象也不了解。

因此,如果您是黑客忍者,也许可以通过ActiveX、Java小程序或Flash等方式找到一些解决方案,但您基本上必须直接操作TCP套接字,并通过该套接字发出SMTP协议命令。

有很多需要克服的障碍,事实上我不知道如何做到这一点,但只要有意愿,就有办法。如果您找到了一个黑客技巧,不要感到惊讶,因为它可能会很快被主要的浏览器供应商修补。


你可能会在你的“忍者清单”中提到Adobe Reader。它有很多漏洞,我相信有人可以想出如何攻击客户端的电子邮件客户端... ;) - NotMe
感谢您关于握手的指导,我已经有一段时间没有看过Websockets了。 - JTew
1
没问题,这实际上是对我自己的一个警醒。在我阅读有关它们的内容之前,我也有同样的看法。 - Mark At Ramp51
我认为另一个非标准的可能性是使用Firefox的套接字功能以及https://github.com/brettz9/asyouwish/,允许JavaScript一路使用(尽管仅限于Firefox并要求用户安装附加组件)。 - Brett Zamir

8
是的,这是可能的。但并不实用。参见编辑2。
某些HTML5实现包括对Websockets的支持,本质上是与服务器的TCP连接。叠加一些发送/接收代码,您就可以构建一个SMTP客户端。
实际上,看起来nodejs和websocket支持已经被用于实现SMTP客户端...在这里看到... 为了使其正常工作,您仍需要像标准SMTP客户端一样拥有SMTP服务器、用户名、密码等。
使用此方法进行垃圾邮件发送的可能性很小,因为您的SMTP提供商可以轻松取消您的帐户。
=== 编辑 ===
实际上,您可以构建一个无服务器版本,它还必须实现名称服务器查找以查找MX记录。然而,任何体面的SMTP服务器都会维护垃圾邮件列表黑名单表,从随机IP地址连接会使电子邮件通常被标记为垃圾邮件。
此外,与需要安全邮件连接的SMTP服务器交谈可能会很困难。
正如其他人所提到的,这种实现存在恶意用途,比如发送垃圾邮件。我想这是可能的,您可能已经知道大部分内容 :)
=== 编辑2 ===
如Mark At Ramp51所述,WebSocket需要进行握手操作。这是我之前不知道的内容。如果要绕过握手操作,你需要修改WebSocket的实现方式。
正确的做法是让Web服务器转发电子邮件。

1
如果协议不需要WebSocket握手,我会倾向于同意您的观点。如果您查看本文http://en.wikipedia.org/wiki/WebSockets顶部的协议握手,当前的SMTP协议不支持此功能,因此您将依赖于连接到的SMTP服务器,以某种方式被封装为可以满足此握手的内容。此外,所有计划支持它的浏览器都由于安全问题而放弃了支持。简而言之,WebSocket和tcp套接字并不相等。 - Mark At Ramp51
1
你无法构建一个无服务器版本,因为大多数ISP会阻止25号端口。 - SLaks
3
不要浪费时间。你所想出的任何解决方案都会被浏览器厂商封堵,你只能另寻他法来规避这个系统。如果工作太难了,那么你可能使用了错误的工具,应该找到正确的工具。 - Mark At Ramp51
1
不要误会,我同意,你应该使用适合工作的正确工具。基于服务器的电子邮件发送方式要容易得多。 - JTew
1
哇……他把我标记为正确的,你也标记为正确的。我想我不应该再感到惊讶了。 - Mark At Ramp51
显示剩余8条评论

2

这是不可能的。

相反,您应该使用AJAX在服务器上发送电子邮件。


1

1

从Javascript直接发送电子邮件

来自官方资源:

它是如何工作的?

  1. 连接您的电子邮件服务 选择各种电子邮件服务。我们支持事务性电子邮件服务(Mailgun、Mailjet、Mandrill、SendGrid、Amazon SES和Postmark)和个人电子邮件服务(AOL、Gmail、FastMail、iCloud、Mail.ru、Outlook、Yahoo、Yandex和Zoho)。

  2. 创建电子邮件模板 从我们的模板设计列表中选择,或轻松构建自己的模板。 模板是参数化的,因此您可以通过Javascript进一步自定义它们。

  3. 使用我们的Javascript API发送电子邮件 添加我们的Javscript SDK,开始发送电子邮件!

这是一个典型的调用示例:

var service_id = 'my_mandrill';
var template_id = 'feedback';
var template_params = {
  name: 'John',
  reply_email: 'john@doe.com',
  message: 'This is awesome!'
};

emailjs.send(service_id,template_id,template_params);

所有现有的API都需要使用密钥,显然你不想在前端代码中分享。指定的服务通过允许仅发送预定义模板来克服此问题,因此对于“与朋友分享”功能,您将创建一个名为“share”的模板。


1
“来自官方资源” - 这里的“官方”一词似乎意味着某种网络标准机构。你在这里所做的是使用第三方服务,他们将会(以交换你SMTP服务器的密码为代价 - 除此之外没有其他,那么对于他们来说除了收集有关你和你的访问者的电子邮件地址和其他营销信息之外还有什么好处?)- 如果你向他们发出Ajax请求,他们将会发送电子邮件。这实际上是Mark At Ramp51给出的相同答案,但推荐了一个第三方服务。 - Quentin

0

你无法仅通过客户端代码完成它。

你可以通过服务器回调、AJAX来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接