如何在不打开邮件客户端的情况下使用JavaScript发送电子邮件?

时间:2013-01-10 22:56:43

标签: javascript html html-email

我正在编写一个带有注册按钮的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>

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

任何帮助都会得到真诚的赞赏: - )

8 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:13)

您需要服务器端支持才能实现此目的。基本上你的表单应该发布(AJAX也没问题)到服务器,该服务器应该通过SMTP连接到某个邮件提供商并发送该电子邮件。

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

答案 2 :(得分:7)

直接来自客户


Send an email using only 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。

答案 3 :(得分:4)

你不能只使用客户端脚本...你可以对一些发送电子邮件的服务器端代码进行AJAX调用......

答案 4 :(得分:1)

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

答案 5 :(得分:1)

我认为您可以使用smtpjs.com

答案 6 :(得分:0)

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

答案 7 :(得分:0)

好吧,PHP 可以轻松做到这一点。

可以使用 PHP mail() 函数来完成。下面是一个简单的函数的样子:

<?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>

希望能帮到你