You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express+EJS环境下Smtp.js无法发送邮件的问题排查求助

问题分析与解决方案

核心问题1:表单默认提交行为中断异步请求

你的按钮是type="submit",点击后会触发表单的默认提交行为,导致页面刷新,SMTP.js的异步邮件发送请求还没完成就被中断,因此邮件发不出去,也看不到后续错误提示。

解决方法:

  • 方法一:修改点击事件,阻止默认行为
    <button type="submit" onclick="sendEmail(event); return false;">Submit</button>
    
    同时在sendEmail函数开头添加阻止逻辑:
    function sendEmail(event) {
        event.preventDefault(); // 阻止表单默认提交
        console.log("I am at start of the sendEmail function");
        // 后续原有代码不变
    }
    
  • 方法二:修改按钮类型,避免触发表单提交
    <button type="button" onclick="sendEmail()">Submit</button>
    

核心问题2:SMTP.js配置可能存在细节错误

即使验证了邮箱,以下细节仍可能导致发送失败:

  • 端口未指定:ElasticEmail的SMTP端口通常为2525或587,SMTP.js默认端口可能不匹配,需在配置中添加Port参数:
    Email.send({
      Host: "smtp.elasticemail.com",
      Port: 2525, // 或587
      Username : "m**************@gmail.com",
      Password : "***********************", // 注意:此处应为ElasticEmail的API密钥,而非Gmail登录密码
      // 其他配置不变
    })
    
  • 密码类型错误:若使用Gmail作为发件邮箱,直接填写Gmail登录密码会因Google安全限制失败,需改用Gmail的应用专用密码,或切换为ElasticEmail自身的发件邮箱及对应API密钥。

关于EJS的疑问

不需要将EJS替换为普通HTML。EJS是服务器端渲染的模板引擎,最终输出的是标准HTML,你的问题与EJS本身无关,仅涉及前端JS逻辑和表单行为。

更安全的替代方案

前端直接暴露邮箱账号和密码存在严重安全风险,任何人都可通过查看源码获取敏感信息。建议改用后端发送邮件:

  1. 安装nodemailer库:
    npm install nodemailer
    
  2. 在Express中创建邮件发送接口:
    // 后端路由文件示例
    const nodemailer = require('nodemailer');
    app.post('/send-email', async (req, res) => {
      const transporter = nodemailer.createTransport({
        host: 'smtp.elasticemail.com',
        port: 2525,
        auth: {
          user: '你的ElasticEmail用户名/邮箱',
          pass: '你的ElasticEmail API密钥'
        }
      });
    
      const mailOptions = {
        from: 'm**************@gmail.com',
        to: '2***************@gmail.com',
        subject: 'Test',
        text: 'Body'
      };
    
      try {
        await transporter.sendMail(mailOptions);
        res.json({ success: true, message: '邮件发送成功' });
      } catch (err) {
        res.json({ success: false, message: err.message });
      }
    });
    
  3. 前端通过AJAX请求后端接口:
    function sendEmail(event) {
      event.preventDefault();
      fetch('/send-email', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' }
      })
      .then(res => res.json())
      .then(data => {
        if (data.success) alert('邮件发送成功');
        else alert('发送失败:' + data.message);
      })
      .catch(err => console.log(err));
    }
    

内容的提问来源于stack exchange,提问作者Thermal_insulator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:01:07