您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
Discuz的NT邮件插件机制分析
代曼2025-06-28Discuz教程已有人查阅
导读大约还是去年12月份,当时项目中遇到了一个很棘手的问题,就是管理员(或站长)在后台设置了邮箱信息之后,使用注册邮件发送激活验证码时,总有用户反映不能收到激活信息的邮件。
大约还是去年12月份,当时项目中遇到了一个很棘手的问题,就是管理员(或站长)在后台设置了邮箱信息之后,使用注册邮件发送激活验证码时,总有用户反映不能收到激活信息的邮件。
虽然不能收到邮件的情况有很多,甚至我已通过这个邮件发送程序测试过国内大多数知名网站的邮箱(如126,sina ,sohu ,gmail等),但还是有站长或用户隔三差五反映这个问题。甚至到今天我偶尔还会得到技术支持部门有关这方面问题的报怨。因此,今天这篇文章虽然说到了一个有关这个问题的解决方案(但不完善),但还是希望园子里以前处理过这方面问题或有成功经验的朋友指点一二。
好了,不费话了,开始今天的话题。相信下载到了我们发布的DLL并已Reflector相关程序结构的朋友,如果您留心看一下解决方案中的Discuz.PlugIn项目并在VS下打开就会看到ISmtpMail.cs,SmtpEmailAttribute.cs,SmtpMail.cs,以
及SysMailMessage.cs这几个CS文件。现在简单说明一下:
ISmtpMail.cs,定义了邮件收发类代码要实现的接口,主要的属性如下:
1定制发送邮件的插件属性值
59
如果您以前使用过采取属性绑定方式来标识和加载程序(或插件)的话,那么这时您就会很清楚一会要使用的一些调用方法了。但我相信还会有一些朋友对这方面不是很熟悉,所以我只能继续“贫”下去,希望您能耐着性子所我讲完:)
有了这几个文件之后,如何调用和设置要使用的是SysMailMessage还是SmtpMail中的邮件发送功能呢,其实这个选择的问题我们留给了用户,因为插件是对那些使用它们的人来说才是有意义的,而使用什么插件以及使用的方式都是用户喜好。因此我们在后台提供了如下的界面来让用户进行相关的设置:如何加载上图中下拉列框中的邮件发送邮件的数据呢,这里用的是对DLL进行反射。
找出相关的用上面“用户定制属性”进行标识的类代码.相关的代码如下(位于Discuz.Web项目下的admin\global\global_emailconfig.cs文件中)
上面只是解决了显示插件列表的问题,而如果将用户选取的插件信息进行保存以备使用的代码请看CS文件中的这部分代码:
目前设置方面已经万事俱备,就看前台如果调用了。为了方便起见,我们定制了一个类用于发送不同邮件内容信息,它位于(Discuz.Forum项目下的Emails.cs文件),其中的静态构造函数声明如下:
这样就通过加载指定的DLL得到了要使用的类实例,而如下使用它大家只要看一上这个CS文件的其余代码就会一清二楚了:)可能有些朋友会问这样一个问题, 为什么要用DLL而不是直接用下面的方法来获取实例
好了,这个机制基本上就贫到这里了,虽然解决一些问题,但还是不能从根本上解决用户收不到邮件的问题,这也是一个让我郁闷到今天的一个心病:(希望园子里的朋友有这方面经验的给我一点启示, 同时也祝大家工作愉快!
虽然不能收到邮件的情况有很多,甚至我已通过这个邮件发送程序测试过国内大多数知名网站的邮箱(如126,sina ,sohu ,gmail等),但还是有站长或用户隔三差五反映这个问题。甚至到今天我偶尔还会得到技术支持部门有关这方面问题的报怨。因此,今天这篇文章虽然说到了一个有关这个问题的解决方案(但不完善),但还是希望园子里以前处理过这方面问题或有成功经验的朋友指点一二。
好了,不费话了,开始今天的话题。相信下载到了我们发布的DLL并已Reflector相关程序结构的朋友,如果您留心看一下解决方案中的Discuz.PlugIn项目并在VS下打开就会看到ISmtpMail.cs,SmtpEmailAttribute.cs,SmtpMail.cs,以
及SysMailMessage.cs这几个CS文件。现在简单说明一下:
ISmtpMail.cs,定义了邮件收发类代码要实现的接口,主要的属性如下:
public interface ISmtpMail
{
int MailDomainPort { set;}
string From { set;get;}
string FromName { set;get;}
bool Html { set;get;}
string Subject { set;get;}
string Body { set;get;}
string MailDomain { set;}
bool Send();
而SmtpMail,SysMailMessage这两个文件就是实现了这个接口的具体邮件发送类。因为今天只讲插件机制分析,所以就不在这里说这两个类中具体的实现方式了。下面将要说的是这两个类中使用的"用户定制属性",这里以SysMailMessage类为例:
[SmtpEmail(".net邮件发送程序", Version = "1.0", Author = "Discuz!NT ",
DllFileName = "Discuz.PlugIn.dll")]
public class SysMailMessage : ISmtpMail
{
private string _subject;
private string _body;
private string _from;
大家看到了在这个类上的SmtpEmail属性了吧,它就是下面要说明的"用户定制属性"的绑定应用。而SmtpEmail请看如下代码(相关说明见注释):1定制发送邮件的插件属性值
59
如果您以前使用过采取属性绑定方式来标识和加载程序(或插件)的话,那么这时您就会很清楚一会要使用的一些调用方法了。但我相信还会有一些朋友对这方面不是很熟悉,所以我只能继续“贫”下去,希望您能耐着性子所我讲完:)
有了这几个文件之后,如何调用和设置要使用的是SysMailMessage还是SmtpMail中的邮件发送功能呢,其实这个选择的问题我们留给了用户,因为插件是对那些使用它们的人来说才是有意义的,而使用什么插件以及使用的方式都是用户喜好。因此我们在后台提供了如下的界面来让用户进行相关的设置:如何加载上图中下拉列框中的邮件发送邮件的数据呢,这里用的是对DLL进行反射。
找出相关的用上面“用户定制属性”进行标识的类代码.相关的代码如下(位于Discuz.Web项目下的admin\global\global_emailconfig.cs文件中)
1public void GetSmtpEmailPlugIn()
2{
3
4 DirectoryInfo dirinfo = new DirectoryInfo(HttpRuntime.BinDirectory);
5 foreach (FileSystemInfo file in dirinfo.GetFileSystemInfos())
6 {
7 if (file != null)
8 {
9 if (file.Extension.ToLower().Equals(".dll"))
10 {
11 Assembly a = Assembly.LoadFrom(HttpRuntime.BinDirectory + file);
12 foreach (Module m in a.GetModules())
13 {
14 //采用过滤器进行类名过滤
15 foreach (Type t in m.FindTypes(Module.FilterTypeName, "*"))
16 {
17 foreach (object arr in t.GetCustomAttributes(typeof(SmtpEmailAttribute), true))
18 {
19 SmtpEmailAttribute sea = (SmtpEmailAttribute)arr;
20
21 smtpemail.Items.Add(new ListItem(sea.PlugInName, t.FullName + "," +
22 (sea.DllFileName != "" ? sea.DllFileName : file.ToString().Replace(".dll", ""))));
23 }
24 }
25 }
26 }
27 }
28 }
实现的代码比较简单,这面就不多说什么了。上面只是解决了显示插件列表的问题,而如果将用户选取的插件信息进行保存以备使用的代码请看CS文件中的这部分代码:
private void SaveEmailInfo_Click(object sender, EventArgs e)
{
try
{
__emailinfo.PluginNameSpace = smtpemail.SelectedValue.Split(',')[0];
__emailinfo.DllFileName = smtpemail.SelectedValue.Split(',')[1];
}
catch
{
;
}
EmailConfigs.SaveConfig(__emailinfo); //序列化保存相关信息
Emails.ReSetISmtpMail();
}
这样就通过了“序列化”的方式保存了用户定制的信息,这个信息有邮件程序的名空间和所在的DLL信息。这些信息之后都放在了config/email.config中。目前设置方面已经万事俱备,就看前台如果调用了。为了方便起见,我们定制了一个类用于发送不同邮件内容信息,它位于(Discuz.Forum项目下的Emails.cs文件),其中的静态构造函数声明如下:
static Emails()
{
try
{
//读取相应的DLL信息
Assembly asm = Assembly.LoadFrom(HttpRuntime.BinDirectory+emailinfo.DllFileName+".dll");
ESM = (ISmtpMail) Activator.CreateInstance(asm.GetType(emailinfo.PluginNameSpace));
}
catch
{
catch
{
if(emailinfo!=null)
{
//如果没有有效的设置则使用系统指定的邮件发送类代码
if(emailinfo.PluginNameSpace!=null && emailinfo.PluginNameSpace.IndexOf("SmtpMail")>0)
{
ESM = new SmtpMail();
}
else
{
ESM = new SysMailMessage();
}
}
其中了ESM就是接口实例protected static ISmtpMail ESM;这样就通过加载指定的DLL得到了要使用的类实例,而如下使用它大家只要看一上这个CS文件的其余代码就会一清二楚了:)可能有些朋友会问这样一个问题, 为什么要用DLL而不是直接用下面的方法来获取实例
Activator.CreateInstance('Discuz.PlugIn.SysMailMessage,Discuz.PlugIn');
其实原因很简单,我当时考虑的是如果DLL文件不是位于BIN目录下的话,那么这种方式将会出现返回为空的情况。因为用户完全可能自己创建一个插件目录来自己进行上传和管理。好了,这个机制基本上就贫到这里了,虽然解决一些问题,但还是不能从根本上解决用户收不到邮件的问题,这也是一个让我郁闷到今天的一个心病:(希望园子里的朋友有这方面经验的给我一点启示, 同时也祝大家工作愉快!
本文标签:
很赞哦! ()
相关教程
图文教程
Windows7&IIS7.5在内网部署Discuz
部署环境就一台普通的PC,四核i3,Windows7。这就开搞了。系统是Windows 7 专业版,自带IIS7.5(家庭版不带)。IIS7开始带了FastCgi,对PHP支持好了许多,所以也不必装Apache啦。
Discuz模板安装后显示异常的原因和解决方法
在处理Discuz模板显示异常时,最关键的是理解这些问题可能源自哪里。通常,问题可能出现在模板文件的编码、样式表的引用、JavaScript脚本的加载、或者是模板与Discuz版本的不兼容性上。
配置Discuz与微信小程序开发环境的步骤介绍
在现代网络开发中,Discuz与微信小程序的结合是一个非常有趣的组合。它们可以让你的社区更加活跃,用户体验更为流畅。那么,如何配置Discuz与微信小程序开发环境呢?
discuz去掉portal.php的方法
discuz去掉“portal.php”的方法:首先在系统后台的导航设置中将默认的首页设置为“不可用”;然后打开“index.php”并修改内容为“$_ENV['domain']['defaultindex']”即可。
相关源码
-
(PC+WAP)盆栽绿植观赏植物花卉租赁免费pbootcms网站模板为花卉盆栽租赁、园林绿化企业打造的PbootCMS网站模板,采用较新内核开发,PC与移动端数据实时同步。通过清新自然的视觉设计,精准展现植物养护、花卉展示等业务场景,帮助用户快速建立专业级行业网站。查看源码 -
(自适应HTML5)响应式智能设备人工智能机器pbootcms源码免费下载这款基于PbootCMS开发的网站模板为人工智能和智能设备行业设计,采用现代化科技风格,突出产品的智能特性和技术创新。模板架构合理,功能完善,能够有效展示各类智能产品的核心功能和解决方案。查看源码 -
帝国cms7.5淘宝客电商品牌特价带手机站带会员模板下载为电商品牌特价展示设计的帝国CMS模板,集成PC端与移动端双平台适配。采用瀑布流商品布局,支持品牌分类聚合展示,突出特价促销视觉冲击力。查看源码 -
(自适应响应式)HTML5甲醛环境检测网站模板带在线留言和资料下载本模板为甲醛检测与环保科技企业开发,采用PbootCMS内核构建。首页集成空气质量数据可视化模块,服务流程采用时间轴展示设计,检测报告板块支持PDF在线预览功能查看源码 -
pbootcms模板PC+WAP娱乐新闻资讯类博客网站源码该模板基于PbootCMS内核开发,专为娱乐新闻、健康生活类资讯网站设计,同时支持快速适配其他行业(如企业官网、博客门户等),仅需替换图文内容即可完成转型。查看源码 -
(自适应)大气办公用品耗材供应打印机产品维修网站模板下载基于PbootCMS系统开发的响应式网站模板,为营销技术博主、数字产品评测者设计。采用前沿的响应式技术,确保内容在手机端和桌面端都能获得较佳阅读体验,帮助用户高效展示技术文章和产品分析。查看源码
| 分享笔记 (共有 篇笔记) |
