dede自定义表单群发邮件如何实现?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 DEDE建站 正文

下面我将为你提供一个稳定、安全且易于维护的修改方案,这个方案的核心是:在用户提交表单时,触发一个邮件发送函数,将表单数据作为邮件内容发送给指定的管理员。

dede自定义表单群发邮件
(图片来源网络,侵删)

实现步骤

我们将分步进行,请务必谨慎操作,并建议在修改前备份你的网站和数据库


第一步:创建自定义表单

你需要在DedeCMS后台创建好你的自定义表单,我们创建一个名为“在线报名”的表单,包含以下字段:

  • name (姓名, text)
  • tel (电话, text)
  • email (邮箱, text)
  • content (留言内容, textarea)

创建完成后,DedeCMS会生成一个表单页面(/plus/diy.php)和一个数据列表(/plus/diy_list.php)。


第二步:修改 /plus/diy.php 文件

这是整个功能的核心,我们需要在这个文件中找到处理表单提交的代码,并在那里插入邮件发送逻辑。

dede自定义表单群发邮件
(图片来源网络,侵删)
  1. 找到并打开文件: 使用FTP或你的主机控制面板,找到并打开 /plus/diy.php 文件。

  2. 定位关键代码: 在文件中找到以下代码段(通常在文件末尾附近):

    // 更新到数据库
    $id = $dsql->ExecuteNoneQuery($query);
    if($id > 0)
    {
        $goto = "diy_success.htm";
        $bkmsg = '发布成功,请等待管理员处理!';
        // 这里是处理成功后的逻辑
        // ...
    }

    我们需要修改 if($id > 0) 这个代码块。

  3. 添加邮件发送代码: 在 if($id > 0) 的大括号内,$bkmsg = '发布成功...'; 这行代码的后面,添加以下代码:

    // ----------------------- 开始添加邮件发送代码 -----------------------
    // 1. 引入邮件发送类
    // 注意:这个路径需要根据你的DedeCMS版本调整,通常是 /include/
    require_once(DEDEINC.'/mail.class.php');
    // 2. 设置收件人邮箱(替换成你自己的邮箱)
    $email_to = 'your-email@example.com'; // <--- 修改这里!
    // 3. 设置邮件主题
    $email_subject = '【网站新消息】来自“在线报名”表单的新提交';
    // 4. 构建邮件正文
    // 从POST数据中获取表单字段值,注意过滤
    $email_body = "您有新的表单提交,详情如下:\n\n";
    $email_body .= "提交时间:".strftime("%Y-%m-%d %H:%M:%S")."\n";
    $email_body .= "-------------------------\n";
    // 循环遍历所有表单字段,并添加到邮件正文
    // 使用 $diy->addFieldInfos() 可以获取到所有字段信息
    $diy->addFieldInfos();
    foreach($diy->items as $field=>$item)
    {
        // 安全地获取并转义POST数据
        $field_value = empty($_POST[$field]) ? '' : htmlspecialchars($_POST[$field], ENT_QUOTES, 'UTF-8');
        $email_body .= $item['itemname'] . ":{$field_value}\n";
    }
    $email_body .= "-------------------------\n";
    $email_body .= "请登录后台查看详情:". $cfg_cmspath ."/plus/diy_list.php?diyid=". $diy->diyid;
    // 5. 创建邮件对象并发送
    $mailtitle = $email_subject;
    $mailbody = $email_body;
    // 使用DedeCMS自带的发送函数,它会读取后台的邮件配置
    $mailtype = 'HTML'; // 可以设置为 'TEXT' 或 'HTML'
    $sendmail = new SendMail();
    $sendmail->IsHTML($mailtype);
    $sendmail->SendMail($email_to, $mailtitle, $mailbody);
    // ----------------------- 结束邮件发送代码 -----------------------
  4. 代码解释

    • require_once(DEDEINC.'/mail.class.php');:引入DedeCMS自带的邮件处理类。
    • $email_to这是最重要的地方,填写你希望接收邮件的管理员邮箱。
    • $email_subject:自定义邮件主题。
    • $email_body:这里我们动态构建邮件内容,通过循环遍历 $_POST 数组,将用户提交的所有字段都添加到邮件正文中,并进行了 htmlspecialchars 转义,防止XSS攻击。
    • $sendmail = new SendMail(); ... $sendmail->SendMail(...):这是调用DedeCMS的邮件发送方法,它会自动读取你后台“系统”->“系统基本参数”->“核心设置”里配置的SMTP服务器信息。
  5. 保存文件: 保存并关闭 /plus/diy.php 文件。


第三步:配置DedeCMS邮件发送功能

为了让邮件能正常发送,你必须在DedeCMS后台正确配置SMTP信息。

  1. 登录后台:进入你的DedeCMS后台。

  2. 找到设置:菜单栏 -> “系统” -> “系统基本参数” -> “核心设置”。

  3. 找到SMTP相关项:在列表中找到以下几个选项并进行配置:

    • SMTP服务器smtp.qq.com (QQ邮箱), smtp.163.com (163邮箱) 等。
    • SMTP服务器的端口:通常是 25465 (SSL加密),QQ邮箱推荐使用 465
    • SMTP用户邮箱:你的发件人邮箱,your-email@qq.com
    • SMTP密码注意,这里通常不是你的邮箱登录密码,而是授权码(Authorization Code),你需要在你的邮箱设置(如QQ邮箱的“账户”->“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”)中开启SMTP服务并获取授权码。
    • SMTP发件人Email:和“SMTP用户邮箱”保持一致即可。
  4. 保存配置:点击“保存基本参数”。


第四步:测试

一切就绪,你需要进行测试。

  1. 清空缓存:在后台点击“系统” -> “一键更新网站” -> “更新缓存”。
  2. 前台提交表单:打开你的自定义表单页面,填写一些测试数据并提交。
  3. 检查邮箱:登录你在第二步中配置的 $email_to 邮箱,查看是否收到了新邮件。
    • 如果收到了邮件,说明功能成功!
    • 如果没有收到,请检查:
      • 后台的SMTP配置是否正确(特别是授权码)。
      • 服务器是否开启了25或465端口(有些虚拟主机或云服务器会屏蔽这些端口,需要联系服务商开启)。
      • 查看DedeCMS后台的“系统”->“系统日志”,看是否有相关的错误信息。

高级优化与注意事项

  1. 防重复发送: 如果用户刷新“提交成功”页面,/plus/diy.php 的逻辑会再次执行,导致重复发送邮件,为了防止这种情况,可以在成功发送邮件后,将用户重定向到一个纯静态的“成功页面”,而不是留在 diy.php。 修改 if($id > 0) 中的 $goto 变量:

    $goto = "diy_success.htm"; // 确保这个页面存在

    这样,用户提交后会被跳转到 diy_success.htm,刷新这个页面不会再次触发表单提交逻辑。

  2. HTML格式邮件: 如果你希望邮件内容更美观,可以将 $mailtype 设置为 'HTML',并修改 $email_body 的内容为HTML格式。

    $mailtype = 'HTML';
    $email_body = "<h2>您有新的表单提交</h2>";
    $email_body .= "<p>提交时间:" . strftime("%Y-%m-%d %H:%M:%S") . "</p>";
    $email_body .= "<table border='1' cellpadding='5' cellspacing='0'>";
    foreach($diy->items as $field=>$item)
    {
        $field_value = empty($_POST[$field]) ? '' : htmlspecialchars($_POST[$field], ENT_QUOTES, 'UTF-8');
        $email_body .= "<tr><td><strong>" . $item['itemname'] . "</strong></td><td>{$field_value}</td></tr>";
    }
    $email_body .= "</table>";
    $email_body .= "<p><a href='".$cfg_cmspath ."/plus/diy_list.php?diyid=". $diy->diyid."'>请登录后台查看详情</a></p>";
  3. 安全性

    • 始终对用户输入进行过滤和转义,如代码中使用的 htmlspecialchars
    • 不要将 $email_to 写死在代码中,可以考虑将其存入数据库或配置文件,方便后台修改。

通过以上步骤,你就可以成功地为DedeCMS自定义表单添加群发邮件功能了,这个方法稳定可靠,并且遵循了DedeCMS的框架结构。

-- 展开阅读全文 --
头像
dede如何调用自定义表单数据?
« 上一篇 今天
织梦php循环调用标签,如何正确实现嵌套与数据遍历?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]