登录  /  注册

PHP小示例:群发邮件

WBOY
2023-09-14 16:43:28 243

在之前的文章《PHP小示例:用户邮箱注册登录》(https://www.php.cn/original/86.html)中我们详细介绍了怎么用php来实现邮箱注册和登录的相关问题,提到邮箱我们可能还会遇到的问题就是群发邮件的相关问题,下面一起来看一下,希望对大家有帮助。

0、完整代码下载

https://gitee.com/wang-boy326/sendemail.git

一、设计表

首先照例我们需要先设计表

email_addresses

该表用于存储需要群发的地址和姓名,建表语句如下:

CREATE TABLE `email_addresses` (
  `id` int(11) NOT NULL,
  `email` varchar(255) NOT NULL,
  `name` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

emails

该表用于存储群发的信息,包括群发信息的标题和群发信息的内容,建表语句如下:

CREATE TABLE `emails` (
  `id` int(11) NOT NULL,
  `subject` varchar(255) NOT NULL,
  `message` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

二、PHPMailer

在开始写代码之前,我们需要用到一个小插件:PHPMailer

PHPMailer是一个用于发送电子邮件的PHP库。它提供了一个简单、灵活和可靠的方式来发送电子邮件,支持SMTP、PHP mail()函数和Sendmail等邮件传输方式。

简单来说使用PHPMailer,可以轻松地在PHP应用程序中发送电子邮件

可以使用Composer来安装PHPMailer,运行命令是:

composer require phpmailer/phpmailer

三、保存群发邮件地址代码

1、collect.php

<?php
    require_once 'database.php';
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h2>请输入您需要群发的邮件地址:</h2>
    <form action="save_email.php" method="GET">
        <input type="email" name="email" placeholder="邮件地址" required>
        <input type="text" name="name" placeholder="姓名">
        <input type="submit" value="提交">
    </form>
    <form action="http://sendmail.deu/index.php" method="post">
        <button type="submit">去发送</button>
    </form>
   
    <ul>
        <?php
        //最新留言展示在最前面
        $sql = "SELECT * FROM `email_addresses` ORDER BY `email_addresses`.`id` DESC";
        //执行sql语句
        $result = $conn->query($sql);
        if($result->num_rows > 0){
            //输出数据
            while($row = $result->fetch_assoc()){
                ?>
                <li>
                <p>群发地址:<?php echo $row["email"];?></p>
                <p>姓名:<?php echo $row["name"];?></p>
                </li>
                <?php
            }
        }else{
            //没有留言
            echo "暂无群发地址";
        }
        ?>
    </ul>
</body>
</html>

这段代码主要实现了一个简单的群发邮件地址管理系统的前端界面。下面是对代码的功能进行分析:

  • HTML 表单:页面中包含两个 HTML 表单,分别用于输入邮件地址和姓名,并提交到 save_email.php 文件进行保存。

  • 群发邮件地址展示:使用一个无序列表 <ul> 来展示已保存的群发邮件地址和姓名。通过执行 SQL 查询语句,从数据库中获取数据,并使用 PHP 循环语句将每个邮件地址和姓名显示在列表项 <li> 中。

  • 没有留言提示:如果数据库中没有保存任何邮件地址,则显示 "暂无群发地址"。

  • 发送邮件按钮:通过一个表单和提交按钮,将用户导航到 index.php 页面,用于发送邮件的功能。

总体而言,这段代码提供了一个简单的界面,让用户输入和保存群发邮件地址,并展示已保存的地址。用户还可以通过按钮跳转到发送邮件的功能页面。

2、save_email

<?php
function insertEmailInfo($email, $name) {
    $servername = "localhost";
    $username = "root";
    $password = "root";
    $dbname = "sendmail";
    // 创建数据库连接
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("数据库连接失败: " . $conn->connect_error);
    }
    // 插入语句
    $sql = "INSERT INTO `email_addresses` (`id`,`email`,`name`) VALUES (NULL,'$email','$name');";
    // 执行插入语句,将留言信息插入到数据库中。
    $conn->query($sql);
    $conn->close();
    header("Location:collect.php");
}
$email = $_GET["email"];
$name = $_GET["name"];
insertEmailInfo($email, $name);
//跳转到首页
header("Location:http://sendmail.deu/collect.php");
?>

这段代码主要用于将用户输入的邮件地址和姓名保存到数据库中,并进行页面跳转。

以下是代码的功能分析:

  • insertEmailInfo() 函数:该函数用于将邮件地址和姓名插入到数据库中。函数首先创建数据库连接,然后执行插入语句将邮件地址和姓名插入到 email_addresses 表中。最后关闭数据库连接。

  • 获取邮件地址和姓名:通过 $email = $_GET["email"]; 和 $name = $_GET["name"]; 两行代码,从 URL 中获取用户输入的邮件地址和姓名。

  • 调用 insertEmailInfo() 函数:将获取到的邮件地址和姓名作为参数传递给 insertEmailInfo() 函数,以将其保存到数据库中。

  • 页面跳转:通过 header("Location:http://sendmail.deu/collect.php"); 代码进行页面跳转,将用户重定向到 collect.php 页面。

总体而言,这段代码的作用是将用户输入的邮件地址和姓名保存到数据库中,并将用户重定向到 collect.php 页面。

四、实现群发邮件代码

1、index.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>发送邮件</title>
</head>
<body>
    <h2>发送邮件:</h2>
<form method="post" action="send_email.php">
        <label for="subject">主题:</label>
        <input type="text" name="subject" id="subject" required><br><br>
        <label for="message">内容:</label><br>
        <textarea name="message" id="message" required></textarea><br><br>
        <input type="submit" value="发送邮件">
    </form>
</body>
</html>

这段代码实现了一个简单的发送邮件的表单页面。

2、send_email.php

<?php
require 'vendor/autoload.php'; // 引入PHPMailer库
require_once 'database.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
function sendEmail($subject, $message) {
    $servername = "localhost";
    $username = "root";
    $password = "root";
    $dbname = "sendmail";
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("数据库连接失败: " . $conn->connect_error);
    }
    // 执行查询,获取结果集对象
    $result = $conn->query('SELECT * FROM email_addresses');
    if ($result->num_rows > 0) {
        $successCount = 0;
        $errorCount = 0;
        while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
            $mail = new PHPMailer();
            $mail->isSMTP();
            $mail->Host = 'smtp.qq.com';  // SMTP服务器
            $mail->SMTPAuth = true;
            $mail->Username = '你的邮箱账号';  // 邮箱账号
            $mail->Password = 'iygmjhqzpunqiicg';  // 邮箱密码
            $mail->SMTPSecure = 'ssl';
            $mail->Port = 465;
            $mail->setFrom('你的邮箱账号', 'wboy');  // 发件人邮箱和名称
            $mail->addAddress($row["email"], $row["name"]);  // 收件人邮箱和名称
            $mail->Subject = $subject;  // 邮件主题
            $mail->Body = $message;  // 邮件内容
            if ($mail->send()) {
                $successCount++;
            } else {
                $errorCount++;
            }
        }
        if ($successCount > 0) {
            return '成功发送邮件给 ' . $successCount . ' 个收件人';
        } else {
            return '邮件发送失败';
        }
    } else {
        // 没有收件人
        return "暂无群发地址";
    }
}
function saveEmailInfo($subject, $message) {
    $servername = "localhost";
    $username = "root";
    $password = "root";
    $dbname = "sendmail";
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("数据库连接失败: " . $conn->connect_error);
    }
    $sql = "INSERT INTO emails (subject, message) VALUES ('$subject', '$message')";
    if ($conn->query($sql) === TRUE) {
        return "邮件信息保存成功!";
    } else {
        return "邮件信息保存失败: " . $conn->error;
    }
    $conn->close();
}
$subject = $_POST["subject"];
$message = $_POST["message"];
$sendEmail=sendEmail($subject, $message);
$saveEmailInfo=saveEmailInfo($subject, $message);
echo $sendEmail;
echo $saveEmailInfo;

这段代码实现了发送邮件和保存邮件信息的功能。

sendEmail() 函数:该函数用于群发邮件给数据库中的收件人。函数首先创建数据库连接,然后执行查询语句获取收件人列表。接着使用 PHPMailer 库创建邮件对象,并设置 SMTP 服务器、邮箱账号、密码等信息。循环遍历收件人列表,将邮件发送给每个收件人。最后返回发送结果。

saveEmailInfo() 函数:该函数用于将邮件的主题和内容保存到数据库中。函数首先创建数据库连接,然后执行插入语句将邮件主题和内容插入到 emails 表中。根据插入结果返回相应的信息。

获取表单数据:通过 $subject = $_POST["subject"]; 和 $message = $_POST["message"]; 两行代码,从表单中获取用户输入的邮件主题和内容。

调用 sendEmail() 和 saveEmailInfo() 函数:将获取到的邮件主题和内容作为参数传递给 sendEmail() 和 saveEmailInfo() 函数,进行邮件发送和保存邮件信息的操作。

其中需要注意的就是SMTP服务器地址、SMTP密码

SMTP服务器地址不同的邮箱不同,可以搜一下

SMTP密码怎么获取?

以qq邮箱为例:

23.png


WBOY
总阅读量:5341
关注

最近文章

关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

等待您完成支付...

请在支付页面继续完成支付

支付完成
重新选择支付方式