20

我正在编写一个带有注册按钮的 HTML 页面,该按钮应该只是在不打开本地邮件客户端的情况下静默发送电子邮件。这是我的 HTML:

<form method="post" action="">
    <input type="text" id="email_address" name="name" placeholder="Enter your email address..." required>
    <button onclick="sendMail(); return false">Send Email</button>
</form>

...这是我的 JavaScript 代码:

<script type="text/javascript">
  function sendMail() {
    var link = 'mailto:hello@domain.com?subject=Message from '
             +document.getElementById('email_address').value
             +'&body='+document.getElementById('email_address').value;
    window.location.href = link;
}
</script>

上面的代码有效......但它打开了本地电子邮件客户端。如果我像这样删除属性中的return语句:onclick

<form method="post" action="">
    <input type="text" id="email_address" name="name" placeholder="Enter your email address..." required>
    <button onclick="sendMail()">Send Email</button>
</form>

...然后根本不发送电子邮件。我错过了什么吗?

任何帮助将不胜感激:-)

4

8 回答 8

15

您不能让用户的浏览器静默发送电子邮件。这将是一个可怕的安全问题,因为任何网站都可以将他们的系统用作垃圾邮件中继和/或收集他们的电子邮件地址。

您需要向从您的服务器发送邮件的服务器端进程(以您选择的语言编写)发出 HTTP 请求。

于 2013-01-10T22:59:43.827 回答
15

您需要服务器端支持来实现这一点。基本上,您的表单应该发布(AJAX 也可以)到服务器,并且该服务器应该通过 SMTP 连接到某个邮件提供商并发送该电子邮件。

即使可以使用 JavaScript(即从用户计算机)直接发送电子邮件,用户仍然必须连接到某些 SMTP 服务器(如 gmail.com),提供 SMTP 凭据等。这通常在服务器端(在您的应用程序中),它知道这些凭据。

于 2013-01-10T22:59:56.940 回答
9

直接来自客户


仅使用 JavaScript 发送电子邮件

in short: 
1. register for Mandrill to get an API key
2. load jQuery
3. use $.ajax to send an email

像这样 -

function sendMail() {
    $.ajax({
      type: 'POST',
      url: 'https://mandrillapp.com/api/1.0/messages/send.json',
      data: {
        'key': 'YOUR API KEY HERE',
        'message': {
          'from_email': 'YOUR@EMAIL.HERE',
          'to': [
              {
                'email': 'RECIPIENT@EMAIL.HERE',
                'name': 'RECIPIENT NAME (OPTIONAL)',
                'type': 'to'
              }
            ],
          'autotext': 'true',
          'subject': 'YOUR SUBJECT HERE!',
          'html': 'YOUR EMAIL CONTENT HERE! YOU CAN USE HTML!'
        }
      }
     }).done(function(response) {
       console.log(response); // if you're into that sorta thing
     });
}

https://medium.com/design-startups/b53319616782

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


通过您的服务器间接- 安全


为了克服上述漏洞,您可以修改自己的服务器以在基于会话的身份验证后发送电子邮件。

node.js - https://www.npmjs.org/package/node-mandrill

var mandrill = require('node-mandrill')('<your API Key>'); 

function sendEmail ( _name, _email, _subject, _message) {
    mandrill('/messages/send', {
        message: {
            to: [{email: _email , name: _name}],
            from_email: 'noreply@yourdomain.com',
            subject: _subject,
            text: _message
        }
    }, function(error, response){
        if (error) console.log( error );
        else console.log(response);
    });
}

// define your own email api which points to your server.

app.post( '/api/sendemail/', function(req, res){

    var _name = req.body.name;
    var _email = req.body.email;
    var _subject = req.body.subject;
    var _messsage = req.body.message;

    //implement your spam protection or checks. 

    sendEmail ( _name, _email, _subject, _message );

});

然后在客户端使用 $.ajax 来调用您的电子邮件 API。

于 2014-12-02T07:46:47.453 回答
4

您不能仅使用客户端脚本来执行此操作...您可以对某些将发送电子邮件的服务器端代码进行 AJAX 调用...

于 2013-01-10T23:00:11.077 回答
2

我认为您可以使用smtpjs.com

于 2017-01-13T17:19:33.190 回答
1

需要某种类型的后端框架来发送电子邮件。这可以通过 PHP/ASP.NET 或使用本地邮件客户端来完成。如果您希望用户什么都看不到,最好的方法是通过对单独的 send_email 文件的 AJAX 调用来利用这些内容。

于 2013-01-10T23:00:42.177 回答
0

您需要直接在服务器上执行此操作。但更好的方法是使用 PHP。听说PHP有一个特殊的代码,可以不用打开邮件客户端直接发送邮件。

于 2013-01-10T23:01:59.270 回答
0

嗯,PHP 可以很容易地做到这一点。

可以通过 PHPmail()函数来完成。这是一个简单的函数的样子:

<?php     
$to_email = 'name@company.com';
$subject = 'Testing PHP Mail';
$message = 'This mail is sent using the PHP mail function';
$headers = 'From: noreply@company.com';
mail($to_email,$subject,$message,$headers);
?>

这将向 . 文件中指定的收件人发送一封后台电子邮件$to_email

为简单起见,上述示例在源代码中为电子邮件地址和其他详细信息使用硬编码值。

假设您必须为用户创建一个联系我们的表单,填写详细信息然后提交。

  1. 用户可能会意外或故意在标头中注入代码,从而导致发送垃圾邮件
  2. 为了保护您的系统免受此类攻击,您可以创建一个自定义函数,在发送邮件之前对值进行清理和验证。

filter_var()让我们创建一个自定义函数,使用内置函数验证和清理电子邮件地址。

这是一个示例代码:

<?php 
function sanitize_my_email($field) {
    $field = filter_var($field, FILTER_SANITIZE_EMAIL);
    if (filter_var($field, FILTER_VALIDATE_EMAIL)) {
        return true;
    } else {
        return false;
    }
}
$to_email = 'name@company.com';
$subject = 'Testing PHP Mail';
$message = 'This mail is sent using the PHP mail ';
$headers = 'From: noreply@company.com';
//check if the email address is invalid $secure_check
$secure_check = sanitize_my_email($to_email);
if ($secure_check == false) {
    echo "Invalid input";
} else { //send email 
    mail($to_email, $subject, $message, $headers);
    echo "This email is sent using PHP Mail";
}
?>

我们现在将让它成为一个单独的 PHP 文件,例如sendmail.php.

然后,将在表单提交时使用此文件,使用表单的action属性,例如:

<form action="sendmail.php" method="post">
   <input type="text" value="Your Name: ">
   <input type="password" value="Set Up A Passworrd">
   <input type="submit" value="Signup">
   <input type="reset" value="Reset Form">
</form>

希望我能帮上忙

于 2021-02-26T14:07:58.347 回答