核心概念解析
我们要理解 mail 和 txt 这两个文件夹在DedeCMS邮件系统中的角色:

(图片来源网络,侵删)
txt 文件夹:邮件模板库
- 位置:
/plus/目录下。 - 作用: 这个文件夹是DedeCMS存放邮件模板文件的地方,邮件模板不是最终要发送的邮件内容,而是一个带有“占位符”的HTML或纯文本文件。
- 占位符: 模板中会使用一些特殊标记(如
{dede:field.name/})来代表动态内容,当发送邮件时,系统会用实际的数据(如用户名、订单号、文章标题等)替换掉这些占位符。 - 常见文件:
sendmail.txt: 最常用的模板,通常用于发送系统通知、会员注册验证、密码重置等,默认是纯文本格式。htmlmail.txt: 用于发送HTML格式的邮件,可以包含图片、样式、链接等,视觉效果更好。- 你也可以在这个文件夹里创建自己的模板文件,
promotion.txt(活动推广)、news_letter.txt(电子报) 等。
mail 文件夹:邮件发送程序
- 位置:
/include/目录下。 - 作用: 这个文件夹包含了DedeCMS处理邮件发送的核心PHP文件,它负责读取邮件模板、替换占位符、连接邮件服务器,并最终将邮件发送出去。
- 关键文件:
sendmail.php: 最重要的文件,这是执行邮件发送的脚本,我们通常通过调用这个文件来触发邮件群发。config_smtp.php: 邮件服务器配置文件,用于设置发送邮件所需的SMTP服务器地址、端口、账号和密码。.cls_smtp.php: SMTP协议的底层实现类,封装了与邮件服务器通信的细节。
邮件群发的完整流程
下面我们通过一个完整的流程,从配置到执行,来理解如何使用这两个文件夹进行邮件群发。
配置邮件服务器
在发送邮件之前,必须先告诉DedeCMS你的邮箱信息。
-
找到配置文件: 打开
/include/mail/config_smtp.php。 -
修改配置信息:
(图片来源网络,侵删)// $smtpserver = "smtp.qq.com"; // SMTP服务器 // $smtpserverport = 25; // SMTP服务器端口 // $smtpusermail = "your_email@qq.com"; // 你的邮箱 // $smtpuser = "your_email@qq.com"; // SMTP服务器的用户名 (通常和邮箱一样) // $smtppass = "your_password"; // SMTP服务器的密码 (注意:很多邮箱需要使用授权码,不是登录密码!) // $mailtype = "TXT"; // 邮件格式 (TXT 或 HTML) // $smtp = array ( // "host"=>$smtpserver, // "port"=>$smtpserverport, // "user"=>$smtpuser, // "pass"=>$smtppass // );
重要提示:
- 授权码: 对于QQ邮箱、163、Gmail等,密码通常指“客户端授权码”,你需要在你的邮箱设置中开启SMTP服务并获取授权码。
- 端口: 常见端口有
25(非加密),465(SSL加密),587(TLS加密),建议使用465或587,更安全。 $mailtype: 如果你想发送HTML邮件,就设置为"HTML",此时系统会默认去调用htmlmail.txt模板。
准备或修改邮件模板
-
打开模板文件: 编辑
/plus/txt/sendmail.txt(或htmlmail.txt)。 -
: 模板文件里可以写固定的文本,也可以使用DedeCMS的模板标签。
-
纯文本示例 (
sendmail.txt):
(图片来源网络,侵删)尊敬的{dede:field.name/},您好! 感谢您注册我们的网站,您的账号信息如下: 用户名:{dede:field.name/} 邮箱:{dede:field.email/} 请点击以下链接激活您的账户: {dede:global.cfg_basehost/}/member/index_do.php?fmdo=user&dopost=checkreg&uid={dede:field.userid/}&key={dede:field.randcode/} 如果无法点击,请将链接复制到浏览器中打开。 此致, 敬礼! [网站名称] -
HTML示例 (
htmlmail.txt):<html> <head> <meta charset="utf-8"> <title>欢迎加入我们!</title> </head> <body> <p>尊敬的<strong>{dede:field.name/}</strong>,您好!</p> <p>感谢您注册我们的网站,您的账号信息如下:</p> <table border="1"> <tr><td>用户名</td><td>{dede:field.name/}</td></tr> <tr><td>邮箱</td><td>{dede:field.email/}</td></tr> </table> <p>请点击以下按钮激活您的账户:</p> <a href="{dede:global.cfg_basehost/}/member/index_do.php?fmdo=user&dopost=checkreg&uid={dede:field.userid/}&key={dede:field.randcode/}" style="padding: 10px 15px; background-color: #4CAF50; color: white; text-decoration: none;">激活账户</a> <p>如果按钮无法点击,请将链接复制到浏览器中打开。</p> <p>此致,<br>敬礼!<br>[网站名称]</p> </body> </html>
-
调用发送程序进行群发
这是最关键的一步,你需要在某个PHP文件中调用 sendmail.php 来触发发送,通常有两种方式:
通过后台手动触发(常用)
-
创建触发文件: 在网站根目录创建一个新文件,
send_all_mail.php。 -
编写代码: 将以下代码粘贴到
send_all_mail.php中。<?php require_once (dirname(__FILE__) . "/include/common.inc.php"); require_once DEDEINC."/mail.cls.php"; set_time_limit(0); // 防止脚本超时 // 1. 获取所有需要发送邮件的用户 $dsql->SetQuery("SELECT id, uname, email FROM `dede_member` WHERE email != ''"); $dsql->Execute(); $user_count = $dsql->GetTotalRow(); // 获取总用户数,用于进度提示 echo "开始发送邮件,共需发送给 {$user_count} 位用户...<br>"; $i = 0; // 2. 遍历每个用户,并发送邮件 while ($row = $dsql->GetArray()) { $i++; // 准备替换模板的数据 $emailbody = " 尊敬的".$row['uname'].",您好! 这是一封系统测试邮件,用于验证邮件群发功能。 您的用户信息如下: 用户名:".$row['uname']." 用户ID:".$row['id']." 邮箱:".$row['email']." 感谢您的关注! [你的网站名称] "; // 调用邮件发送类 $mailtype = 'TXT'; // 如果是HTML邮件,则设置为 'HTML' $smtp = new smtp(); $smtp->smtp_send($row['email'], '【网站通知】测试邮件', $emailbody, $mailtype); echo "已发送给第 {$i} / {$user_count} 位用户: {$row['email']}<br>"; flush(); // 立即输出缓冲区内容 ob_flush(); // 关闭缓冲区 sleep(1); // 礼貌性暂停1秒,避免邮件服务器拒绝连接 } echo "邮件群发完成!"; ?> -
执行: 在浏览器中访问
http://你的域名/send_all_mail.php,脚本就会开始执行并逐条发送邮件。
通过后台功能触发(如会员管理)
DedeCMS的会员管理模块中,本身就集成了邮件群发功能,其原理也是调用了 sendmail.php。
- 登录后台: 进入“核心” -> “会员管理” -> “会员列表”。
- 选择会员: 勾选你想要发送邮件的会员,或者点击“全选”。
- 执行操作: 在列表下方的“批量操作”下拉菜单中,选择“发送邮件”。
- 填写信息:
- 邮件主题: 填写邮件的标题。
- : 这里可以直接写邮件内容,也可以使用模板,系统会自动使用
/plus/txt/sendmail.txt作为模板,并将选中的会员信息(如用户名)替换到模板中。
- 点击“确定发送”: 系统会开始批量发送邮件。
注意事项与最佳实践
- 邮件服务器限制: 不要在短时间内发送大量邮件,这极易被邮件服务器(如QQ、Gmail)识别为垃圾邮件发送行为,导致你的IP或域名被列入黑名单,使用
sleep()函数控制发送频率是很好的做法。 - 队列处理: 对于超大规模的邮件群发(如数万封),直接循环执行可能会导致服务器超时或崩溃,更专业的做法是使用队列系统:先生成一个任务队列(将所有待发送的邮件信息存入数据库表),然后通过一个计划任务(如Linux的cron job)每隔一段时间执行一次发送任务,每次处理少量邮件。
- 测试先行: 在进行大规模群发前,务必先用一两个测试邮箱地址进行测试,确保邮件模板、内容和发送逻辑都正确无误。
- 内容合规: 确保你的邮件内容不包含垃圾邮件的关键词,并提供明确的退订方式,以提高邮件的送达率和打开率。
- 附件: 如果需要发送附件,你需要修改
sendmail.php或使用更高级的邮件类(如PHPMailer),因为DedeCMS自带的邮件类对附件的支持比较有限。
txt文件夹是“模板库”,存放的是带有占位符的邮件草稿。mail文件夹是“引擎车间”,存放的是处理邮件发送逻辑的PHP代码。- 邮件群发的核心流程是:配置服务器 (
config_smtp.php) -> 准备模板 (txt/) -> 调用发送程序 (sendmail.php),并通过一个循环脚本将模板内容动态填充并发送给不同的收件人。
