【问题标题】:My form in phpmailer() only allow send mails from a mail with own domain我在 phpmailer() 中的表单只允许从具有自己域的邮件发送邮件
【发布时间】:2015-12-22 14:17:41
【问题描述】:

我有这个代码,这是一个问题,因为当我在表单中指定具有自己域的邮件时,它在我发送邮件时有效。但如果我使用 gmail 或 Yahoo 邮件,它就不起作用。

这是我在 PHPMailer 上使用的代码:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
require_once 'phpmailer/PHPMailerAutoload.php';

if (isset($_POST['inputName']) && isset($_POST['inputEmail']) && isset($_POST['inputSubject']) && isset($_POST['inputMessage'])) {

    //check if any of the inputs are empty
    if (empty($_POST['inputName']) || empty($_POST['inputEmail']) || empty($_POST['inputSubject']) || empty($_POST['inputMessage'])) {
        $data = array('success' => false, 'message' => 'Please fill out the form completely.');
        echo json_encode($data);
        exit;
    }

    //create an instance of PHPMailer
    $mail = new PHPMailer();
    $mail->IsSMTP();
    $mail->SMTPAuth = true;
    $mail->Host = "mail.example.com"; // SMTP a utilizar. Por ej. smtp.elserver.com
    $mail->Username = "contacto@example.com"; // Correo completo a utilizar
    $mail->Password = "xxx"; // Contraseña
    $mail->Port = 25; // Puerto a utilizar

    $mail->From = $_POST['inputEmail'];
    $mail->FromName = $_POST['inputName'];
    $mail->AddAddress('contacto@example.net'); //recipient 
    $mail->Subject = $_POST['inputSubject'];
    $mail->Body = "Name: " . $_POST['inputName'] . "\r\n\r\nMessage: " . stripslashes($_POST['inputMessage']);
    $mail->CharSet = 'UTF-8';

    if (isset($_POST['ref'])) {
        $mail->Body .= "\r\n\r\nRef: " . $_POST['ref'];
    }

    if(!$mail->send()) {
        $data = array('success' => false, 'message' => 'El mensaje no se ha enviado: ' . $mail->ErrorInfo);
        echo json_encode($data);
        exit;
    }

    $data = array('success' => true, 'message' => '¡Gracias! Hemos recibido tu mensaje.');
    echo json_encode($data);

} else {

    $data = array('success' => false, 'message' => 'Favor de llenar los campos correctamente.');
    echo json_encode($data);

}

【问题讨论】:

  • 如果phpmailer返回true,那么它的工作就完成了,你需要检查你的邮件服务器的日志。 PHP 的工作相当于拿着你的信封走到街角,然后把它扔进邮箱。之后,如果邮箱被破坏,信件丢失等等......这不是PHP的错,PHP无法检测到。
  • 我的邮件问题的第一站是邮件服务器日志
  • 所以这可能是服务器的问题? PHPmailer 在这两种情况下都返回 true。但是只有当我使用自己域名的邮件时才会发送邮件。
  • 你的服务器,你和目的地之间的任何服务器,目的地服务器,用户。任你选
  • 这是电子邮件服务器的预期行为。查看SPF records

标签: php forms email phpmailer


【解决方案1】:

这是你的问题:

$mail->From = $_POST['inputEmail'];
$mail->FromName = $_POST['inputName'];

这样做是在伪造发件人地址,这将导致您无法通过 SPF 和/或 DMARC 检查,并且要么被彻底拒绝,要么被放入垃圾邮件文件夹。

改为这样做:

$mail->From = 'contacto@45norte.com';
$mail->addAddress('contacto@45norte.com'); //recipient 
$mail->addReplyTo($_POST['inputEmail'], $_POST['inputName']); //recipient 

这样您将通过 SPF 检查,并且可以直接回复发件人。

【讨论】:

  • 谢谢。但最终问题出在服务器配置上。
猜你喜欢
  • 2022-12-11
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2019-02-17
相关资源
最近更新 更多