文件位置与核心作用
- 文件位置:
/include/mail.class.php - 核心作用: 封装了邮件发送的逻辑,为织梦CMS的各个模块(如会员注册、密码重置、系统通知、订单提醒等)提供一个统一的、可配置的邮件发送接口。
核心类:DedeMailSend
mail.class.php 文件的核心是一个名为 DedeMailSend 的类,我们来看一下这个类的主要组成部分和功能。

(图片来源网络,侵删)
1 属性 (成员变量)
这些属性用于存储邮件发送的配置信息和状态。
| 属性名 | 类型 | 描述 |
|---|---|---|
smtp_host |
string | SMTP服务器地址,smtp.qq.com |
smtp_port |
int | SMTP服务器端口,通常是 25, 465 (SSL), 587 (TLS) |
smtp_user |
string | SMTP登录用户名,通常是你的邮箱地址 |
smtp_pass |
string | SMTP登录密码,注意: 这里通常是授权码,而不是邮箱登录密码 |
mailer |
string | 邮件发送程序类型,织梦支持 mail (PHP内置函数) 和 smtp 两种方式 |
from |
string | 发件人邮箱地址 |
fromname |
string | 发件人名称 |
CharSet |
string | 邮件字符编码,默认为 UTF-8 |
priority |
int | 邮件优先级,默认为 3 (普通) |
HTML |
bool | 是否为HTML格式邮件,默认为 false (纯文本) |
attachment |
array | 邮件附件列表,存储附件路径信息 |
error_msg |
string | 存储邮件发送过程中的错误信息 |
2 构造函数 __construct()
构造函数用于初始化邮件发送对象。
function __construct($smtp_host = '', $smtp_port = '', $smtp_user = '', $smtp_pass = '')
{
// ... 初始化代码 ...
// 如果参数为空,则从织梦的全局配置中读取
if($smtp_host == '') {
$this->smtp_host = trim($GLOBALS['cfg_smtp_host']);
} else {
$this->smtp_host = $smtp_host;
}
// ... 同样处理其他参数 ...
}
关键点:
- 当你
new DedeMailSend()时,如果不提供任何参数,它会自动从织梦的全局配置变量($GLOBALS['cfg_XXX'])中读取SMTP信息,这些全局变量通常在/include/common.inc.php中被初始化,其值来源于后台的“系统” -> “系统基本参数” -> “核心设置”。 - 这意味着,只要你在后台正确配置了SMTP参数,你的代码中就可以直接使用
new DedeMailSend(),它会自动获取配置。
3 主要方法 (功能函数)
3.1 SetFrom($from, $fromname = '')
设置发件人信息。

(图片来源网络,侵删)
$from: 发件人邮箱。$fromname: 发件人昵称。
3.2 AddAddress($address, $name = '')
添加收件人。
$address: 收件人邮箱地址。$name: 收件人昵称。- 注意: 这个方法可以被多次调用,以添加多个收件人。
3.3 AddAttachment($path, $name = '')
添加附件。
$path: 附件在服务器上的完整路径。$name: 附件在邮件中显示的文件名(可选)。
3.4 IsHTML($ishtml = true)
设置邮件格式。
$ishtml:true表示发送HTML邮件,false表示发送纯文本邮件。
3.5 SendMail($subject, $body)
这是最核心的方法,用于执行邮件发送。

(图片来源网络,侵删)
$subject: 邮件主题。$body: 邮件正文。- 返回值: 发送成功返回
true,失败返回false,如果失败,可以通过$this->error_msg获取错误信息。
内部逻辑:
- 根据属性
mailer的值(mail或smtp)来决定调用哪个底层发送函数。 - 如果是
smtp,它会通过fsockopen或pfsockopen与SMTP服务器建立连接,然后遵循SMTP协议(如EHLO,AUTH LOGIN,MAIL FROM,RCPT TO,DATA)来完成邮件的发送。 - 如果是
mail,它直接调用PHP内置的mail()函数。
如何在织梦二次开发中使用
了解了类的结构后,我们来看一个实际的应用场景:在用户提交表单后,发送一封HTML格式的通知邮件。
假设我们要在自定义的表单处理页面 /plus/my_form.php 中发送邮件。
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
require_once(DEDEINC.'/mail.class.php'); // 引入邮件类
// 1. 获取收件人和邮件内容(这里假设从POST请求中获取)
$toEmail = isset($_POST['email']) ? $_POST['email'] : '';
$subject = "感谢您的提交!";
$htmlBody = "
<h1>您好,这是一封来自织梦CMS的测试邮件。</h1>
<p>我们已收到您的信息,感谢您的关注。</p>
<p>此致<br>敬礼!</p>
";
// 2. 实例化邮件发送对象
// 不传参数,它会自动使用后台配置的SMTP信息
$mail = new DedeMailSend();
// 3. 设置邮件内容
$mail->SetFrom($GLOBALS['cfg_adminemail'], $GLOBALS['cfg_webname']); // 使用后台配置的发件人
$mail->AddAddress($toEmail); // 添加收件人
$mail->IsHTML(true); // 设置为HTML格式
$mail->Subject = $subject; // 设置主题
$mail->Body = $htmlBody; // 设置正文
// 4. 发送邮件
if ($mail->SendMail($subject, $htmlBody)) {
echo "邮件发送成功!";
} else {
echo "邮件发送失败!错误信息:" . $mail->error_msg;
}
?>
代码解析:
- 引入文件: 必须先引入
common.inc.php来加载织梦的全局环境,然后引入mail.class.php。 - 实例化:
new DedeMailSend()创建了一个邮件对象。 - 配置: 通过一系列方法设置发件人、收件人、邮件格式、主题和正文。
- 发送: 调用
SendMail()方法,并根据返回值判断是否成功。
常见问题排查 (FAQ)
使用织梦发送邮件时,最常见的问题就是发送失败。
Q1: 为什么配置了SMTP,邮件还是发送失败?
A: 99% 的问题出在SMTP配置上。
- SMTP服务器地址: 确认正确,例如QQ邮箱是
smtp.qq.com,163邮箱是smtp.163.com。 - SMTP端口: 确认正确。
- 25: 普通端口,部分运营商可能屏蔽。
- 465: SSL加密端口,推荐使用。
- 587: TLS加密端口,也推荐。
- SMTP用户名: 通常是你的完整邮箱地址,如
your@qq.com。 - SMTP密码: 这是最容易出错的地方! 必须使用邮箱的“授权码”,而不是你的QQ密码或登录密码,你需要在邮箱的设置中开启SMTP服务并获取授权码。
- 加密方式: 在后台配置时,选择对应的加密方式(SSL/TLS),这会影响端口的填写。
Q2: 提示 "Failed to connect to mail server" 或类似连接错误?
A:
- 检查
smtp_host和smtp_port是否正确。 - 检查服务器防火墙是否阻止了对SMTP端口(如25, 465, 587)的出站连接,可以联系你的VPS或主机商。
- 尝试更换一个更稳定的SMTP服务商,如SendGrid、Mailgun等,而不是使用个人邮箱。
Q3: 邮件发送成功,但对方收不到(或在垃圾箱)?
A:
- 垃圾邮件规则: 检查邮件主题和正文是否包含敏感词(如“优惠”、“免费”、“VIAGRA”等),这很容易被当成垃圾邮件。
- 发件人信誉: 如果你使用的是个人邮箱(如QQ, 163)作为SMTP服务器,频繁发送邮件会导致IP或账号被列入黑名单,建议使用专业的邮件发送服务。
- DNS记录: 检查域名的
SPF和DKIM记录是否正确配置,这能帮助接收方验证邮件确实来自你的服务器,提高邮件的送达率。
Q4: 想使用PHP的 mail() 函数怎么办?
A:
在后台“系统基本参数” -> “核心设置”中,将“是否启用SMTP”设置为“否”,或者将 mailer 属性在代码中显式设置为 'mail'。
$mail = new DedeMailSend(); $mail->mailer = 'mail'; // 强制使用PHP mail() 函数 // ... 其他设置 ...
注意: mail() 函数的发送成功率受服务器环境影响很大,通常不推荐在生产环境中使用。
mail.class.php 是织梦CMS一个设计良好、功能完备的邮件发送组件,它的核心优势在于:
- 配置统一: 邮件参数在后台统一配置,代码中无需硬编码。
- 协议支持: 同时支持
mail()和smtp两种方式,灵活适应不同服务器环境。 - 功能完整: 支持多收件人、HTML格式、附件等常用邮件功能。
掌握它的使用方法和常见问题的排查思路,对于任何织梦开发者来说都是一项必备技能。
