- 修改
/plus/diy.php文件:这是处理表单提交的核心文件,我们需要在这里加入发送邮件的代码。 - 确保网站服务器支持邮件发送:这是邮件功能能否实现的基础。
第一步:修改 /plus/diy.php 文件
这是最关键的一步,请务必在修改前备份原始的 diy.php 文件,以防出错。
找到并定位代码
打开 /plus/diy.php 文件,找到以下代码段(通常在文件末尾附近):
//更新到表dede_diyforms
$inquery = "INSERT INTO `{$diy->table}` (`id`, `ifcheck` $addvar) VALUES (NULL, $diy->docheck $addvalue);";
if($dsql->ExecuteNoneQuery($inquery))
{
$id = $dsql->GetLastID();
if($diy->public == 2)
{
//diy.php?action=post&diyid=ID&do=submit
$goto = "diy.php?action=list&diyid={$diy->diyid}";
$bkmsg = '发布成功,现在转向表单列表页...';
}
else
{
$goto = $dtp->GetMakeItem($diy->backmsg, -1);
$bkmsg = '发布成功,请进行后续操作。';
}
showmsg($bkmsg, $goto);
}
这段代码是成功将数据插入数据库后执行的,我们要做的就是在这段代码之前,插入发送邮件的逻辑。
插入邮件发送代码
在上述代码块之前,添加如下 PHP 代码,这段代码会收集表单数据,并调用 DedeCMS 自带的邮件发送函数。
// ---------------------------- 开始添加邮件通知代码 ----------------------------
// 获取管理员邮箱(在后台自定义表单中设置的“发布邮箱”)
$email_to = $diy->adminemail;
// 如果设置了接收邮箱,则发送邮件
if(!empty($email_to))
{
// 邮件主题
$email_subject = "您有来自网站【". $cfg_webname ."】的新表单提交";
// 邮件内容 - 开始构建
$email_body = "网站名称:". $cfg_webname ."\r\n";
$email_body .= "提交时间:".strftime("%Y-%m-%d %H:%M:%S", time())."\r\n";
$email_body .= "提交内容:\r\n";
// 循环获取表单中的每一个字段
foreach($diy->fields as $field=>$fieldinfo)
{
// 获取字段名称和值
$field_name = $fieldinfo['name'];
$field_value = ${$field}; // 注意这里的变量使用方式
// 将内容添加到邮件正文中
$email_body .= "------------------------\r\n";
$email_body .= "字段名称:". $field_name ."\r\n";
$email_body .= "字段内容:". $field_value ."\r\n";
}
// 调用DedeCMS自带的邮件发送函数
// $cfg_sendmail_blr 是发件人邮箱,通常在系统基本参数中设置
$email_from = $cfg_webname ."<". $cfg_sendmail_blr .">";
// 发送邮件
$mailtitle = $email_subject;
$mailbody = $email_body;
$mailtype = 'TEXT'; // 邮件格式,TEXT为纯文本,HTML为HTML格式
$mailto = $email_to;
// 调用邮件发送函数
if($mailtype=='HTML')
{
$mailbody = "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'><div style='font-size:14px;line-height:1.8'>".$mailbody."</div>";
}
$sm = new smtp();
$smtparr = explode(',', $cfg_smtp_server);
$sm->set_server($smtparr[0], $cfg_smtp_port, true, $cfg_smtp_usermail, $cfg_smtp_password);
$sm->mail_from($cfg_smtp_usermail, $cfg_webname);
$sm->mail_to($mailto);
$sm->mail_subject($mailtitle);
$sm->mail_body($mailbody);
$sm->sendmail();
// ---------------------------- 邮件通知代码结束 ----------------------------
}
// 继续执行原有的代码(将数据插入数据库等)
// 更新到表dede_diyforms
$inquery = "INSERT INTO `{$diy->table}` (`id`, `ifcheck` $addvar) VALUES (NULL, $diy->docheck $addvalue);";
// ... 后面的代码保持不变 ...
代码解释:
$diy->adminemail: 这是 DedeCMS 自定义表单自带的一个字段,你可以在后台创建表单时,在“高级选项”里填写“发布邮箱”,我们直接获取这个值作为收件人。$cfg_webname: 网站名称,从系统配置中读取,用于邮件主题。foreach($diy->fields as $field=>$fieldinfo): 这个循环会遍历表单中的所有字段,这样无论你增加或减少表单字段,邮件内容都能自动包含所有提交的数据,非常灵活。${$field}: 这是 PHP 的“可变变量”写法,用于动态获取表单提交的值,如果表单有一个名为name的字段,${$field}就会获取$name的值。new smtp(): 这是 DedeCMS 自带的邮件发送类,我们直接实例化它。$cfg_smtp_*: 这些是 DedeCMS 在后台“系统基本参数” -> “核心设置” 中配置的 SMTP 邮件服务器参数,如果你的服务器不支持 SMTP 方式发送邮件,邮件功能将无法实现。
第二步:确保服务器支持邮件发送
这是邮件功能能否生效的前提,DedeCMS 支持两种邮件发送方式:
使用 SMTP 推荐方式
这是最稳定、最可靠的方式,尤其适用于虚拟主机,你需要准备一个支持 SMTP 的邮箱账号(如 163、QQ、Gmail 等)。
-
登录你的 DedeCMS 后台。
-
进入 【系统】->【系统基本参数】->【核心设置】。
-
找到以下几项并填写正确信息:
- 网站发信邮箱:填写你准备好的邮箱地址,如
your_email@163.com。 - SMTP服务器:填写对应的 SMTP 地址,如
smtp.163.com。 - SMTP服务器的端口:通常是
25或465(SSL加密),具体请参考你的邮箱服务商说明。 - SMTP服务器用户名:填写你的邮箱地址,如
your_email@163.com。 - SMTP服务器密码:不是你的邮箱登录密码,而是邮箱服务商提供的“授权码”或“独立密码”,你需要在邮箱设置中开启 SMTP 服务并获取此授权码。
- 网站发信邮箱:填写你准备好的邮箱地址,如
-
保存设置。
使用 PHP 的 mail() 函数
这种方式依赖于服务器环境的配置,很多虚拟主机出于安全考虑会禁用此函数,或者发送成功率不高。
- 登录你的 DedeCMS 后台。
- 进入 【系统】->【系统基本参数】->【核心设置】。
- 确保 网站发信邮箱 填写正确。
- 【SMTP服务器】相关的项目可以留空。
- 保存设置。
第三步:后台配置自定义表单
- 在后台创建你的自定义表单(留言反馈、在线报名等)。
- 在表单的字段管理中,添加你需要的字段(如:姓名、电话、邮箱、留言内容等)。
- 关键一步:在表单的 【高级选项】 中,找到 【发布邮箱】 这一项,填入你希望接收邮件的管理员邮箱地址,这个地址就是我们第一步代码中
$email_to的来源。 - 生成表单代码,并嵌入到你的前台页面中。
常见问题排查 (FAQ)
-
Q: 为什么我提交了表单,但收不到邮件?
- A: 请按以下顺序检查:
- 检查垃圾邮件箱:邮件可能被误判为垃圾邮件。
- 检查
/plus/diy.php修改:确认代码是否正确添加,且没有语法错误。 - 检查后台邮箱设置:确认【系统基本参数】中的发信邮箱和 SMTP 信息是否正确,特别是SMTP密码,一定要用授权码。
- 检查表单设置:确认自定义表单的【发布邮箱】已经填写。
- 服务器环境:联系你的主机商,确认服务器是否开启了
mail()函数或 SMTP 服务。
- A: 请按以下顺序检查:
-
Q: 邮件内容是乱码怎么办?
- A: 主要是编码问题。
- 确保你的网站和数据库都是
UTF-8编码。 - 在构建
$email_body时,可以在开头指定编码,如$email_body = "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>".$email_body;(如果邮件格式是HTML)。 - 修改邮件发送函数,设置正确的字符集
$sm->mail_charset = 'utf-8';(smtp类支持此属性)。
- 确保你的网站和数据库都是
- A: 主要是编码问题。
-
Q: 我想给用户也发一封确认邮件怎么办?
- A: 这个需求稍微复杂一些,你需要在
diy.php中增加一个条件判断,如果用户填写了邮箱,就给他发一封确认信,你需要再写一段$sm->sendmail()的代码,收件人改为用户提交的邮箱地址,邮件内容改为感谢或确认信息。
- A: 这个需求稍微复杂一些,你需要在
通过以上步骤,你就可以成功地为 DedeCMS 自定义表单添加邮件通知功能了,祝你操作顺利!
