【问题标题】:PHP form sending mail to all users instead of just onePHP 表单向所有用户发送邮件,而不仅仅是一个用户
【发布时间】:2025-11-21 19:20:03
【问题描述】:

我正在创建一个网页,用户可以在其中创建帖子。其他用户可以通过填写向帖子创建者发送电子邮件的表单来回复帖子。 我使用 while 循环进行迭代以显示来自 MySQL 数据库的所有帖子,同时显示用于回复的表单。

我遇到的问题是,当我按下回复表单上的发送按钮时,数据库中的所有用户都会收到一封电子邮件。它应该工作的方式是,我要回复的人应该收到电子邮件。尝试了其他迭代器。考虑使用对象但就是不明白为什么当我按下发送按钮时 mail() 函数会向所有用户发送电子邮件。

$query = mysql_query("SELECT * FROM msg ORDER by id DESC");

while ($row = mysql_fetch_array($query)){
    print '<div class="block">
                <div id="uMail">
                    <a id="mail" href="'.$row['userMail'].'"> <img src="mail.png" > </a>
                </div>

                <div id="uName">
                    <span id="var">'.$row['userName'].'</span>
                </div>

                <div id="uMsg">
                    <p>'.$row['userMsg'].'</p>
                </div>
            </div>


            <div class="popup">
                <form action="" method="POST">
                    <div id="sName">
                        <input type="text" name="sName" />
                    </div>
                    <div id="sMail">
                        <input type="email" name="sMail" />
                    </div>
                        <textarea name="sMsg"></textarea>
                        <input type="submit" name="send" value="Send" />
                </form> 
            </div>
            ';

    if (isset($_POST["send"])) {
        $usrMail = $row['userMail'];
        $sndrName = mysql_real_escape_string($_POST["sName"]);
        $sndrMail = mysql_real_escape_string($_POST['sMail']);
        $sndrMsg = mysql_real_escape_string($_POST["sMsg"]);

        mail($usrMail, "Hey", $sndrMsg);
        header('location: forma.php');
    }
} 

【问题讨论】:

  • 你的意思是要发送邮件到特定的ID?来自数据库
  • 嘿,Mantas Pi 你在吗
  • 是的,发给帖子作者的电子邮件,而不是其他人

标签: php mysql email while-loop


【解决方案1】:
  1. 因为 sendmail() 在 while() 中。

  2. 我强烈推荐 https://github.com/PHPMailer/PHPMailer 发送电子邮件,因为 mail() 无法指定 SMTP。

【讨论】:

  • 如果我在外面制作 mail(),只有 db 中的最后一个用户会收到电子邮件。我卡住了
  • 你知道要给谁发邮件吗?
  • 这是因为 $row['userMail'] 会在 while 结束后保存最​​后一个条目。当有人单击提交按钮时,您必须确保发布正确的 $row['userMail']。
  • @DidarAlam 是的,它在数据库中。
  • @user3606329 我明白,只是不知道该怎么做。通常,当在迭代器中进行 if 语句时,它仅在特定迭代中起作用,而在这里它只是不起作用。我在 if 语句中执行 if(isset($_POST...) $ usrMail =$row['userMail'],但我得到了最后一个值:)
【解决方案2】:

您在发送一封电子邮件后将用户重定向到forma.php。你应该移动这一行:

header('location: forma.php');

在 while 循环之外,因此在发送所有电子邮件后重定向用户

【讨论】:

  • 我什至摆脱了这一行,但同样,如果邮件在 while 和 if(isset{$_POST...)) 中,它只会为所有用户而不是一个用户发送电子邮件,如果邮件在外面,它会发送给数据库中的最后一个用户:(
  • 好吧,您的 while 循环为所有用户运行,因此它向所有用户发送电子邮件。一种可能的解决方案是使输入字段的名称唯一。例如,在 while 循环中添加一个名为 $count 的变量并将其添加到每个输入字段名称中。例如 。您还应该更新您的电子邮件代码,以便它使用新的字段名称。例如 $_POST["sName".$count]
  • 是的,Nadir,我在 while 循环中创建了按钮名称 $i 和 $i++,它可以工作 :) 现在使用 javascript 制作了弹出表单,但不知道如何将电子邮件值发送到该表单,因为表格在外面,而:)
【解决方案3】:

所以最后我成功了,我只是将提交按钮名称设置为 $i,在 while 循环中是 $i++。然后我在使用邮件功能及其工作时在内部制作了 if(isset($_POST["$i"])) :) 但是,现在我想制作弹出表单来回答并且不知道如何管理它:)

【讨论】:

    最近更新 更多