- 修改现有邮件发送行为:比如修改邮件模板、更换邮件发送方式、增加发送条件等。
- 在新的业务逻辑中调用邮件发送功能:比如用户下单后给管理员发邮件、有新评论时给博主发邮件等。
下面我将从基础到进阶,为你详细解析。

核心文件与函数解析
在开始开发前,你需要先了解 DedeCMS 邮件系统的核心。
核心文件位置
/include/mail.class.php:这是邮件发送的核心类文件,包含了邮件发送的各种方法。/include/sendmail.php:这是一个封装好的、方便调用的发送函数文件,大部分场景下直接调用它即可。/templets/mail/:存放邮件模板文件的目录,每个邮件功能都有一个对应的模板文件,register.txt(会员注册通知)、findpassword.txt(找回密码通知)等。
核心函数 SendMail()
这是最常用、最简单的邮件发送函数,定义在 sendmail.php 中。
函数签名:
function SendMail($to, $subject, $body, $type = 'TEXT', $attachment = '')
参数说明:

$to(string): 收件人邮箱地址。$subject(string): 邮件主题。$body(string): 邮件正文内容。$type(string): 邮件格式,默认为'TEXT'(纯文本),也可以是'HTML'(HTML格式)。$attachment(string): 附件路径,可选。
使用示例:
// 引入邮件发送函数
require_once(DEDEINC.'/sendmail.php');
$to = 'user@example.com';
$subject = '来自网站的系统通知';
$body = '这是一封测试邮件,如果您收到此邮件,说明邮件系统配置正常。';
// 调用函数发送邮件
if (SendMail($to, $subject, $body)) {
echo '邮件发送成功!';
} else {
echo '邮件发送失败!';
}
场景一:修改现有邮件发送行为
这个场景通常用于定制化 DedeCMS 自带功能,比如修改会员注册后的欢迎邮件。
示例:修改会员注册邮件模板
默认的注册邮件模板可能比较简单,你可能想在邮件中加入网站 Logo、会员优惠信息等。
步骤:

-
找到模板文件 模板文件位于
/templets/mail/目录下,对于会员注册,文件名通常是register.txt。 -
编辑模板内容 打开
register.txt,你会看到类似这样的内容:欢迎您注册成为{dede:global.cfg_webname/}的会员! 您的注册信息如下: 用户名:{dede:username/} 密码:{dede:password/} 请妥善保管您的账户信息。 {dede:global.cfg_webname/} 敬上这里
{dede:...}是 DedeCMS 的模板标签,可以调用系统变量或数据。 -
自定义模板 你可以自由修改这个文件,加入 HTML 代码、图片链接(使用绝对地址)、CSS 样式等,并保持
{dede:...}标签的完整性。<html> <head> <meta charset="utf-8"> <title>欢迎加入我们!</title> <style> body { font-family: Arial, sans-serif; } .header img { max-width: 200px; } </style> </head> <body> <div class="header"> <img src="https://www.yourwebsite.com/logo.png" alt="网站Logo"> </div> <h2>尊敬的 {dede:username/},您好!</h2> <p>热烈欢迎您注册成为 <strong>{dede:global.cfg_webname/}</strong> 的尊贵会员!</p> <p>您的账户信息如下:</p> <p>用户名:<strong>{dede:username/}</strong></p> <p>初始密码:<strong>{dede:password/}</strong></p> <p>为了您的账户安全,请尽快登录并修改密码。</p> <p>祝您使用愉快!</p> <hr> <p>此邮件由系统自动发送,请勿直接回复。</p> <p>© {dede:global.cfg_webname/}</p> </body> </html> -
修改发送函数以支持 HTML DedeCMS 默认的邮件发送可能只支持纯文本,你需要找到调用
SendMail的地方,并修改$type参数。 会员注册的邮件发送逻辑在/member/reg_new.php文件中,你需要找到类似SendMail($email, $subject, $msg);的代码,并将其修改为:SendMail($email, $subject, $msg, 'HTML');
场景二:在新的业务逻辑中调用邮件发送功能
这是更常见的二次开发需求,比如在用户提交表单、发布文章、下单等操作后触发邮件通知。
示例:用户提交表单后,给管理员发送一封通知邮件
假设你创建了一个“联系我们”的表单,提交后希望网站管理员收到一封包含表单内容的邮件。
步骤:
-
创建表单页面 在你的模板文件(
contact.htm)中创建一个表单。<form action="/plus/diy.php" method="post"> <input type="hidden" name="dopost" value="send"> <input type="hidden" name="diyid" value="1"> <!-- 假设表单ID为1 --> <p>姓名:<input type="text" name="name" required></p> <p>邮箱:<input type="email" name="email" required></p> <p>留言:<textarea name="message" required></textarea></p> <p><input type="submit" value="提交"></p> </form> -
修改处理文件
/plus/diy.php这是 DedeCMS 处理自定义表单的核心文件,我们需要在它成功保存数据后,加入邮件发送逻辑。打开
/plus/diy.php,找到//发布完成,运行此命令这行注释的下方,这里通常是插入自定义代码的最佳位置。在
//处理完毕之前,添加如下 PHP 代码:// --- 自定义邮件发送代码开始 --- if($dopost == 'send') { // 1. 获取管理员邮箱 (从系统配置中获取) $admin_email = $cfg_adminemail; // $cfg_adminemail 是 DedeCMS 的全局变量 // 2. 获取表单提交的数据 $form_name = isset($name) ? $name : ''; $form_email = isset($email) ? $email : ''; $form_message = isset($message) ? $message : ''; // 3. 构建邮件内容 $subject = '【新表单提交】来自网站的联系信息'; $body = "您收到了一个新的表单提交,详情如下:\n\n"; $body .= "提交人姓名:{$form_name}\n"; $body .= "提交人邮箱:{$form_email}\n"; $body .= "留言内容:{$form_message}\n\n"; $body .= "提交时间:" . date('Y-m-d H:i:s'); // 4. 引入并发送邮件 require_once(DEDEINC.'/sendmail.php'); if (SendMail($admin_email, $subject, $body)) { // 可以在这里设置一个成功提示,或者记录日志 // $successmsg = '提交成功,并已通知管理员!'; } else { // 邮件发送失败,但表单已保存,可以选择记录错误日志 // $errormsg = '提交成功,但通知邮件发送失败!'; } } // --- 自定义邮件发送代码结束 --- -
代码解释
if($dopost == 'send'):确保只在表单提交时执行这段代码。$cfg_adminemail:这是 DedeCMS 系统配置中的管理员邮箱,直接调用即可。$name,$email,$message:这些是你在表单中定义的name属性值,DedeCMS 会自动将它们解析为变量。require_once(DEDEINC.'/sendmail.php'):引入邮件发送函数。SendMail(...):调用函数,将管理员邮箱作为收件人,将构建好的内容作为邮件正文。
高级主题:配置与更换邮件发送方式
DedeCMS 默认使用 PHP 的 mail() 函数发送邮件,这种方式在本地环境或未配置好邮件服务器的服务器上经常失败,或者容易被当成垃圾邮件。
更好的方式是使用 SMTP 协议发送邮件,通过第三方邮件服务商(如 QQ邮箱、163邮箱、SendGrid 等)中转,成功率更高。
如何配置 SMTP 发送?
-
找到配置文件 DedeCMS 的邮件配置通常在后台的系统设置里,但有时也需要直接修改配置文件,主要配置项在
/data/common.inc.php或/include/config_base.php中,更推荐的方式是在后台设置。 -
后台设置路径 登录 DedeCMS 后台 -> 系统 -> 系统基本参数 -> 核心设置 -> 找到 “站点发信EMAIL” 和 “smtp服务” 相关的选项。
-
配置 SMTP 参数 如果后台提供了 SMTP 配置项,填写以下信息:
- SMTP 服务器:
smtp.qq.com(QQ邮箱),smtp.163.com(163邮箱)。 - SMTP 端口:通常是
465(SSL加密) 或587(STARTTLS加密)。 - SMTP 用户名:你的邮箱地址,
your@qq.com。 - SMTP 密码:注意,这里不是你的邮箱登录密码,而是授权码,你需要在邮箱的设置中开启 SMTP 服务并获取授权码。
- 发信人邮箱:和 SMTP 用户名一致即可。
- SMTP 服务器:
-
修改
mail.class.php(如果后台配置无效) 有时 DedeCMS 版本不同,后台配置可能不生效,这时需要直接修改mail.class.php文件。 打开/include/mail.class.php,找到function SendMail()方法,查看它如何读取配置,通常它会读取cfg_smtp_server,cfg_smtp_port,cfg_smtp_user,cfg_smtp_pass等全局变量,你需要确保这些变量在config_base.php或common.inc.php中被正确定义。在
common.inc.php中手动添加(如果不存在):$cfg_smtp_server = 'smtp.qq.com'; $cfg_smtp_port = '465'; $cfg_smtp_user = 'your@qq.com'; $cfg_smtp_pass = 'your_qq_email_auth_code'; // 授权码 $cfg_smtp_ssl = 'ssl'; // 指定加密方式
最佳实践与注意事项
-
性能考虑:邮件发送是 I/O 密集型操作,可能会阻塞页面加载,对于用户触发的操作(如注册、下单),建议使用“异步发送”或“队列”机制。
- 简单异步:在
SendMail调用前,使用ignore_user_abort(true);和ob_start();等函数,让脚本在用户关闭页面后继续执行。 - 队列:将邮件任务写入数据库或 Redis,然后由一个定时任务(Cron Job)去处理发送,这是最健壮的方式。
- 简单异步:在
-
错误处理:务必检查
SendMail的返回值,并做好日志记录,当邮件发送失败时,你应该知道是哪里出了问题。if (!SendMail($to, $subject, $body)) { // 记录错误到日志文件 $error_log = date('[Y-m-d H:i:s]') . " Mail send failed to {$to}. Reason: " . mysql_error() . "\n"; file_put_contents(DEDEDATA.'/mail_error.log', $error_log, FILE_APPEND); // 给用户一个友好的提示,而不是直接显示错误 ShowMsg('邮件发送失败,请联系管理员', '-1'); exit(); } -
HTML 邮件:发送 HTML 邮件时,确保图片使用绝对路径 (
src="https://..."),并且内联 CSS 样式,以保证在不同邮件客户端中都能正常显示。 -
垃圾邮件:避免使用过于营销化的词语,确保邮件内容有明确的价值,并且提供退订方式,否则容易被标记为垃圾邮件。
希望这份详细的指南能帮助你顺利完成 DedeCMS 的邮件二次开发!
