【问题标题】:Sendmail problem with js + php on debian 9debian 9上js + php的Sendmail问题
【发布时间】:2020-09-24 09:25:34
【问题描述】:

实际上,我在使用我的 VPS 服务器发送邮件时遇到了问题。 我的服务器安装了 PHP 和 sendmail。

我尝试从 HTML 表单发送一封电子邮件,该表单在 JS 中检查,然后以 HTML 格式发送,请求启动良好,但没有发送任何内容。

我的 JS 代码:

submitMail() {
      const emailValue = document.getElementById('mail').value;
      const subjectValue = document.getElementById('subject').value;
      const messageValue = document.getElementById('text').value;
      const xhr = new XMLHttpRequest();
      xhr.open('POST', 'https://ag-dev.fr/mailform.php', true);
      xhr.setRequestHeader('Content-Type', 'application/json');
      xhr.onreadystatechange = () => {
        if (xhr.readyState === 4 && xhr.status === 200) {
          this.sendComplet();
        }
      };
      xhr.send(JSON.stringify({
        email: emailValue,
        subject: subjectValue,
        message: messageValue,
      }));
    },

我的 PHP 代码:

<?php
  if (!empty($_POST['message']))
  {
      $to = 'contact@ag-dev.fr';
      $from = $_POST['email'];
      $subject = $_POST['subject'];
      $message = $_POST['message'] . "\n\n\n\n Ceci est un message envoyé depuis le formulaire de contact. Pour répondre à ce mail, envoyez un mail à l'adresse suivante : " . $_POST['email'];
      $headers  = 'MIME-Version: 1.0\r\n';
      $headers .= 'Content-type: text/html; charset=iso-8859-1\r\n';
      $headers .= 'To: Guyomar Alexis <contact@ag-dev.fr>\r\n';
      $headers .= 'From: ' . ' <' . $from . '>\r\n';
      mail($to,$subject,$message,$headers);
  }
?>

我用 sendmail 在我的命令行服务器上运行了一个测试,我收到了没有问题的邮件。我认为我的代码或配置服务器有问题。

如果有人知道这可能来自哪里......

【问题讨论】:

  • 这是一个很好的 PHP 电子邮件问题调试通用指南:stackoverflow.com/a/24644450/5947043
  • 我在这里唯一注意到的是 1) mail 有一个特定的 $to 字段。那么你为什么要在 $headers 中再次定义“to”呢?这当然没有必要,甚至可能会导致问题。附言您甚至没有检查 mail 是否返回 true 或 false,因此您在调试这个方面还没有走得太远。
  • 另外,2) 您允许用户在 HTML 表单中指定“发件人”地址。这是一个坏主意——许多邮件服务器如果收到这样的邮件,就会将其视为垃圾邮件而拒绝,甚至您发送邮件的服务器甚至可能根本不接受邮件进行投递。这是因为“发件人”地址很可能与生成电子邮件的服务器具有不同的域。当然,这是电子邮件欺骗者用来进行网络钓鱼尝试、垃圾邮件、假冒等很常见的事情,因此它通常被禁止或标记为可疑。
  • 改为使用固定的“no-reply@yourdomain.com”类型的地址作为发件人字段。如果您想在邮件中包含提供的电子邮件地址,您可以简单地将其放在邮件正文中,或者尝试将其添加为回复字段。
  • 哦,实际上,即使在您了解所有这些之前,我只是注意到:JSON.stringify({ email: emailValue, subject: subjectValue, message: messageValue,}) 也是一个问题 - 您在这里发送 JSON,但 PHP 期待常规的 form-url-encoded POST价值观。因此它将无法从您发送的内容中检测到 POST["message"] 变量。阅读:Receive JSON POST with PHP 并相应地调整您的 PHP 代码。先解决这个问题,也许你不会对电子邮件本身有任何问题......我们会看到的。

标签: javascript php sendmail vps


【解决方案1】:

感谢@ADyson 提供带有 PHP 链接的 JSON POST。 我这样解决我的问题:

<?php
  $data = json_decode(file_get_contents('php://input'), true);
  if (!empty($data))
  {
      $to = 'contact@ag-dev.fr';
      $from = $data['email'];
      $subject = utf8_decode($data['subject']);
      $message = utf8_decode($data['message']) . utf8_decode("\n\n\n\n Ceci est un message envoyé depuis le formulaire de contact. Pour répondre à ce mail, envoyez un mail à l'adresse suivante : " . $from);
      $headers  = 'MIME-Version: 1.0\r\n';
      $headers .= 'Content-type: text/html; charset=utf-8\r\n';
      $headers .= 'To: Guyomar Alexis <contact@ag-dev.fr>\r\n';
      $headers .= 'From: ' . ' <' . $from . '>\r\n';
      mail($to,$subject,$message,$headers);
  }
?>

现在一切运行良好。

【讨论】:

    猜你喜欢
    • 2020-06-10
    • 2023-01-29
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多