如何从 JavaScript 发送电子邮件

How to send an email from JavaScript

提问人:user906357 提问时间:9/12/2011 最后编辑:Francisco Corrales Moralesuser906357 更新时间:1/11/2023 访问量:1137513

问:

我希望我的网站能够在不刷新页面的情况下发送电子邮件。所以我想使用 Javascript。

<form action="javascript:sendMail();" name="pmForm" id="pmForm" method="post">
Enter Friend's Email:
<input name="pmSubject" id="pmSubject" type="text" maxlength="64" style="width:98%;" />
<input name="pmSubmit" type="submit" value="Invite" />

这是我想调用该函数的方式,但我不确定将什么放入 javascript 函数中。从我所做的研究中,我发现了一个使用 mailto 方法的示例,但我的理解是它实际上并不直接从站点发送。

所以我的问题是在哪里可以找到在 JavaScript 函数中放置的内容,以直接从网站发送电子邮件。

function sendMail() {
    /* ...code here...    */
}
JavaScript 电子邮件

评论

10赞 Shadow Wizard Is Sad And Angry 9/12/2011
使用服务器端语言实际发送电子邮件,并使用 AJAX 获得所需的外观和感觉。
4赞 PatrickMelia 11/17/2013
这可能有点晚了,但这可能会对您有所帮助:stackoverflow.com/questions/271171/...
3赞 Dennis S 8/10/2016
Gmail 用户可以拥有它,请参阅 developers.google.com/gmail/api
1赞 Sasha 12/28/2017
如下所述,您可能还想看看 EmailJS,它允许直接从 Javascript 使用预构建的模板发送电子邮件,并且还支持动态参数、附件、验证码、REST API 等。我们还提供免费套餐以开始 [披露 - 我是创建者之一]
1赞 dsbajna 4/29/2020
请注意,如果您使用接受的答案,电子邮件将来自用户的帐户。要从您的个人或企业帐户发送电子邮件,正确的方法是使用 javascript 通过您自己的服务器或第三方服务(如 Byteline)发送电子邮件。更多细节在下面的答案中。

答:

392赞 Arnaud Le Blanc 9/12/2011 #1

您不能直接使用 javascript 发送电子邮件。

但是,您可以打开用户的邮件客户端:

window.open('mailto:[email protected]');

还有一些参数可以预填充主体和正文:

window.open('mailto:[email protected]?subject=subject&body=body');

另一种解决方案是对服务器进行ajax调用,以便服务器发送电子邮件。请注意不要让任何人通过您的服务器发送任何电子邮件。

评论

3赞 user2284570 11/10/2013
如果打开页面的程序已经具有电子邮件客户端功能..(如 Opera 12.50),然后,它将链接作为常规 URL 打开。他们也是Thunderbird,它有firefox壁虎引擎:它可以从电子邮件中的超链接打开网页作为新标签。
14赞 igneosaur 11/19/2014
请注意,您还可以使用(如此答案:stackoverflow.com/questions/271171/...)打开电子邮件客户端,当用户完成电子邮件时,它不会留下该空窗口。window.location.href
2赞 lost_in_the_source 11/28/2014
是 和 变量,还是字段中的实际文本?subjectbody
4赞 Medet Tleukabiluly 7/2/2015
这个答案确实没有回答问题,但@rahulroy的答案很好
9赞 Pavel 11/22/2017
我会更进一步,混淆垃圾邮件机器人window.open( String( 'mailto:recipient^example.com' ).replace('^', '@') );
23赞 Shef 9/12/2011 #2

我向你透露这个消息。您不能使用 JavaScript 本身发送电子邮件。


根据 OP 问题的上下文,正如 @KennyEvitt 在评论中指出的那样,我上面的答案不再成立。看起来您可以将 JavaScript 用作 SMTP 客户端

但是,我还没有深入挖掘它是否足够安全且与跨浏览器兼容。所以,我既不能鼓励也不能劝阻你使用它。使用风险自负。

评论

1赞 Zebra 9/12/2011
可以用 AJAX 甚至隐藏的 iframe 来完成......你永远不知道
1赞 Shef 9/12/2011
@danialentzri:JavaScript 永远不会成为邮件中继,这就是我所说的“本身”的意思。
0赞 Zebra 9/12/2011
哎呀!我有一个小显示器告诉你真相,它不支持滚动条。
0赞 Shef 11/9/2014
@KennyEvitt,从我快速浏览来看,似乎您仍然需要邮件中继。这基本上就是我在回答中所说的。
0赞 Kenny Evitt 11/9/2014
@Shef 你快速浏览了什么?我找不到超出任何其他电子邮件客户端要求的任何要求。或者您声称,例如,Microsoft Outlook也无法发送电子邮件?这在技术上是正确的,但从任何意义上说,我都不希望其他人理解。
3赞 evilone 9/12/2011 #3

Javascript 是客户端的,您不能使用 Javascript 发送电子邮件。浏览器可能只能识别并启动您的默认邮件客户端。mailto:

评论

0赞 user906357 9/12/2011
这可以解释为什么我找不到任何关于它的信息。谢谢!!
0赞 user2284570 11/10/2013
同样的事情......未来可能允许原始连接到端口的 API 即将到来......
0赞 Dan Chase 12/3/2018
这是最准确的答案!所有其他听起来可能的答案都在某个地方使用后端。OP 只说 Javascript。意思是,请不要后端,即使它是SAAS后端。很好的答案。
5赞 Jeremy Huiskamp 9/12/2011 #4

在函数中,向后端添加一个 ajax 调用,您可以在服务器端实现此调用。sendMail()

26赞 Ry- 9/12/2011 #5

您可以在这篇文章中找到要放入 JavaScript 函数的内容。

function getAjax() {
    try {
        if (window.XMLHttpRequest) {
            return new XMLHttpRequest();
        } else if (window.ActiveXObject) {
            try {
                return new ActiveXObject('Msxml2.XMLHTTP');
            } catch (try_again) {
                return new ActiveXObject('Microsoft.XMLHTTP');
            }
        }
    } catch (fail) {
        return null;
    }
}

function sendMail(to, subject) {
     var rq = getAjax();

     if (rq) {
         // Success; attempt to use an Ajax request to a PHP script to send the e-mail
         try {
             rq.open('GET', 'sendmail.php?to=' + encodeURIComponent(to) + '&subject=' + encodeURIComponent(subject) + '&d=' + new Date().getTime().toString(), true);

             rq.onreadystatechange = function () {
                 if (this.readyState === 4) {
                     if (this.status >= 400) {
                         // The request failed; fall back to e-mail client
                         window.open('mailto:' + to + '?subject=' + encodeURIComponent(subject));
                     }
                 }
             };

             rq.send(null);
         } catch (fail) {
             // Failed to open the request; fall back to e-mail client
             window.open('mailto:' + to + '?subject=' + encodeURIComponent(subject));
         }
     } else {
         // Failed to create the request; fall back to e-mail client
         window.open('mailto:' + to + '?subject=' + encodeURIComponent(subject));
     }
}

提供您自己的 PHP(或任何语言)脚本来发送电子邮件。

3赞 David 9/12/2011 #6

JavaScript 无法从 Web 浏览器发送电子邮件。但是,从已尝试实现的解决方案退后一步,可以执行满足原始要求的操作:

在不刷新页面的情况下发送电子邮件

您可以使用 JavaScript 构造电子邮件所需的值,然后向实际发送电子邮件的服务器资源发出 AJAX 请求。(我不知道您正在使用什么服务器端语言/技术,因此这部分取决于您。

如果您不熟悉 AJAX,快速的 Google 搜索会为您提供大量信息。通常,您可以使用 jQuery 的 $.ajax() 函数快速启动并运行它。您只需要在服务器上有一个可以在请求中调用的页面。

108赞 rahulroy9202 1/10/2014 #7

通过您的服务器间接 - 调用第三方 API - 安全且推荐


您的服务器可以调用第三方 API。API 密钥不会向客户端公开。

节点 .js

const axios = require('axios');

async function sendEmail(name, email, subject, message) {
  const data = JSON.stringify({
    "Messages": [{
      "From": {"Email": "<YOUR EMAIL>", "Name": "<YOUR NAME>"},
      "To": [{"Email": email, "Name": name}],
      "Subject": subject,
      "TextPart": message
    }]
  });

  const config = {
    method: 'post',
    url: 'https://api.mailjet.com/v3.1/send',
    data: data,
    headers: {'Content-Type': 'application/json'},
    auth: {username: '<API Key>', password: '<Secret Key>'},
  };

  return axios(config)
    .then(function (response) {
      console.log(JSON.stringify(response.data));
    })
    .catch(function (error) {
      console.log(error);
    });

}

// define your own email api which points to your server.
app.post('/api/sendemail/', function (req, res) {
  const {name, email, subject, message} = req.body;
  //implement your spam protection or checks.
  sendEmail(name, email, subject, message);
});

然后在客户端使用 fetch 调用您的电子邮件 API。 用于在Mailjet上注册的用途。您也可以验证更多地址。Mailjet 提供慷慨的免费套餐from email


2023 年更新:正如评论中指出的那样,由于 CORS 的原因,以下方法不再有效

仅当您要测试发送电子邮件并执行此操作时,这才有用

直接从客户端 - 调用第三方 API - 不推荐


总之:

  1. 注册 Mailjet 以获取 API 密钥和密钥
  2. 使用 fetch 调用 API 发送电子邮件

喜欢这个-

function sendMail(name, email, subject, message) {
  const myHeaders = new Headers();
  myHeaders.append("Content-Type", "application/json");
  myHeaders.set('Authorization', 'Basic ' + btoa('<API Key>'+":" +'<Secret Key>'));

  const data = JSON.stringify({
    "Messages": [{
      "From": {"Email": "<YOUR EMAIL>", "Name": "<YOUR NAME>"},
      "To": [{"Email": email, "Name": name}],
      "Subject": subject,
      "TextPart": message
    }]
  });

  const requestOptions = {
    method: 'POST',
    headers: myHeaders,
    body: data,
  };

  fetch("https://api.mailjet.com/v3.1/send", requestOptions)
    .then(response => response.text())
    .then(result => console.log(result))
    .catch(error => console.log('error', error));
}

sendMail('Test Name',"<YOUR EMAIL>",'Test Subject','Test Message')

注意:请记住,您的 API 密钥对任何人都可见,因此任何恶意用户都可能使用您的密钥发送可能占用您的配额的电子邮件。

评论

12赞 cantdutchthis 1/28/2014
尽管文章确实这么说,但我觉得这里也应该说,即使这可以工作,也存在一些安全问题,因为您还需要将 API 密钥发送到客户端。这可能会被滥用。
1赞 Professor of programming 1/7/2023
由于 CORS 的原因,这将不再起作用
0赞 P. BANERJEE 7/13/2014 #8

简短的回答是,你不能单独使用 JavaScript 来做到这一点。您需要一个服务器端处理程序来与 SMTP 服务器连接以实际发送邮件。网上有许多简单的邮件脚本,例如PHP的脚本:

使用 Ajax 向 PHP 脚本发送请求,使用 js 检查必填字段是否为空或不正确,并保留谁从您的服务器发送的邮件的记录。

function sendMail() is good for doing that.

检查从脚本发送邮件时是否发现任何错误,并采取适当的措施。 例如,如果邮件地址不正确或由于服务器问题而未发送邮件,或者在这种情况下处于队列中,请立即将其报告给用户,并防止一次又一次地多次发送相同的电子邮件。
使用 jQuery GET 和 POST 从脚本中获取响应

$.get(URL,回调); $.post(URL,回调);

0赞 Sercan Ozdemir 10/9/2014 #9

由于这些都是很棒的信息,所以有一个名为 Mandrill 的小 API 可以从 javascript 发送邮件,并且它运行良好。你可以试一试。这里有一个小教程作为开始。

2赞 Kenny Evitt 11/9/2014 #10

似乎一个“答案”是实现 SMPT 客户端。请参阅 email.js 了解具有 SMTP 客户端的 JavaScript 库。

下面是 SMTP 客户端的 GitHub 存储库。根据 repo 的 README,似乎可能需要各种填充码或 polyfill,具体取决于客户端浏览器,但总的来说,它确实似乎是可行的(如果不是实际上显着完成的话),而不是以一种很容易描述的方式,即使是一个合理的长答案在这里。

14赞 Christiaan Westerbeek 5/19/2015 #11

似乎有一个新的解决方案即将到来。它被称为 EmailJS。他们声称不需要服务器代码。您可以请求邀请。

2016 年 8 月更新:EmailJS 似乎已经上线。您每月最多可以免费发送 200 封电子邮件,并且它提供更高数量的订阅。

评论

0赞 Skarsnik 3/2/2016
这有点笨拙,非常漂亮的用户界面,但包含所有文档示例或帮助。避免。
0赞 Maged Saeed 4/5/2018
我尝试了emailJS,但它只发送到我的电子邮件。如何发送到任何其他电子邮件?
4赞 abagh0703 2/17/2019
这已经很晚了,但@MagedSaeed在电子邮件模板部分,编辑模板时,您可以指定“收件人”电子邮件。您甚至可以使用其模板选项使“收件人”字段动态化。他们的文档在详细说明方面做得很好。
1赞 digiwand 9/1/2021
刚刚将 EmailJS 集成到我的 React 应用程序中。它效果很好,安装起来非常顺利。电子邮件直接发送到我想要的电子邮件。确保添加 reCAPTCHA。谢谢你!
2赞 Santhosh Menon 5/20/2015 #12

有组合服务。您可以将上面列出的解决方案(如 mandrill)与 EmailJS 服务相结合,这可以使系统更加安全。 不过,他们还没有启动这项服务。

7赞 greyhound 6/11/2015 #13

window.open('mailto:[email protected]');同上 没有采取任何措施来隐藏“[email protected]”电子邮件地址不被垃圾邮件插件收集。我以前经常遇到这个问题。

var recipient="test";
var at = String.fromCharCode(64);
var dotcom="example.com";
var mail="mailto:";
window.open(mail+recipient+at+dotcom);
2赞 Fiach Reid 9/30/2015 #14

从 JavaScript 发送电子邮件的另一种方法是使用 directtomx.com,如下所示;

 Email = {
 Send : function (to,from,subject,body,apikey)
    {
        if (apikey == undefined)
        {
            apikey = Email.apikey;
        }
        var nocache= Math.floor((Math.random() * 1000000) + 1);
        var strUrl = "http://directtomx.azurewebsites.net/mx.asmx/Send?";
        strUrl += "apikey=" + apikey;
        strUrl += "&from=" + from;
        strUrl += "&to=" + to;
        strUrl += "&subject=" + encodeURIComponent(subject);
        strUrl += "&body=" + encodeURIComponent(body);
        strUrl += "&cachebuster=" + nocache;
        Email.addScript(strUrl);
    },
    apikey : "",
    addScript : function(src){
            var s = document.createElement( 'link' );
            s.setAttribute( 'rel', 'stylesheet' );
            s.setAttribute( 'type', 'text/xml' );
            s.setAttribute( 'href', src);
            document.body.appendChild( s );
    }
};

然后从您的页面调用它,如下所示;

 window.onload = function(){
    Email.apikey = "-- Your api key ---";
    Email.Send("[email protected]","[email protected]","Sent","Worked!");
 }

评论

0赞 Fiach Reid 2/3/2016
除此之外,假设您可以访问 SMTP 服务器,另一种方法是在 smtpjs.com/smtp.js 使用此脚本,如下所示;Email.send(“[email protected]”, “[email protected]”, “主题”, “正文”, “smtp.yourisp.com”, “用户名”, “密码”);- 见 smtpjs.com
1赞 Alejandro Corredor 1/17/2017
您可以使用 SMTP .js 发送 HTML 吗?
0赞 Fiach Reid 8/23/2019
@AlejandroCorredor - 是的,您可以通过 SMTPJS 发送 HTML 电子邮件
0赞 Tiago Rangel 2/13/2022
Directtomx.com的域名待售
-6赞 Anil Rathod 2/5/2016 #15

使用 JavaScript 或 jQuery 发送电子邮件

var ConvertedFileStream;
var g_recipient;
var g_subject;
var g_body;
var g_attachmentname;


function SendMailItem(p_recipient, p_subject, p_body, p_file, p_attachmentname, progressSymbol) {

    // Email address of the recipient 
    g_recipient = p_recipient;

   // Subject line of an email
    g_subject = p_subject;

   // Body description of an email
    g_body = p_body;

    // attachments of an email
    g_attachmentname = p_attachmentname;

    SendC360Email(g_recipient, g_subject, g_body, g_attachmentname);

}

function SendC360Email(g_recipient, g_subject, g_body, g_attachmentname) {
    var flag = confirm('Would you like continue with email');
    if (flag == true) {

        try {
            //p_file = g_attachmentname;
            //var FileExtension = p_file.substring(p_file.lastIndexOf(".") + 1);
           // FileExtension = FileExtension.toUpperCase();
            //alert(FileExtension);
            SendMailHere = true;

            //if (FileExtension != "PDF") {

            //    if (confirm('Convert to PDF?')) {
            //        SendMailHere = false;                    
            //    }

            //}
            if (SendMailHere) {
                var objO = new ActiveXObject('Outlook.Application');

                var objNS = objO.GetNameSpace('MAPI');

                var mItm = objO.CreateItem(0);

                if (g_recipient.length > 0) {
                    mItm.To = g_recipient;
                }

                mItm.Subject = g_subject;

                // if there is only one attachment                 
                // p_file = g_attachmentname;
                // mAts.add(p_file, 1, g_body.length + 1, g_attachmentname);

                // If there are multiple attachment files
                //Split the  files names
                var arrFileName = g_attachmentname.split(";");
                 // alert(g_attachmentname);
                //alert(arrFileName.length);
                var mAts = mItm.Attachments;

                for (var i = 0; i < arrFileName.length; i++)
                {
                    //alert(arrFileName[i]);
                    p_file = arrFileName[i];
                    if (p_file.length > 0)
                    {                     
                        //mAts.add(p_file, 1, g_body.length + 1, g_attachmentname);
                        mAts.add(p_file, i, g_body.length + 1, p_file);

                    }
                }

                mItm.Display();

                mItm.Body = g_body;

                mItm.GetInspector.WindowState = 2;

            }
            //hideProgressDiv();

        } catch (e) {
            //debugger;
            //hideProgressDiv();
            alert('Unable to send email.  Please check the following: \n' +
                    '1. Microsoft Outlook is installed.\n' +
                    '2. In IE the SharePoint Site is trusted.\n' +
                    '3. In IE the setting for Initialize and Script ActiveX controls not marked as safe is Enabled in the Trusted zone.');
        }
    }
  }

评论

4赞 JAL 2/5/2016
请详细说明此代码如何回答问题。
1赞 Chic 2/23/2016
看起来这是使用 ActiveX,并且只能在安装了 Outlook 的 PC 上的 IE 中工作var objO = new ActiveXObject('Outlook.Application');
0赞 BarryCap 6/26/2021
我认为这是相当“黄金”的。不管这意味着什么。
60赞 user949286 4/16/2016 #16

我找不到一个真正满足原始问题的答案。

  • Mandrill 是不可取的,因为它的新定价政策,而且如果你想保证你的凭据安全,它需要后端服务。
  • 通常最好隐藏您的电子邮件,这样您就不会出现在任何列表中(mailto 解决方案暴露了此问题,并且对大多数用户来说并不方便)。
  • 设置 sendMail 或根本不需要后端来发送电子邮件很麻烦。

我提供了一个简单的免费服务,允许您发出标准的HTTP POST请求来发送电子邮件。它被称为 PostMail,您可以简单地发布表单,使用 JavaScript 或 jQuery。当您注册时,它会为您提供代码,您可以将其复制并粘贴到您的网站中。以下是一些示例:

JavaScript的:

<form id="javascript_form">
    <input type="text" name="subject" placeholder="Subject" />
    <textarea name="text" placeholder="Message"></textarea>
    <input type="submit" id="js_send" value="Send" />
</form>

<script>

    //update this with your js_form selector
    var form_id_js = "javascript_form";

    var data_js = {
        "access_token": "{your access token}" // sent after you sign up
    };

    function js_onSuccess() {
        // remove this to avoid redirect
        window.location = window.location.pathname + "?message=Email+Successfully+Sent%21&isError=0";
    }

    function js_onError(error) {
        // remove this to avoid redirect
        window.location = window.location.pathname + "?message=Email+could+not+be+sent.&isError=1";
    }

    var sendButton = document.getElementById("js_send");

    function js_send() {
        sendButton.value='Sending…';
        sendButton.disabled=true;
        var request = new XMLHttpRequest();
        request.onreadystatechange = function() {
            if (request.readyState == 4 && request.status == 200) {
                js_onSuccess();
            } else
            if(request.readyState == 4) {
                js_onError(request.response);
            }
        };

        var subject = document.querySelector("#" + form_id_js + " [name='subject']").value;
        var message = document.querySelector("#" + form_id_js + " [name='text']").value;
        data_js['subject'] = subject;
        data_js['text'] = message;
        var params = toParams(data_js);

        request.open("POST", "https://postmail.invotes.com/send", true);
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

        request.send(params);

        return false;
    }

    sendButton.onclick = js_send;

    function toParams(data_js) {
        var form_data = [];
        for ( var key in data_js ) {
            form_data.push(encodeURIComponent(key) + "=" + encodeURIComponent(data_js[key]));
        }

        return form_data.join("&");
    }

    var js_form = document.getElementById(form_id_js);
    js_form.addEventListener("submit", function (e) {
        e.preventDefault();
    });
</script>

j查询:

<form id="jquery_form">
    <input type="text" name="subject" placeholder="Subject" />
    <textarea name="text" placeholder="Message" ></textarea>
    <input type="submit" name="send" value="Send" />
</form>

<script>

    //update this with your $form selector
    var form_id = "jquery_form";

    var data = {
        "access_token": "{your access token}" // sent after you sign up
    };

    function onSuccess() {
        // remove this to avoid redirect
        window.location = window.location.pathname + "?message=Email+Successfully+Sent%21&isError=0";
    }

    function onError(error) {
        // remove this to avoid redirect
        window.location = window.location.pathname + "?message=Email+could+not+be+sent.&isError=1";
    }

    var sendButton = $("#" + form_id + " [name='send']");

    function send() {
        sendButton.val('Sending…');
        sendButton.prop('disabled',true);

        var subject = $("#" + form_id + " [name='subject']").val();
        var message = $("#" + form_id + " [name='text']").val();
        data['subject'] = subject;
        data['text'] = message;

        $.post('https://postmail.invotes.com/send',
            data,
            onSuccess
        ).fail(onError);

        return false;
    }

    sendButton.on('click', send);

    var $form = $("#" + form_id);
    $form.submit(function( event ) {
        event.preventDefault();
    });
</script>

同样,在充分披露的情况下,我创建了这项服务,因为我找不到合适的答案。

评论

2赞 stallingOne 1/25/2017
这是最好的解决方案。谢谢。Mandrill 不再有免费计划,mailgun 不支持 cors 和 JavaScript
10赞 Greg Ennis 3/1/2017
这不是和其他人有同样的问题吗?访问令牌 (API 密钥) 已公开
3赞 Archi 3/7/2017
他们每天限制 25 封电子邮件。
1赞 user949286 6/26/2021
现在应该备份了。对不起!
1赞 Professor of programming 1/7/2023
您能否在您的网站上添加一个隐私政策,以说明信息到达您的服务器后会发生什么?GDPR 需要它。谢谢。
1赞 Suhail Mumtaz Awan 7/16/2016 #17

当且仅当我必须使用 js 库时,我才会使用 SMTPJ 库来做到这一点。它为您的凭据(例如用户名,密码等)提供加密。some

评论

3赞 Quentin 1/16/2018
我真的不愿意把我的SMTP密码给一个小公司,这样他们就可以使用我的服务器发送电子邮件,以换取我的密码。我不付钱给他们。他们没有强烈的动机来保持服务的运行/真正保护我的凭据/不使用我的服务器来发送垃圾邮件。
0赞 Suhail Mumtaz Awan 4/13/2018
@Quentin我明白了,但这个库可以回答这个问题。
2赞 Alireza 4/26/2017 #18

您的问题没有直接的答案,因为我们不能仅使用 javascript 发送电子邮件,但有一些方法可以使用 javascript 为我们发送电子邮件:

1)使用API通过JavaScript调用API为我们发送电子邮件,例如 https://www.emailjs.com 说您可以使用下面的代码在进行某些设置后调用他们的API:

var service_id = 'my_mandrill';
var template_id = 'feedback';
var template_params = {
name: 'John',
reply_email: '[email protected]',
message: 'This is awesome!'
};

emailjs.send(service_id,template_id,template_params);

2)创建一个后端代码为你发送邮件,你可以使用任何后端框架为你做。

3) 使用类似的东西:

window.open('mailto:me@http://stackoverflow.com/');

这将打开您的电子邮件应用程序,这可能会进入浏览器中的阻止弹出窗口。

一般来说,发送电子邮件是一项服务器任务,因此应该使用后端语言完成,但是我们可以使用 javascript 收集所需的数据并将其发送到服务器或 api,我们也可以使用第三个奇偶校验应用程序并使用 javascript 通过浏览器打开它们,如上所述。

评论

6赞 Quentin 1/16/2018
回复(1):我真的不愿意将我的SMTP密码提供给一家小公司,这样他们就可以使用我的服务器发送电子邮件,以换取我的密码。我不付钱给他们。他们没有强烈的动机来保持服务的运行/真正保护我的凭据/不使用我的服务器来发送垃圾邮件。
43赞 Pissu Pusa 2/2/2019 #19

我知道我为这个问题写答案为时已晚,但尽管如此,我认为这将用于任何正在考虑通过 javascript 发送电子邮件的人。

我建议的第一种方法是在服务器上使用回调来执行此操作。如果你真的想用javascript来处理它,我建议这样做。

我发现最简单的方法是使用 smtpJs。一个可用于发送电子邮件的免费库。

1.包含如下脚本

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

2. 您可以像这样发送电子邮件

Email.send({
    Host : "smtp.yourisp.com",
    Username : "username",
    Password : "password",
    To : '[email protected]',
    From : "[email protected]",
    Subject : "This is the subject",
    Body : "And this is the body"
    }).then(
      message => alert(message)
    );

这是不可取的,因为它会在客户端显示您的密码。因此,您可以执行以下操作,对 SMTP 凭据进行加密,并将其锁定到单个域,并传递安全令牌而不是凭据。

Email.send({
    SecureToken : "C973D7AD-F097-4B95-91F4-40ABC5567812",
    To : '[email protected]',
    From : "[email protected]",
    Subject : "This is the subject",
    Body : "And this is the body"
}).then(
  message => alert(message)
);

最后,如果您没有 SMTP 服务器,则使用 smtp 中继服务,例如 Elastic Email

此外,这里是官方 SmtpJS.com 网站的链接,您可以在其中找到所需的所有示例以及可以创建安全令牌的位置。

我希望有人觉得这个细节有用。祝您编码愉快。

评论

9赞 Quentin 4/2/2019
这仍然将 SMTP 服务器的完全访问权限提供给第三方,以便他们可以为您中继邮件以换取......什么?
1赞 smoore4 10/15/2019
SecureToken 仅对创建时指定的域有效,因此从另一个域调用 js 将不起作用。
4赞 Konrad 7/7/2020
@smoore4是的,但他们仍然必须在他们的服务器上解密它,并且他们可以访问您的密码和其他东西。我不会相信这项服务。
1赞 Konrad 7/7/2020
最安全也是唯一的方法是托管自己的服务
2赞 BarryCap 6/26/2021
错误是否在意料之中?我很确定你没有定义.或者是你使用了代码片段而不仅仅是代码围栏,而我们不应该运行它?另外,我认为你还不算太晚。Uncaught ReferenceError: Email is not definedEmail
0赞 Andrey 12/15/2022 #20

完整的反垃圾邮件版本:

<div class="at">info<i class="fa fa-at"></i>google.com</div>
OR
<div class="at">info&#x40;google.com</div>


<style>
.at {
  color: blue;
  cursor: pointer;
}
.at:hover {
  color: red;
}
</style>

<script>
const el33 = document.querySelector(".at");
el33.onclick = () => {
  let recipient="info";
  let at = String.fromCharCode(64);
  let dotcom="google.com";
  let mail="mailto:";
  window.open(mail+recipient+at+dotcom);
}
</script>