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

实现步骤
我们将分步进行,请务必谨慎操作,并建议在修改前备份你的网站和数据库。
第一步:创建自定义表单
你需要在DedeCMS后台创建好你的自定义表单,我们创建一个名为“在线报名”的表单,包含以下字段:
name(姓名, text)tel(电话, text)email(邮箱, text)content(留言内容, textarea)
创建完成后,DedeCMS会生成一个表单页面(/plus/diy.php)和一个数据列表(/plus/diy_list.php)。
第二步:修改 /plus/diy.php 文件
这是整个功能的核心,我们需要在这个文件中找到处理表单提交的代码,并在那里插入邮件发送逻辑。

-
找到并打开文件: 使用FTP或你的主机控制面板,找到并打开
/plus/diy.php文件。 -
定位关键代码: 在文件中找到以下代码段(通常在文件末尾附近):
// 更新到数据库 $id = $dsql->ExecuteNoneQuery($query); if($id > 0) { $goto = "diy_success.htm"; $bkmsg = '发布成功,请等待管理员处理!'; // 这里是处理成功后的逻辑 // ... }我们需要修改
if($id > 0)这个代码块。 -
添加邮件发送代码: 在
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); // ----------------------- 结束邮件发送代码 ----------------------- -
代码解释:
require_once(DEDEINC.'/mail.class.php');:引入DedeCMS自带的邮件处理类。$email_to:这是最重要的地方,填写你希望接收邮件的管理员邮箱。$email_subject:自定义邮件主题。$email_body:这里我们动态构建邮件内容,通过循环遍历$_POST数组,将用户提交的所有字段都添加到邮件正文中,并进行了htmlspecialchars转义,防止XSS攻击。$sendmail = new SendMail(); ... $sendmail->SendMail(...):这是调用DedeCMS的邮件发送方法,它会自动读取你后台“系统”->“系统基本参数”->“核心设置”里配置的SMTP服务器信息。
-
保存文件: 保存并关闭
/plus/diy.php文件。
第三步:配置DedeCMS邮件发送功能
为了让邮件能正常发送,你必须在DedeCMS后台正确配置SMTP信息。
-
登录后台:进入你的DedeCMS后台。
-
找到设置:菜单栏 -> “系统” -> “系统基本参数” -> “核心设置”。
-
找到SMTP相关项:在列表中找到以下几个选项并进行配置:
- SMTP服务器:
smtp.qq.com(QQ邮箱),smtp.163.com(163邮箱) 等。 - SMTP服务器的端口:通常是
25或465(SSL加密),QQ邮箱推荐使用465。 - SMTP用户邮箱:你的发件人邮箱,
your-email@qq.com。 - SMTP密码:注意,这里通常不是你的邮箱登录密码,而是授权码(Authorization Code),你需要在你的邮箱设置(如QQ邮箱的“账户”->“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”)中开启SMTP服务并获取授权码。
- SMTP发件人Email:和“SMTP用户邮箱”保持一致即可。
- SMTP服务器:
-
保存配置:点击“保存基本参数”。
第四步:测试
一切就绪,你需要进行测试。
- 清空缓存:在后台点击“系统” -> “一键更新网站” -> “更新缓存”。
- 前台提交表单:打开你的自定义表单页面,填写一些测试数据并提交。
- 检查邮箱:登录你在第二步中配置的
$email_to邮箱,查看是否收到了新邮件。- 如果收到了邮件,说明功能成功!
- 如果没有收到,请检查:
- 后台的SMTP配置是否正确(特别是授权码)。
- 服务器是否开启了25或465端口(有些虚拟主机或云服务器会屏蔽这些端口,需要联系服务商开启)。
- 查看DedeCMS后台的“系统”->“系统日志”,看是否有相关的错误信息。
高级优化与注意事项
-
防重复发送: 如果用户刷新“提交成功”页面,
/plus/diy.php的逻辑会再次执行,导致重复发送邮件,为了防止这种情况,可以在成功发送邮件后,将用户重定向到一个纯静态的“成功页面”,而不是留在diy.php。 修改if($id > 0)中的$goto变量:$goto = "diy_success.htm"; // 确保这个页面存在
这样,用户提交后会被跳转到
diy_success.htm,刷新这个页面不会再次触发表单提交逻辑。 -
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>"; -
安全性:
- 始终对用户输入进行过滤和转义,如代码中使用的
htmlspecialchars。 - 不要将
$email_to写死在代码中,可以考虑将其存入数据库或配置文件,方便后台修改。
- 始终对用户输入进行过滤和转义,如代码中使用的
通过以上步骤,你就可以成功地为DedeCMS自定义表单添加群发邮件功能了,这个方法稳定可靠,并且遵循了DedeCMS的框架结构。
