mail.class.php 是一个用于发送邮件的PHP类文件,它封装了两种主流的邮件发送方式:

(图片来源网络,侵删)
- PHP
mail()函数:这是PHP内置的函数,依赖于服务器的本地邮件发送系统(如Sendmail, Postfix等),它的优点是简单,不需要额外配置,但缺点是容易被当成垃圾邮件,且功能有限(如不支持附件、HTML内容等)。 - SMTP 协议:这是通过第三方邮件服务器(如QQ邮箱、163邮箱、企业邮箱等)来发送邮件的方式,这是目前网站应用中最主流、最可靠的方式,因为它利用了专业邮件服务商的信誉,能有效降低邮件进入垃圾箱的概率,并且功能强大(支持附件、HTML等)。
这个类的主要目标就是提供一个统一、简单的接口,让开发者可以方便地配置和使用这两种邮件发送方式。
核心类与方法解析
这个文件的核心是一个名为 smtp 的类,虽然名字叫 smtp,但它也处理了 mail() 函数的发送逻辑。
构造函数 __construct()
function __construct($params = array())
- 作用:初始化邮件发送器,设置默认参数。
- 参数:
$params是一个关联数组,用于覆盖默认配置。 - 关键默认配置:
$this->charSet = 'UTF-8':邮件编码,默认为UTF-8。$this->contentType = 'text'类型,默认为纯文本'text',可设为'html'。$this->host = 'localhost':SMTP服务器地址,默认为本地。$this->port = 25:SMTP服务器端口,默认为25。$this->user = '':SMTP登录用户名。$this->pass = '':SMTP登录密码。$this->from = 'webmaster@':发件人邮箱。$this->fromName = 'Webmaster':发件人名称。$this->replyTo = '':回复邮箱,默认与发件人相同。$this->messageType = 'TXT':旧版本兼容,默认为TXT格式。
在织梦CMS中,这些参数通常不是直接在这里设置的,而是通过 SendMail() 方法从数据库中读取配置并传入。
核心发送方法 SendMail()
function SendMail($to, $subject = '', $body = '', $template = '', $ishtml = true, $sendmail_bak = '')
这是最常用的一个方法,它负责整合所有资源并发送邮件。

(图片来源网络,侵删)
-
参数:
$to(string): 收件人邮箱地址。$subject(string): 邮件主题。$body(string): 邮件正文内容。$template(string): [可选] 邮件模板文件路径,织梦CMS的一大特色是支持邮件模板,如果提供了这个路径,$body的内容将被替换为模板中{dede:field.body /}的内容。$ishtml(bool): 是否为HTML邮件。true表示HTML,false表示纯文本。$sendmail_bak(string): [可选] 备用SMTP服务器配置,通常用于主服务器故障时切换。
-
工作流程:
- 读取配置:它会从织梦的数据库配置表中读取邮件相关的设置(SMTP服务器、端口、账号、密码等)。
- 处理模板:
$template参数不为空,它会读取模板文件,并将$body的内容填充到模板的{dede:field.body /}标签处,生成最终的邮件正文。 - 设置邮件头:根据
$ishtml参数,设置Content-Type为text/html或text/plain。 - 选择发送方式:它会检查配置,决定是使用
mail()函数还是SMTP协议发送。 - 执行发送:调用内部的
sendByMail()或sendBySmtp()方法进行实际的发送操作。 - 返回结果:发送成功返回
true,失败返回false,并记录错误信息。
SMTP发送方法 sendBySmtp()
function sendBySmtp($remote, $email_to, $email_subject, $email_body, $email_additional_headers, $email_replyTo)
这是实现SMTP协议发送邮件的核心逻辑。
- 工作流程:
- 建立连接:使用
fsockopen()函数连接到配置的SMTP服务器和端口。 - 身份验证:向服务器发送
EHLO命令,然后进行登录,发送AUTH LOGIN命令,并对用户名和密码进行Base64编码后发送。 - 发送邮件:
- 发送
MAIL FROM命令,指定发件人。 - 发送
RCPT TO命令,指定收件人。 - 发送
DATA命令,开始发送邮件内容(包括主题、发件人、收件人、邮件头和正文)。
- 发送
- 结束会话:发送邮件内容后,发送
QUIT命令关闭与服务器的连接。 - 错误处理:在每一步与服务器交互时,都会检查服务器的返回码,如果返回码表示失败(如
5xx错误),则会记录错误并终止发送。
- 建立连接:使用
mail() 函数发送方法 sendByMail()
function sendByMail($to, $subject, $body, $header)
这是一个非常简单的封装,直接调用PHP的 mail() 函数。

(图片来源网络,侵删)
- 工作流程:
- 将收件人、主题、正文和组装好的邮件头作为参数,调用
mail($to, $subject, $body, $header)。 - 依赖性:这个方法是否能成功,完全依赖于服务器环境是否正确配置了邮件发送系统(如Sendmail),如果服务器未配置,此方法必定失败。
- 将收件人、主题、正文和组装好的邮件头作为参数,调用
在织梦CMS中的使用场景
mail.class.php 主要在以下几个场景被调用:
- 用户注册/会员激活:用户提交注册信息后,系统会调用此类向用户邮箱发送一封包含激活链接的邮件。
- 密码找回/重置:用户请求重置密码时,系统会生成一个重置令牌,并通过邮件发送给用户。
- 评论/留言通知:当有新的评论或留言时,系统可以配置自动通知网站管理员或文章作者。
- 系统邮件:在后台“系统基本参数” -> “核心设置”中,可以配置一个默认的发件人邮箱,某些系统操作(如升级提醒)可能会使用这个配置发送邮件。
- 自定义邮件发送:开发者在二次开发时,可以直接实例化这个类来发送自定义邮件。
常见问题与解决方案
问题:邮件发送失败,提示 mail() function not enabled 或直接不发送。
- 原因:PHP环境禁用了
mail()函数,或者服务器没有安装或配置邮件发送服务(如Sendmail)。 - 解决方案:
- 联系主机商:确认
mail()函数是否可用。 - 切换到SMTP:这是强烈推荐的方案,在织梦后台,不要使用
mail()方式,而是配置一个可靠的SMTP服务器。
- 联系主机商:确认
问题:配置了SMTP(如QQ邮箱),但发送失败,提示 SMTP Error: Could not authenticate 或 Authentication failed。
- 原因:
- 用户名或密码错误:请确认填写的SMTP服务器登录账号和密码是否正确。
- 开启了SMTP服务:对于QQ邮箱、163邮箱等,必须先在邮箱设置中“开启SMTP服务”,并可能需要“生成授权码”。注意:这里应该填写授权码,而不是邮箱登录密码。
- 服务器被拉黑:如果服务器的IP地址被邮件服务商(如腾讯、网易)拉入黑名单,也会导致认证失败。
- 解决方案:
- 仔细核对用户名(通常是完整邮箱)和授权码。
- 前往邮箱设置,确保SMTP服务已开启,并获取最新的授权码。
- 使用IP查询工具检查服务器IP是否在黑名单中。
问题:邮件发送成功,但收件人收不到或在垃圾箱里找不到。
- 原因:
- 问题:邮件主题或正文包含“推广”、“优惠”、“免费”等敏感词汇,或HTML格式不规范,容易被邮件系统判定为垃圾邮件。
- 发件人信誉度低:使用个人邮箱(如QQ个人邮箱)作为SMTP发件人,信誉度较低,容易被拦截。
- DNS记录缺失:缺少SPF、DKIM、DMARC等DNS解析记录,邮件服务器无法验证发件人身份,从而拒绝邮件。
- 解决方案:
- 优化邮件内容,避免垃圾邮件关键词。
- 使用企业邮箱:企业邮箱的信誉度远高于个人邮箱,能有效降低被拦截的概率。
- 配置域名相关的DNS记录(SPF, DKIM),这是专业邮件发送的标配。
mail.class.php 是织梦CMS一个功能完善、设计良好的邮件发送工具,理解它的核心原理和配置方法,对于排查网站邮件功能问题和进行二次开发至关重要,对于生产环境的网站,强烈建议使用企业邮箱的SMTP协议来发送邮件,这是保证邮件成功率和稳定性的最佳实践。
