如何将每个页面上的表单数据从数据库发送到不同的电子邮件地址

Posted

技术标签:

【中文标题】如何将每个页面上的表单数据从数据库发送到不同的电子邮件地址【英文标题】:How to send form data on each page to different email address from database 【发布时间】:2021-06-19 10:12:12 【问题描述】:

我创建了一个网站,例如预订,每个页面上都有两个表单。但是,如果我只有两个收件人,则此表单可以很好地与 AJAX、jQuery、php 验证、PHPMailer 和 mysql 配合使用,但在第二种表单中我有问题,因为在每个页面上我都需要更改电子邮件收件人,我需要使用 PDO 从数据库中获取这些收件人,所以我尝试使用后续代码行,但这会将表单数据发送到表 owner_email 中包含电子邮件地址的所有电子邮件。

    $sql="SELECT email_address FROM neum.owners_email";
    foreach ($pdo->query($sql) as $row) 
    $mail->AddAddress($row[email_address]);
     

但是,我明白为什么,因为我的 sql 查询选择了所有电子邮件,但我需要为每个页面选择不同的电子邮件地址,并再次在 INSERT 语句中使用它,因为在包含表单数据的表中,我引用了来自的 email_address_id带有电子邮件地址的表格,您如何查看如下:

CREATE TABLE IF NOT EXISTS `neum`.`owners_email` (
  `email_address_id` INT(11) NOT NULL AUTO_INCREMENT,
  `email_address` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
  PRIMARY KEY (`email_address_id`))
ENGINE = InnoDB
AUTO_INCREMENT = 3
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci
COMMENT = 'Table with information about email addresses of owners.';


-- -----------------------------------------------------
-- Table `neum`.`form_data`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `neum`.`form_data` (
  `form_data_id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
  `tel` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
  `from` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
  `to` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
  `mail` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
  `message` TEXT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
  `dateSent` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `email_address_id` INT(11) NOT NULL,
  PRIMARY KEY (`form_data_id`),
  INDEX `fk_form_data_idx` (`email_address_id` ASC),
  CONSTRAINT `fk_form_data`
    FOREIGN KEY (`email_address_id`)
    REFERENCES `neum`.`owners_email` (`email_address_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci
COMMENT = 'Table with information about form data.';

尽管如此,我尝试在谷歌上找到这个问题的答案,但可能没有人使用 PHPMailer 将每个页面上的电子邮件发送到不同的电子邮件地址,因为在我的每个问题上,谷歌通常都会向我显示简单的结果,例如如何发送邮件或如何发送多封邮件,但对于我的问题不存在答案,所以如果有人知道如何解决它,请提前感谢您的帮助和感谢您的时间。

【问题讨论】:

【参考方案1】:

PHPMailer 不关心你发送给谁——它只是使用你传递给addAddress() 的任何东西。如果要发送给不同的人,则需要弄清楚如何获取要发送到的地址列表,这完全独立于以后向他们发送消息。将其视为两个独立的任务:

第一个任务:获取地址列表。这与PHPMailer无关。

第二个任务:向地址数组发送消息。这与您的数据库无关。

碰巧,PHPMailer provides an example 结合了这两项任务,您应该能够适应。仅仅因为您发送给 2 个人而不是 10,000 人并不意味着您没有发送给列表,并且相同的代码可以正常工作。

您的第一个代码 sn-p 中唯一缺少的是您的 MySQL 查询中的某些内容,以限制它选择发送的对象。通过执行以下操作来调整它:

$sql="SELECT email_address FROM owners_email JOIN form_data ON form_data.email_address_id = owners_email.id WHERE form_data_id = " . $form_data_id;

如何获得正确的$form_data_id 值取决于您自己,您可能需要考虑使用连接表,这样您就可以将任意数量的地址与任意数量的页面相关联,而不仅仅是一个固定的地址.

【讨论】:

亲爱的 Synchro 非常感谢您给我一些指示。我正在尝试更改 sql 查询,但现在这不会向任何人发送电子邮件。您可能忘记正确写入 id 的名称,插入“JOIN form_data ON form_data.email_address_id = owner_email.id”可能需要是“JOIN form_data ON form_data.email_address_id = owner_email.email_address_id 因为我的每个 id 都以表名开头,但是但是任何解决方案都不起作用.... 是的,这是正确的——我习惯于使用 id 作为标识符的表格。无论如何,在确定您的查询正确之前,甚至不要查看电子邮件发送代码。自行测试它们(例如,在 phpMyAdmin、Sequel Pro 等工具中)以确保在尝试发送之前获得正确的结果。电子邮件不是调试 SQL 语句的有效方法! 亲爱的 Synchro,我到处寻找,但找不到解决方案。但是PHPMailer给我的这个例子使用mysqli和我使用PDO,完全不同,所以我可能不知道mysqli,因为我学习的时候大家都说PDO更好,所以我只是学习和使用PDO。用 mysql 或 mysqli 开始时,甚至看起来永远都不会。 只是你调用的函数不同;您运行的查询将是相同的。它应该没有实际的区别。 嗯?没看懂,那你知道怎么用外键往这个表里插入数据吗?在添加带有电子邮件的表格之前,我使用了``` $mail = "INSERT INTO form_data (name, tel, from, to, email, message) VALUES (:name, :tel, :from, :to, :email, :message )"; $stmt = $pdo->prepare($mail); $stmt->execute(['name' => $name, 'tel' => $tel, 'from' => $from, 'to' => $to, 'email' => $email, 'message' => $消息]); ``` ,但是现在我列email_address_id,所以无法理解如何在每个页表上知道选择哪个email_address_id。好复杂……【参考方案2】:

首先,感谢所有为我提供指导以解决我从数据库中向地址发送电子邮件的问题的人。 稍微耽搁一下,最后,我想对这个困扰了我好几天的问题给出一个答案,但现在我觉得很简单,因为整个解释也在official page of phpmailer上。该代码还包含用于将数据插入数据库的代码。所以,完整的代码如下:

$sql = "SELECT owners_email.email_address_id, email_address, owner_name, owner_property, owner_sex, owner_type FROM visitneum.owners_email INNER JOIN visitneum.pages ON (pages.email_address_id = owners_email.email_address_id) WHERE `owner_sex`='M' AND `owner_type`='other' AND `pages_id` = ?";
    $dbstmt = $pdo->prepare($sql);
    $dbstmt->bindParam(1,$pages_id);
    $dbstmt->execute();
    
    $emails = $dbstmt->fetchAll(PDO::FETCH_ASSOC);
    if(is_array($emails) && count($emails) > 0)
        foreach ($emails as $email)
            $mail->addAddress($email['email_address']);
                $body_other = "<p>Dear $email['owner_name'], <br>" . "You just received a message from the site <a href='https://www.visit-neum.com'>visit-neum.com</a><br>Details of your message are below:</p><p><strong>From: </strong>" . ucwords($fname) . "<br><strong>Phone: </strong>" . $tel . "<br><strong>E-mail: </strong>" .strtolower($userMail)."<br><strong>Message: </strong>" . $userMessage . ";
                $mail->Body = $body_other;
                
                try 
                    $mail->send();
                    //Insert data into db
                    $mail = "INSERT INTO visitneum.contact_owner (fname, tel, userMail, userMessage, email_address_id) VALUES (:fname, :tel, :userMail, :userMessage, :email_address_id)";
                    $stmt = $pdo->prepare($mail);
                    $stmt->execute(['fname' => $fname, 'tel' => $tel, 'userMail' => $userMail, 'userMessage' => $userMessage, 'email_address_id' => $email['email_address_id']]);
                    echo "Thanks ".ucwords($fname)."! Your message has been successfully sent to the owner of $email['owner_property']! You will get an answer soon!";
                    
                 catch (Exception $e) 
                    echo "An error has occurred! Please try again ..." . $mail->ErrorInfo;  
                
    

我希望这个答案也能对某人有所帮助,所以如果这个答案也解决了您的问题,请通过单击答案旁边的复选标记将其标记为已接受。提前致谢。

【讨论】:

以上是关于如何将每个页面上的表单数据从数据库发送到不同的电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

Google 表单:将数据发送到电子表格

如何通过单独的联系表单将 HTML 输入从页面发送给用户

如何将 html 数据从节点 js 发送到前端?

如何通过ajax从表单发送POST数据数组?

如何将 JSON 数据从节点 js 脚本发送到不同服务器上的 HTML 文件

将Django Choices表单字段的详细名称传递给查看上下文