• WF4.0实战(十一):邮件通知


        在工作流开发中,邮件通知是必不可少。这篇文章中,我将是使用WF4.0一步一步打造一个功能完整的邮件通知节点。

        首先,新建一个WorkflowConsoleApplication项目,改名为MailNoticeDemo,如下图:

    wfmail1

        添加一个CodeActivity活动命名为MailNotice,添加一个ActivityDesigner活动命名为MailNoticeDesigner。项目结构如下图:

    wfmail2

    MailNotice用于写发送邮件的业务逻辑,MailNoticeDesigner用于设计活动的界面,现在MailNotice和MailNoticeDesigner是没有任何关联的,我们在MailNotice类上添加[Designer(typeof(MailNoticeDesigner))],关联MailNotice和MailNoticeDesigner,还需要引入System.ComponentModel命名空间,代码如下。

    1. using System.Activities;
      using System.ComponentModel;
      using System.Activities.Presentation.Metadata;
      using System.Activities.Presentation.PropertyEditing;
      using System;
      namespace MailNoticeDemo
      {
      [Designer(typeof(MailNoticeDesigner))]
      public sealed class MailNotice : CodeActivity
      {
    2.                  ………
    3. }

    这时,MailNotice和MailNoticeDesigner活动中还没有进行编码。在项目中引入一个邮件发送类MailHelper.cs,编写MailNotice代码,如下:

    1. [Designer(typeof(MailNoticeDesigner))]
      1.  public sealed class MailNotice : CodeActivity
        
      2. {
        
      3.      public InArgument<string> Receive { get; set; }
        
      4.      public InArgument<string> Subject { get; set; }
        
      5.      public InArgument<string> Content { get; set; }
        
      6.      public string Attachment { get; set; }
        
      7.      static MailNotice()
        
      8.      {
        
      9.          AttributeTableBuilder builder = new AttributeTableBuilder();
        
      10.          builder.AddCustomAttributes(typeof(MailNotice), "Attachment", new EditorAttribute(typeof(FilePickerEditor), typeof(DialogPropertyValueEditor)));
        
      11.          MetadataStore.AddAttributeTable(builder.CreateTable());
        
      12.      }
        
      13.      // If your activity returns a value, derive from CodeActivity<TResult>
        
      14.      // and return the value from the Execute method.
        
      15. protected override void Execute(CodeActivityContext context)
        
      16.      {
        
      17.          SMTP smtp = new SMTP("你邮箱地址·", "显示的名称", new string[] { Receive.Get(context) }, null, null, Subject.Get(context), Content.Get(context), new string[] { Attachment }, "邮件发送服务", 25, "你邮箱地址·", "你邮箱密码", false);
        
      18.          try
        
      19. {
        
      20.              smtp.Send();
        
      21.          }
        
      22.         catch (Exception ex)  
      23.          { 
      24.             string error = ex.Message; 
      25.              if (ex.InnerException != null) 
      26.              { 
      27.                   error = ex.InnerException.Message;  
        
      28.              }
      29.               Console.WriteLine("邮箱发送失败: " + error); 
      30.           }
              }
      31.  }
      32. 设计MailNoticeDesigner活动的UI,设计UI之前让你可以先了解一下ExpressionTextBox。详见:expressiontextbox-101
      33. 通过expressiontextbox和WPF的控件,设计UI界面如下:
      34. wf4mail 
      35. Xaml代码如下:
        1. <sap:ActivityDesigner x:Class="MailNoticeDemo.MailNoticeDesigner"
          
        2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          
        3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          
        4. xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
          
        5. xmlns:sapc="clr-namespace:System.Activities.Presentation.Converters;assembly=System.Activities.Presentation"
          
        6. xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation" 
          
        7. mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="221" d:DesignWidth="336">
          
        8.     <sap:ActivityDesigner.Resources>
          
        9.         <ResourceDictionary x:Uid="ResourceDictionary_1">
          
        10.             <sapc:ArgumentToExpressionConverter x:Uid="sadv:ArgumentToExpressionConverter_1" x:Key="ArgumentToExpressionConverter" />
          
        11.         </ResourceDictionary>
        12.         </sap:ActivityDesigner.Resources>
          
        13.         <Grid Height="190" Width="328">
          
        14.         <Grid.RowDefinitions>
          
        15.             <RowDefinition Height="28"></RowDefinition>
          
        16.             <RowDefinition  Height="28"></RowDefinition>
          
        17.             <RowDefinition  Height="54"></RowDefinition>
          
        18.             <RowDefinition Height="47" />
          
        19.             <RowDefinition Height="31*" />
          
        20.         </Grid.RowDefinitions>
          
        21.         <Grid.ColumnDefinitions>
          
        22.             <ColumnDefinition Width=".2*"></ColumnDefinition>
          
        23.             <ColumnDefinition Width=".8*"></ColumnDefinition>
          
        24.         </Grid.ColumnDefinitions>
          
        25.         <Label Content="收件人" Height="28" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Name="label1" VerticalAlignment="Top" />
          
        26.         <sapv:ExpressionTextBox  Grid.Row="0" Grid.Column="1"
          
        27. OwnerActivity="{Binding Path=ModelItem}" 
          
        28. Expression="{Binding Path=ModelItem.Receive, Mode=TwoWay, Converter={StaticResource ArgumentToExpressionConverter}, ConverterParameter=In }"
          
        29. UseLocationExpression="False"   />
          
        30.         <Label Content="主题:"  Grid.Row="1" Grid.Column="0"  HorizontalAlignment="Left"  Name="label2" VerticalAlignment="Top" />
          
        31.         <sapv:ExpressionTextBox  Grid.Row="1" Grid.Column="1"
          
        32. OwnerActivity="{Binding Path=ModelItem}" 
          
        33. Expression="{Binding Path=ModelItem.Subject, Mode=TwoWay, Converter={StaticResource ArgumentToExpressionConverter}, ConverterParameter=In }"
          
        34. UseLocationExpression="False"   />
          
        35.         <Label Content="正文:" Grid.Row="2" HorizontalAlignment="Left"  Name="label3" VerticalAlignment="Top"   />
          
        36.         <sapv:ExpressionTextBox  Grid.Row="2" Grid.Column="1" 
          
        37. OwnerActivity="{Binding Path=ModelItem}" 
          
        38. Expression="{Binding Path=ModelItem.Content, Mode=TwoWay, Converter={StaticResource ArgumentToExpressionConverter}, ConverterParameter=In }"
          
        39. UseLocationExpression="False" Margin="0,0,0,1" Grid.RowSpan="2" />
          
        40.     </Grid>
          
        41. </sap:ActivityDesigner>
          
        
        
    2. 这样我们就完成了这个邮件活动。测试一下。在Workflow1中拖入这个活动。输入收件人、主题、正文,如下图:
    3. wfmail4 设置附件,如下图:
    4. wfmail5
    5. 启动工作流发送邮件:
    6. 
      
      1. WorkflowInvoker.Invoke(new Workflow1()); 
      
      
    7. 你会发现这个活动的图标不够美观,让我们修改一下这个自定义活动的图标。 在MailNoticeDesigner.xaml中加入下面代码
    8. 
      
      
      <sap:ActivityDesigner.Icon>
      1.         <DrawingBrush>
      2.             <DrawingBrush.Drawing>
      3.                 <ImageDrawing>
      4.                     <ImageDrawing.Rect>
      5.                         <Rect Location="0,0" Size="16,16" ></Rect>
      6.                     </ImageDrawing.Rect>
      7.                     <ImageDrawing.ImageSource>
      8.                         <BitmapImage UriSource="mail.ico" ></BitmapImage>
      9.                     </ImageDrawing.ImageSource>
      10.                 </ImageDrawing>
      11.             </DrawingBrush.Drawing>
      12.         </DrawingBrush>
      13.     </sap:ActivityDesigner.Icon>
      14. 设置图标mail.ico,将Build action设置为Resource,如下图:
      15. wfmail6 
      16. 看一下我们最终打造的邮件活动:
      17. wfmail8 
      18. 总结:这篇文章详细讲解了创建WF4.0一个自定义活动的完整过程,虽然很简单,但对创建自定义活动很有参考价值。
        代码:/Files/zhuqil/MailNoticeDemo.rar



    (全文完)


    以下为广告部分

    您部署的HTTPS网站安全吗?

    如果您想看下您的网站HTTPS部署的是否安全,花1分钟时间来 myssl.com 检测以下吧。让您的HTTPS网站变得更安全!

    SSL检测评估

    快速了解HTTPS网站安全情况。

    安全评级(A+、A、A-...)、行业合规检测、证书信息查看、证书链信息以及补完、服务器套件信息、证书兼容性检测等。

    SSL证书工具

    安装部署SSL证书变得更方便。

    SSL证书内容查看、SSL证书格式转换、CSR在线生成、SSL私钥加解密、CAA检测等。

    SSL漏洞检测

    让服务器远离SSL证书漏洞侵扰

    TLS ROBOT漏洞检测、心血漏洞检测、FREAK Attack漏洞检测、SSL Poodle漏洞检测、CCS注入漏洞检测。

  • 相关阅读:
    linux日常管理-screen
    linux日常管理-xarge_exec
    linux日常管理-linux日志
    linux日常管理-系统服务
    linux命令-任务计划-cron
    linux日常管理-防火墙netfilter工具-iptables-3
    linux日常管理-防火墙netfilter工具-iptables-2
    开启80端口
    linux日常管理-防火墙netfilter工具-iptables-1
    随机4位验证码
  • 原文地址:https://www.cnblogs.com/zhuqil/p/WFMAIL.html
Copyright © 2020-2023  润新知