使用 Javascript 发送电子邮件

Sending emails with Javascript

提问人:nickf 提问时间:11/7/2008 最后编辑:nickf 更新时间:1/13/2021 访问量:406827

问:

这有点难以解释,所以请耐心等待......

我想建立一个系统,用户可以通过我的网站发送模板化电子邮件,但它实际上不是使用我的服务器发送的 - 它只是打开他们自己的本地邮件客户端,并准备好电子邮件。该应用程序将使用预定义的变量填充电子邮件的正文,以节省用户自己输入的时间。然后,他们可以根据需要编辑消息,如果它不完全符合他们的目的。

我希望它通过用户的本地邮件客户端进行传输的原因有很多,因此让服务器发送电子邮件不是一种选择:它必须是 100% 的客户端。

我已经运行了一个大部分工作的解决方案,我将发布它的详细信息作为答案,我想知道是否有更好的方法?

JavaScript 电子邮件 客户端

评论

1赞 Vincent Robert 11/9/2008
stackoverflow.com/questions/7592/......

答:

153赞 nickf 11/7/2008 #1

我现在的做法基本上是这样的:

The HTML:

<textarea id="myText">
    Lorem ipsum...
</textarea>
<button onclick="sendMail(); return false">Send</button>

The Javascript:

function sendMail() {
    var link = "mailto:[email protected]"
             + "[email protected]"
             + "&subject=" + encodeURIComponent("This is my subject")
             + "&body=" + encodeURIComponent(document.getElementById('myText').value)
    ;
    
    window.location.href = link;
}

令人惊讶的是,这效果很好。唯一的问题是,如果正文特别长(超过 2000 个字符),那么它只会打开一封新电子邮件,但其中没有任何信息。我怀疑这与超出 URL 的最大长度有关。

评论

1赞 Ryan Doherty 11/7/2008
这是一种非常迂回的方法,当您只需将 href 属性设置为相同的内容而不是使用 javascript 时。
1赞 Gordon Bell 11/7/2008
如果您想在电子邮件中包含文本区域的内容,则不要迂回。也是从垃圾邮件收集器中隐藏电子邮件的好方法。
1赞 alex 11/7/2008
@Gordon - 假设电子邮件收集器不正则表达式内联 JavaScript 或遵循 <script src=“”>
7赞 bobince 11/9/2008
优先使用 encodeURIComponent 进行转义,它遵循与 URL 编码不同的任意规则。尽管 Unicode 字符仍然可能失败......但无论如何,整个事情很可能会失败。带有参数的 mailto 链接非常不可靠,不应该真正使用。
5赞 nickf 11/10/2008
bobince:是的,我认为这是一种狡猾的方法,但有什么选择呢?
3赞 tvanfosson 11/7/2008 #2

如果这只是打开用户的客户端来发送电子邮件,为什么不让他们也在那里撰写它。你失去了跟踪他们发送的内容的能力,但如果这不重要,那么只需收集地址和主题,然后弹出客户端,让用户填写正文。

评论

2赞 nickf 11/7/2008
我的想法是,我的应用程序为他们填补了正文。我会编辑问题以使其更清楚......
2赞 tvanfosson 11/7/2008
但是,当您只是要打开一个电子邮件客户端来发送邮件时,为什么要编写一个电子邮件客户端呢?
2赞 nickf 11/7/2008
它不是电子邮件客户端,它只是我网站上的一个页面,用于预填充电子邮件。
15赞 Ryan Doherty 11/7/2008 #3

你不需要任何 javascript,你只需要像这样编码你的 href:

<a href="mailto:[email protected]">email me here!</a>

评论

1赞 tvanfosson 11/7/2008
我想我期望真正的代码动态填充地址。
0赞 Micteu 7/28/2015
@tvanfosson 如果在单击锚点元素时页面上已知电子邮件地址,则可以尝试为锚点提供 ID 并在选择地址时设置其值。如果在点击发生时需要发布来获取电子邮件地址,这可能不起作用。href
0赞 GorvGoyl 4/1/2022
在 Mac 上:也是必需的target="_blank"
5赞 alex 11/7/2008 #4

在文本框上进行实时验证,一旦超过 2000(或任何最大阈值),然后显示“此电子邮件太长,无法在浏览器中完成,请<span class="launchEmailClientLink">launch what you have in your email client</span>'

我会的

.launchEmailClientLink {
cursor: pointer;
color: #00F;
}

并将其查询到您的 onDomReady 中

$('.launchEmailClientLink').bind('click',sendMail);
20赞 Reignier Julien 2/21/2012 #5

这是使用jQuery和“元素”单击的方法:

$('#element').click(function(){
    $(location).attr('href', 'mailto:?subject='
                             + encodeURIComponent("This is my subject")
                             + "&body=" 
                             + encodeURIComponent("This is my body")
    );
});

然后,您可以通过从输入字段(即使用或通过带有 .玩得愉快$('#input1').val()$.get('...')

评论

1赞 Suncat2000 2/16/2019
这仍然受到 URL 大小限制,正如 OP 所提到的。
0赞 Vikas Ukani 3/20/2021
我只想知道,当我们点击发送按钮时需要时间吗?
2赞 Fabrice NEYRET 9/23/2015 #6

这个想法的问题在于,用户必须有一个电子邮件客户端,如果他依赖网络邮件,情况就不是这样了,许多用户都是这种情况。(至少当我十几年前调查这个问题时,没有转机重定向到这个网络邮件)。

这就是为什么正常的解决方案是依靠 php mail() 来发送电子邮件(然后是服务器端)。

但是,如果现在“电子邮件客户端”总是自动设置为网络邮件客户端,我会很高兴知道。

评论

2赞 nickf 8/12/2020
> “但是,如果现在的”电子邮件客户端“总是自动设置为网络邮件客户端,我会很高兴知道的。现代浏览器支持此功能,例如:support.google.com/a/users/answer/9308783?hl=en
1赞 Vitaly Zdanevich 10/9/2015 #7

mandrillapp.com 发送请求:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4 && xhttp.status == 200) {
        console.log(xhttp.responseText);
    }
}
xhttp.open('GET', 'https://mandrillapp.com/api/1.0/messages/send.json?message[from_email][email protected]&message[to][0][email][email protected]&message[subject]=Заявка%20с%207995.by&message[html]=xxxxxx&key=oxddROOvCpKCp6InvVDqiGw', true);
xhttp.send();

评论

0赞 Alexey Shevelyov 10/22/2019
为什么是 GET 而不是 POST?如果消息足够大,它将在某个时候被截断。
5赞 julianm 1/22/2018 #8

您可以使用此免费服务:https://www.smtpjs.com

  1. 包括脚本:

<script src="https://smtpjs.com/v2/smtp.js"></script>

  1. 使用以下方式发送电子邮件:
Email.send(
  "[email protected]",
  "[email protected]",
  "This is a subject",
  "this is the body",
  "smtp.yourisp.com",
  "username",
  "password"
);

评论

4赞 jcarlosweb 11/26/2018
有了这个,您可以公开SMTP服务器的数据,最好在服务器端使用Node或PHP进行,同样感谢
0赞 julianm 5/7/2020
您是否尝试过“在此处设置SMTP服务器”按钮?您可以在答案中共享的链接中找到它。
1赞 jvel07 1/13/2021 #9

您可以将以下内容添加到 HTML 文件中:<head>

<script src="https://smtpjs.com/v3/smtp.js"></script>

<script type="text/javascript">
    function sendEmail() {
        Email.send({
            SecureToken: "security token of your smtp",
            To: "[email protected]",
            From: "[email protected]",
            Subject: "Subject...",
            Body: document.getElementById('text').value
        }).then( 
            message => alert("mail sent successfully")
        );
    }
</script>

下面是 HMTL 部分:

<textarea id="text">write text here...</textarea>
<input type="button" value="Send Email" onclick="sendEmail()">

因此,sendEmail() 函数使用以下命令获取输入:

document.getElementById('id_of_the_element').value

例如,您可以添加另一个 HTML 元素,例如主题(使用 id=“subject”):

<textarea id="subject">write text here...</textarea>

并在 sendEmail() 函数中获取其值:

主题:document.getElementById('subject').value

大功告成!

注意:如果您没有SMTP服务器,可以在此处免费创建一个。然后在此处加密您的 SMTP 凭据(sendEmail() 中的 SecureToken 属性对应于此处生成的加密凭据)。