找回密码
 立即注册

QQ登录

只需一步,快速开始

Tracy.Liu 讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2018-11-2 13:28  /   查看:7263  /  回复:0
本帖最后由 Tracy.Liu 于 2019-1-30 15:20 编辑

在我们日常的工作中,经常需要在某个固定的时间发送邮件提醒。如果通过人工手动发送,不仅繁琐,而且经常就忘记了。

比如,有个订单管理系统,每一条记录都有起始日期,期限天数和当前状态等信息。我们希望在订单快要过期前给未完成订单的负责人发送一封邮件提醒。这样的场景在工作中经常会碰到的。

话不多说,我们就拿上面的这个例子一步一步详细讲解一下。

1.配置邮箱服务器
   我们要发邮件,那第一步当然就是配置邮箱服务器啦~我们已经有配置邮箱服务器的帖子,这里就不赘述啦~
   还不会配置的盆友们,请看这里https://gcdn.grapecity.com.cn/fo ... hlight=%C5%E4%D6%C3

2.创建定时发送邮件API
  1)打开Visual Studio,在VS中创建类库项目。设置项目的Framework框架为.NET Framework 4.6。
       image.png469560851.png
  2)右键"引用"--"添加引用",在活字格的安装目录下找到“GrapeCity.Forguncy.ServerApi.dll”和“Microsoft.Owin.dll”文件,如果之前在其他类库中引用过,那么在"最近"中会有显示,如果从未引用过,那么就点击下方的“浏览”,在活字格安装目录下找。
       image.png212906493.png
   这里注意一下
  • 如果安装活字格服务端时,安装目录为默认目录,则此文件的路径为:
         Windows系统为32位操作系统:C:\Program Files\ForguncyServer\Website\bin
         Windows系统为64位操作系统:C:\Program Files (x86)\ForguncyServer\Website\bin
  • 如果安装活字格服务端时,安装目录为自定义路径,则此文件的路径为“自定义路径\ForguncyServer\Website\bin”。

   如果引用成功,在"引用"下就可以看到啦。
       image.png311942748.png

   3)给自己的API起个名儿,然后使其从GrapeCity.Forguncy.ServerApi命名空间的ForguncyApi类继承。
       image.png558264464.png

   4)我们现在要实现定时发送,那我们使用的就是 [ScheduleApi] 啦~      可是要怎么定义时间间隔呢?看下表
[ScheduleApi("0:0:10")] 从网站启动时刻开始,每隔10秒执行一次
[ScheduleApi("17:00:00", "1")] 从网站启动时刻开始,每天下午5点执行一次
[ScheduleApi("0:0:0", "7")] 从网站启动时刻开始,每隔7天在夜里0点执行一次
      如果希望每个月的1号进行,可不是写成[ScheduleApi("0:0:0", "30")]哈,毕竟每个月的天数是不一样的。处理的方法是写成[ScheduleApi("0:0:0", "1")],然后每次执行时先判定DateTime.Now.Day是不是等于1,即判定是不是月初1号就行啦~

   回到正题,在这个例子中,我们是设定的每天17点发送邮件。

   5)以上我们已经把定时的部分写好了,接写来就是功能的主体部分。本例中我们发邮件的条件是 剩余天数不足10天且当前状态不是"已完成",则给负责人发一封提醒邮件。
         这里我就不详细说每行代码是做什么用的啦,因为您直接在demo中的代码基础上做修改就ok了,接下来只说明您需要修改的地方~
         
         a.红框中的部分是您要从表中获取哪些字段,这段字符串您可以在设计器中通过odata公式生成,然后粘贴过来。
            image.png268557738.png
            image.png831535644.png

         b.拉到代码最后面,上一步获取了哪些字段,这里就写哪些。
            image.png153780821.png

         c.红框中是 通过"起始日期"和"期限天数"计算剩余日期  即 剩余天数 = 起始日期 + 期限天数 - Now
            image.png194899901.png

          获取字段的值的方法是 list[i - 1].ItemArray[x]) ,改x的值就可以了,0对应起始日期;1对应期限天数;以此类推...

          这里要注意,日期处理起来比较麻烦,比如我们从表中取到的日期是5位数字的格式,我们可以通过
  1. string strDate = DateTime.FromOADate(Convert.ToInt32(list[i - 1].ItemArray[0])).ToString("d");   //把数字日期(“如43234”)转换成字符串日期
复制代码
         又比如AddDays()方法后面不能使用字符串作为参数,我们需要把字符串转成int
  1. int convert = Convert.ToInt32(str);   //把字符串转成int
复制代码
        d.设置在几天前进行提醒
            image.png826762084.png
  
         e.获取用户邮箱。其中 GetUserInfos方法从用户管理系统获取所有的用户信息。但是您不用管这个,您只需要通过更改红框中的值,得到对应负责人是谁就行啦~
            image.png766669616.png

         f.发邮件。这一步就自己拼凑邮件内容的字符串就可以了,然后通过 SendEmail() 发邮件就可以啦~
            image.png315960997.png

         g.代码部分,大功告成!

   6)紧接着编译一下,然后在活字格中上传这个Api
            image.png796247558.png
            image.png177497557.png

         上传成功后,在计划任务API中就可以看到啦~
            image.png73204344.png

   7)发布以后,我们等到17点的时候,就会收到一条提醒信息
            image.png288558348.png

当然,在写Api的时候一般不可能一次性就成功,那如何调试呢? 传送门→调试服务端自定义Web API


咳咳~完成


定时发送邮件V0.1.fgcc

529.02 KB, 下载次数: 651

scheduleMail.zip

91.69 KB, 下载次数: 607

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部