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

How to send form data on each page to different email address from database

我创建了一个类似预订的网站,每个页面上都有两个表单。但是,如果我只有两个收件人,此表单可以很好地与 AJAX、jQuery、PHP 验证、PHPMailer 和 MySQL 配合使用,但在第二种形式中我有问题,因为在每一页上我都需要更改我需要使用 PDO 从数据库中获取的电子邮件收件人,所以我尝试了连续的代码行,但是这会将表单数据发送到来自 table [=18] 的所有电子邮件=] 其中包含电子邮件地址。

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

但是,我明白为什么,因为我的 sql 查询它是 select 所有电子邮件,但我需要 select 每个页面不同的电子邮件地址以及如何在 INSERT 中使用它声明,因为在 table 中,我从 table 中引用了带有电子邮件地址的 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.';

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

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

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

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

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

您的第一个代码片段中唯一缺少的是您的 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 值取决于您,您可能需要考虑使用连接 table 以便您可以将任意数量的地址与任意数量的页面相关联,而不仅仅是一个固定的。

首先,感谢所有为我提供有关如何解决向数据库中的地址发送电子邮件的问题的指南的所有人。 有点拖沓,终于要对这个困扰了我好几天的问题给出一个答案,现在看来这么简单,因为整个解释也在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;  
                }
    }
}

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