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

使用SMTP JS提交表单后出现HTTP ERROR 405问题求助

问题描述

使用SMTP JS提交表单时,表单验证与邮件发送功能正常,但发送成功后页面出现HTTP ERROR 405且未正常显示成功弹窗,需解决该问题。

原代码示例

HTML

<form class="send-message row-start-1 col-start-1 col-end-4 w-[100%] md:w-[75%]" action="" id="" method="POST""  >
  <div class="mb-4">
    <input
      class="dark:bg-black bg-transparent border border-white w-full px-2 py-2 rounded text-sm text-white md:text-base"
      type="text"
      name="name"
      placeholder="Name"
      id="name"
      
    />
    <span id="nameError" class="text-red-400 text-xs md:text-sm"></span>
  </div>

  <div class="mb-4">
    <input
      class="dark:bg-black bg-transparent border border-white w-full px-2 py-2 rounded text-sm text-white md:text-base"
      type="text"
      name="email"
      id="email"
      placeholder="Email"
      
    />
    <span
      id="emailError"
      class="text-red-400 text-xs md:text-sm"
    ></span>
  </div>

  <div class="mb-4">
    <input
      class="dark:bg-black bg-transparent border border-white w-full px-2 py-2 rounded text-sm text-white md:text-base"
      type="text"
      name="subject"
      id="subject"
      
      placeholder="Subject"
    />
    <span
      id="subjectError"
      class="text-red-400 text-xs md:text-sm"
    ></span>
  </div>

  <div class="mb-4">
    <textarea
      class="dark:bg-black bg-transparent border border-white w-full h-28 px-2 py-2 rounded text-sm text-white md:text-base"
      name="message"
      id="message"
      cols="30"
      rows="10"
      
      placeholder="Message"
    ></textarea>
    <span
      id="messageError"
      class="text-red-400 text-xs md:text-sm"
    ></span>
  </div>

  <!-- send button starts here -->
  <div class="relative">
    <button onclick="return sendMail()"
      class="flex flex-row items-center justify-center gap-2 bg-[#f7f7f7] transition-all duration-300 ease-in-out drop-shadow-xl hover:bg-white hover:drop-shadow-2xl text-nav-color font-bold py-2 px-8 md:px-10 md:py-2 rounded"
    >
      <svg
        class="w-6 h-8"
        xmlns="http://www.w3.org/2000/svg"
        width="16"
        height="16"
        fill="currentColor"
        class="bi bi-send"
        viewBox="0 0 16 16"
      >
        <path
          d="M15.854.146a.5.5 0 0 1 .11.54l-5.819 14.547a.75.75 0 0 1-1.329.124l-3.178-4.995L.643 7.184a.75.75 0 0 1 .124-1.33L15.314.037a.5.5 0 0 1 .54.11ZM6.636 10.07l2.761 4.338L14.13 2.576 6.636 10.07Zm6.787-8.201L1.591 6.602l4.339 2.76 7.494-7.493Z"
        />
      </svg>
      Send
    </button>

        <!-- success message     -->
        <div class="absolute top-0 left-0 hidden bg-green-100 rounded-md p-3  md:w-[50%]" id="success">
          <svg
              class="stroke-2 stroke-current text-green-600 h-8 w-8 mr-2 flex-shrink-0"
              viewBox="0 0 24 24"
              fill="none"
              strokeLinecap="round"
              strokeLinejoin="round"
          >
              <path d="M0 0h24v24H0z" stroke="none" />
              <circle cx="12" cy="12" r="9" />
              <path d="M9 12l2 2 4-4" />
          </svg>
      
          <div class="text-green-700">
              <div class="font-bold text-xl">Message sent successfully.</div>
      
               
          </div>
      </div>
    </div>

</form>

JavaScript

function sendMail() {

    let inputName = document.getElementById("name").value;
    let inputEmail = document.getElementById("email").value;
    let inputSubject = document.getElementById("subject").value;
    let inputMessage = document.getElementById("message").value;


    let validName = validateName(inputName);
    let validEmail = validateEmail(inputEmail);
    let validSubject = validateSubject(inputSubject);
    let validMessage = validateMessage(inputMessage);
    

    if (validName != false && validEmail != false && validSubject != false && validMessage != false) {
        let messageBody = 'Name: ' + inputName + '<br>Email: ' + inputEmail + '<br>Subject: ' + inputSubject + '<br>Message: ' + inputMessage;

        Email.send({
            SecureToken:"XXXXXXXXXXXX",
            To : 'XXXXXXXXX@gmail.com',
            From : "XXXXXXXXXXX@gmail.com",
            Subject :  "New message on contact from " + inputName,
            Body : messageBody,
           
        }).then(
           
                showSuccess()
    
        )
return true;
    
    }

    else{
        
        return false;
    }


}



// showing success message
function showSuccess() {
    let successMessage = document.getElementById("success");
    successMessage.classList.remove("hidden");
    successMessage.classList.add("flex");

}
问题原因

HTTP 405错误是因为表单完成邮件发送后,触发了浏览器默认的POST提交行为:表单设置了method="POST"但action="",浏览器会向当前页面发起POST请求,而静态页面服务器通常不支持POST方法,因此返回405错误。同时默认提交会导致页面刷新,打断成功弹窗的显示逻辑。

修复方案

1. 修正HTML表单语法错误

form标签存在多余引号,将method="POST""改为method="POST",并移除空id属性:

<form class="send-message row-start-1 col-start-1 col-end-4 w-[100%] md:w-[75%]" action="" method="POST">

2. 阻止表单默认提交行为

修改sendMail函数,验证通过后返回false,彻底阻止浏览器的默认表单提交:

function sendMail() {
    let inputName = document.getElementById("name").value;
    let inputEmail = document.getElementById("email").value;
    let inputSubject = document.getElementById("subject").value;
    let inputMessage = document.getElementById("message").value;

    let validName = validateName(inputName);
    let validEmail = validateEmail(inputEmail);
    let validSubject = validateSubject(inputSubject);
    let validMessage = validateMessage(inputMessage);

    if (validName != false && validEmail != false && validSubject != false && validMessage != false) {
        let messageBody = 'Name: ' + inputName + '<br>Email: ' + inputEmail + '<br>Subject: ' + inputSubject + '<br>Message: ' + inputMessage;

        Email.send({
            SecureToken:"XXXXXXXXXXXX",
            To : 'XXXXXXXXX@gmail.com',
            From : "XXXXXXXXXXX@gmail.com",
            Subject :  "New message on contact from " + inputName,
            Body : messageBody,
        }).then(
            showSuccess
        )
        // 阻止表单默认提交
        return false;
    } else {
        return false;
    }
}

3. 优化表单交互逻辑(可选)

将按钮的onclick事件替换为表单的onsubmit事件,更符合规范:

  • 移除按钮的onclick="return sendMail()",添加type="submit"属性
  • 给form标签添加onsubmit="return sendMail()":
<form class="send-message row-start-1 col-start-1 col-end-4 w-[100%] md:w-[75%]" action="" method="POST" onsubmit="return sendMail()">
    <!-- 表单内容 -->
    <button type="submit" class="flex flex-row items-center justify-center gap-2 bg-[#f7f7f7] transition-all duration-300 ease-in-out drop-shadow-xl hover:bg-white hover:drop-shadow-2xl text-nav-color font-bold py-2 px-8 md:px-10 md:py-2 rounded">
        <!-- 按钮图标和文字 -->
    </button>
</form>

4. 提升用户体验(可选)

给成功弹窗添加自动隐藏逻辑,并清空表单内容:

function showSuccess() {
    let successMessage = document.getElementById("success");
    successMessage.classList.remove("hidden");
    successMessage.classList.add("flex");
    // 3秒后自动隐藏弹窗并清空表单
    setTimeout(() => {
        successMessage.classList.add("hidden");
        successMessage.classList.remove("flex");
        document.getElementById("name").value = "";
        document.getElementById("email").value = "";
        document.getElementById("subject").value = "";
        document.getElementById("message").value = "";
    }, 3000);
}

内容的提问来源于stack exchange,提问作者Tariqul Islam Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:45:21