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一个自定义活动的完整过程,虽然很简单,但对创建自定义活动很有参考价值。






本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/04/29/WFMAIL.html,如需转载请自行联系原作者
相关文章
|
自然语言处理 算法 数据安全/隐私保护
教你如何用代码自动群发邮件(邮件轰炸机)
教你如何用代码自动群发邮件(邮件轰炸机)
1296 0
教你如何用代码自动群发邮件(邮件轰炸机)
|
jenkins 持续交付 网络安全
Jenkins 设置构建失败发送邮件(学习笔记二十一)
本文是jenkins应用系统文章的一部分,大部分来自工作和学习中的实践,部分内容来自官方文档和网友的文章,引用的文章会在“参考资料”部分附上原始链接,如无意中侵犯您的权利,请联系QQ:46106962,如需要进一步的交流请加入QQ群: (Jenkins学习交流)469536515。
3767 0
|
4月前
|
小程序
【微信小程序】实战案例 -- 向订阅用户发送消息(范例:报名提醒)
【微信小程序】实战案例 -- 向订阅用户发送消息(范例:报名提醒)
267 0
|
小程序
小程序订阅消息推送简要流程图
小程序订阅消息推送简要流程图
112 0
小程序订阅消息推送简要流程图
小储云邮件通知插件配置教程
设置通知配置,配置完成之后,有订单-工单-提现可以通知站长,提升了平台处理效率!
445 0
小储云邮件通知插件配置教程
|
JavaScript
WebApi入门第三章(事件介绍及注册事件 )
WebApi入门第三章(事件介绍及注册事件 )
129 0
WebApi入门第三章(事件介绍及注册事件 )
|
JSON 小程序 数据格式
.NET之微信消息模板推送
.NET之微信消息模板推送
230 0
.NET之微信消息模板推送
AppleWatch开发入门七——watchOS中通知的应用(二)
AppleWatch开发入门七——watchOS中通知的应用
192 0
AppleWatch开发入门七——watchOS中通知的应用(二)
|
JSON iOS开发 数据格式
AppleWatch开发入门七——watchOS中通知的应用(一)
AppleWatch开发入门七——watchOS中通知的应用
175 0
AppleWatch开发入门七——watchOS中通知的应用(一)
|
Java 开发者
如何发送基于模板的邮件? | 带你读《SpringBoot实战教程》之二十七
本节介绍了基于模板的邮件的发送是怎样实现的。
如何发送基于模板的邮件? | 带你读《SpringBoot实战教程》之二十七