C# 使用 redis 消息队列功能实现简单的邮件发送系统

Posted ABP爱好者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 使用 redis 消息队列功能实现简单的邮件发送系统相关的知识,希望对你有一定的参考价值。

背景

发送在一个系统中现在是不可缺少的一部分了,通常系统内部会建立一套发送邮件机制,类似 abp .net 框架提供的邮件发送功能一样,在需要发送邮件的地方,调用发送邮件的功能,有的系统会将即将发送的邮件先保存到数据库,然后由定时任务不断的从数据库中读取邮件并发送,譬如nop. 我们知道,邮件发送,属于长时间任务,什么意思呢?也就是说,调用邮件发送功能,这个时候,可能会等待一段时间,ui才会有所响应,在发送邮件的时候,系统处于阻塞状态,abp.net就是这样的,尤其是当发送邮件服务器基本信息有误的时候,导致会等待一段时间,ui才会响应。 使用定时任务或后台工作任务可以解决上述问题,这里不做描述。 下面提供另外一种的解决方案,将发送邮件功能脱离系统,使用消息队列方式,也就是说,系统只需向消息队列写消息,而由专门的邮件发送工具或者系统,发送邮件,这样,即使系统所在服务器和邮件发送工具服务器不是同一台电脑,也可以正常使用邮件发送功能。

背景知识:

redis 的使用: http://www.jianshu.com/p/0dd7d722c410 abp.net: http://www.aspnetboilerplate.com/Pages/Documents


使用 abp 提供的邮件发送功能

前提:已经运行redis 服务 使用vs工具新建命令行程序,并引入nuget 包 :abp

根据abp编写规则,我们需要些一个启动模块,代码如下

 
   
   
 
  1.    public class SendMailModule : AbpModule

  2.    {

  3.        public override void PreInitialize()

  4.        {

  5.                        this.Configuration.Settings.Providers.Add<AppSettingProvider>();

  6.        }

  7.        public override void Initialize()

  8.        {

  9.        }

  10.        public override void PostInitialize()

  11.        {

  12.        }

  13.    }

为了使用 abp 提供的邮件发送内容,我们需要提供一个简单的设置提供者,即 AppSettingProvider ,该提供者提供了基础的发送邮件服务器信息,实现代码如下

 
   
   
 
  1.    public class AppSettingProvider : SettingProvider

  2.    {

  3.        /// <summary>

  4.        /// </summary>

  5.        /// <param name="context"></param>

  6.        /// <returns></returns>

  7.        public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)

  8.        {

  9.            return new[]

  10.                       {

  11.                       };

  12.        }

  13.    }

现在我们已经有了基础信息,如果使用邮件发送功能呢?代码如下

 
   
   
 
  1.           /// 启动abp并初始化

  2.            var startup = AbpBootstrapper.Create<SendMailModule>();

  3.            startup.Initialize();

  4.            // 测试是否可以正常发送


使用 redis 提供的队列

我们在代码中,引入 redis client的nuget包 StackExchange.Redis

C# 使用 redis 消息队列功能实现简单的邮件发送系统

然后通过代码,建立消息队列通道的监听

 
   
   
 
  1.            var sub = redisClient.GetSubscriber();

  2.            sub.Subscribe(

  3.                "mailtool",

  4.                (channel, message) =>

  5.                    {

  6.                        // 假设邮件格式

  7.                        Console.WriteLine(message);

  8.                        var recMsg = (string)message;

  9.                        var msg = recMsg.Split('#');

  10.                        emailSender.Send(msg[0], msg[1], msg[2]);

  11.                    });

并且,随之通过通道发送一条邮件信息

 
   
   
 

全部代码如下:

 
   
   
 
  1.    /// <summary>

  2.    /// The program.

  3.    /// </summary>

  4.    internal class Program

  5.    {

  6.        /// <summary>

  7.        /// The redis client.

  8.        /// </summary>

  9.        private static readonly ConnectionMultiplexer redisClient = ConnectionMultiplexer.Connect("localhost");

  10.        /// <summary>

  11.        /// The main.

  12.        /// </summary>

  13.        /// <param name="args">

  14.        /// The args.

  15.        /// </param>

  16.        private static void Main(string[] args)

  17.        {

  18.            var startup = AbpBootstrapper.Create<SendMailModule>();

  19.            startup.Initialize();

  20.            // 测试是否可以正常发送

  21.            var sub = redisClient.GetSubscriber();

  22.            sub.Subscribe(

  23.                "mailtool",

  24.                (channel, message) =>

  25.                    {

  26.                        // 假设邮件格式

  27.                        Console.WriteLine(message);

  28.                        var recMsg = (string)message;

  29.                        var msg = recMsg.Split('#');

  30.                        emailSender.Send(msg[0], msg[1], msg[2]);

  31.                    });

  32.            Console.ReadKey();

  33.        }

  34.    }


使用 redis 客户端发送邮件


总结

通过上述内容,我们掌握了如何使用redis 提供的消息队列 实现简单的邮件发送工具。 也掌握了如何使用 abp提供的邮件发送功能发送邮件,同时,该案例,可以作为abp开发非web项目的一个启发。 同样的,现在越来越多的系统提供发送手机短信功能,我们是不是也可以借助消息队列手段将该功能单独出一个小工具。

源代码: https://git.oschina.net/zhaord/redismailtool

qq:1260825783


以上是关于C# 使用 redis 消息队列功能实现简单的邮件发送系统的主要内容,如果未能解决你的问题,请参考以下文章

c#之Redis队列在邮件提醒中的应用

Redis实现简单的消息队列

redis消息队列简单应用

Redis的队列和消息队列的区别concept

Redis 实现消息队列 MQ

php+redis简易消息队列