libsmtp–是一个开源的C语言动态库,与其想对应,libsmtp++采用C++开发。libsmtp–使得开发人员能够直接在程序内部实现SMTP邮件发送,它的主要特点是短小精炼、易于使用,已在Linux上测试通过,它支持给多个收件人同时发送统一内容的邮件,并且支持抄送以及密送。
libsmtp–另外一大特点是它的插件机制,由于SMTP协议中的认证方式有多种,为了以不变应万变,lismtp–在实现部分为不同的认证方式封装了不同的插件,每一个小插件实际上就是一个动态链接库,每个动态链接库内封装了同一套函数接口,根据认证方式的不同,每个动态链接库有针对性地实现这些函数接口,最终达到一套接口,多种功能的效果。当SMTP交互过程进行到认证阶段时,程序内部根据事先指定的认证类型或者自动选择一种认证类型来加载相应的插件即可。
每引用一个动态链接库,在执行main函数之前会先执行_init函数,在main函数退出以后再执行_fini函数,所以动态库要初始化或者需要释放的资源可以分别在_init函数跟_fini函数中实现。linsmtp–就是这么做的,在_init函数中分配了一块全局可见的指针数组,加载指定目录(/usr/local/lib/libsmtp–/plugins)下的每一个插件(动态库),将每一个插件内部的每一个函数接口的指针存入一个动态分配的plugin_t结构体中,并将该结构体指针存入刚刚分配的全局指针数组中。当SMTP交互过程进行到认证阶段时,程序遍历插件指针数组,根据认证方式的别名找到相应插件的结构体对应的指针,将该指针赋值给另一个全局结构体内的插件指针成员,以后的交互过程,程序根据全局结构体内的插件指针是否为空来判断是否需要调用插件内的函数来完成某些功能(如用户认证、读数据、写数据)。这样,程序就可以根据不同的认证方式来采用不同的协议交互。倘若在程序完成以后有新的认证方式应运而生,只需要遵循新的认证协议封装一个新的插件安装到指定目录/usr/local/lib/libsmtp–/plugins)即可;倘若需要重新实现旧的插件内的某些功能,只要接口保持不变,更改插件无须重新编译原程序。
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。