【问题标题】:Email doesn't send to user电子邮件不发送给用户
【发布时间】:2019-10-19 22:42:22
【问题描述】:

我有一个联系表,用户在其中输入他们的个人信息和想要发送给我(管理员)的消息,会发生什么情况是我会收到一封包含他们的信息和消息的电子邮件,同时用户将收到一封电子邮件,说明他们的信息已成功发送。此时所有这些都有效,但问题是,消息仅在我强制发送时发送给用户,这意味着哦功能“addAddress”我输入了我想要发送的电子邮件地址,但我想发送给填写该表格的每个人,这不起作用,它只发送给我(管理员)

$sql = "INSERT INTO Mensagem (NomeM, EmailMen, Assunto, Mensagem) VALUES ('$NomeM', '$EmailMen','$Assunto', '$Mensagem')";
$res = $lig->query($sql);

if (isset($_POST['submit'])){
    require 'PHPMailer/PHPMailerAutoload.php';

    $mail = new PHPMailer;

    $mail->Host='smtp.gmail.com';
    $mail->Porto = 587;
    $mail->SMTPAuth = true;
    $mail->SMTPSecure='tls';
    $mail->Username='admin@gmail.com';
    $mail->Password='***';

    $mail->setFrom($_POST['EmailReser']);
    $mail->addAddress('admin@gmail.com');
    $mail->addReplyTo($_POST['EmailReser']);

    $mail->isHTML(true);
    $mail->Subject='New message from your website';
    $mail->Body = "message from user";

    if(!$mail->send()) {
        $result="Something went wrong. Try again";
    } else {
        header('Location: index.php?cmd=home');

        //========  User  ========
        $mail = new PHPMailer;
        $mail->Host='smtp.gmail.com';
        $mail->Porto = 587;
        $mail->SMTPAuth = true;
        $mail->SMTPSecure='tls';
        $mail->Username='admin@gmail.com';
        $mail->Password='***';

        $mail->setFrom('admin@gmail.com');
        $mail->addAddress($_POST['EmailReser']);  // If i added 'user@gmail.com' it would work
        $mail->addReplyTo('admin@gmail.com');

        $mail->isHTML(true);
        $mail->Subject='Your message was received';
        $mail->Body = "message from admin";

        if(!$mail->send()){
            $result="Something went wrong. Try again";
        } else{
            header('Location: index.php?cmd=home');
        }
    }
}

【问题讨论】:

  • 好吧,如果静态值有效,但 $_POST['EmailReser'] 在同一个地方无效 - 那么第一个猜测是,这个变量根本不包含您认为 i> 确实如此。所以做一个调试输出(使用var_dump)来验证
  • Imran 提供了可以解决您问题的答案。但是,为请求指定以下选项$mail->SMTPDebug = 2; // enables SMTP debug information (for testing) // 1 = errors and messages // 2 = messages only 可能很有用
  • 我做了,但没有任何改变,发送给管理员的电子邮件以同样的方式发送,用户仍然没有收到电子邮件
  • 我应该在管理员端还是用户端插入该代码? @atoms
  • 这里没有“管理端”和“用户端”。您有一个用户,提交一份表单 - 您想基于此发送两封电子邮件。因此,在您处理此表单数据的脚本中发送两封电子邮件

标签: php phpmailer


【解决方案1】:

在代码中:

...
} else {
    header('Location: index.php?cmd=home');
...

在发送第一封邮件后,您已将用户重定向到另一个页面。 重定向$_POST后数据丢失,不会触发第二封邮件。

【讨论】:

  • 哦,所以我应该将两个用户引导到同一个页面?即联系表格?
  • @Someone “所以我应该将两个用户引导到同一个页面” - 这甚至没有意义,您的管理员几乎不会坐在网站前面当任意用户填写联系表格时,同时在他们的浏览器中打开。当用户提交表单数据时,从 one 脚本中发送两封邮件。管理员根本不参与这里的任何活动。
  • @Someone 如果您必须重定向,则在发送两封邮件后使用数据重定向或重定向用户。
  • 我忘记了你刚才所说的,我是这个@04FS的新人
【解决方案2】:

没有Porto这样的属性;它只是Port,所以它将使用默认端口25。

不要这样做:

$mail->setFrom($_POST['EmailReser']);

那是伪造的,gmail 不会让你这样做。将您自己的地址放入发件人地址(就像您对管理员电子邮件所做的那样)并将提交者放入回复中(就像您已经在做的那样)。

创建两个 PHPMailer 实例很浪费 - 创建一个并用它发送两个消息。这也将允许您使用 keepalive,这将使发送速度更快。

您使用的是旧版本的 PHPMailer,所以我更新了您的脚本以使用当前版本,使用 composer 加载它 - 如果您还没有使用它,现在是学习的好时机。

如果提交者的电子邮件地址属性不是有效地址,它也不会发送,这是您之前没有发现的。

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require '../vendor/autoload.php';

$mail = new PHPMailer(true); //Enable exceptions
try {
    //Set all common properties
    $mail->SMTPKeepAlive = true;
    $mail->Host = 'smtp.gmail.com';
    $mail->Port = 587;
    $mail->SMTPAuth = true;
    $mail->SMTPSecure = 'tls';
    $mail->Username = 'admin@gmail.com';
    $mail->Password = '***';
    $mail->isHTML(true);

    //Set up recipients
    $mail->setFrom('admin@gmail.com');
    $mail->addAddress('admin@gmail.com');
    $mail->addReplyTo($_POST['EmailReser']);

    $mail->Subject = 'New message from your website';
    $mail->Body = "message from user";

    //If this fails, it will be caught below, so no need for an `if`
    $mail->send();

    //Re-use existing instance
    //Reset recipients, don't need to touch reply-to or from address
    $mail->clearAddresses();
    $mail->addAddress($_POST['EmailReser']);

    $mail->Subject = 'Your message was received';
    $mail->Body = "message from admin";
    $mail->send();
    header('Location: index.php?cmd=home');
} catch (Exception $e) {
    echo 'Something went wrong. Try again ' . $mail->ErrorInfo;
}

【讨论】:

  • 是否需要上传新文件?如果是这样,你能给我一个链接让我下载吗?
  • 最新版本始终为here。阅读自述文件,了解如何在没有 composer 的情况下加载类。
  • 好吧,我已经做了,但没有用,我想是因为我没有自动加载文件,它不在你给我的链接上
  • 那是因为它是由作曲家创建的,所以如果你不使用作曲家,它就不会在那里,所以按照自述文件所说的去做并单独加载类。您将需要 PHPMailer、Exception 和 SMTP 类。
  • 我创建了use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'PHPMailer/src/Exception.php'; require 'PHPMailer/src/PHPMailer.php'; require 'PHPMailer/src/SMTP.php'; ,得到了一个白页
猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2016-01-07
  • 2013-04-03
  • 2011-09-16
  • 2019-07-04
  • 2019-03-04
相关资源
最近更新 更多