SendMail 自定义活动

SendMail 示例演示如何创建自定义活动,该活动派生自AsyncCodeActivity使用 SMTP 发送邮件,以便在工作流应用程序中使用。 自定义活动使用异步发送电子邮件和通过身份验证发送邮件的功能 SmtpClient 。 它还提供一些最终用户功能,例如测试模式、令牌替换、文件模板和测试删除路径。

下表详细说明了 SendMail 活动的参数。

名称 类型 DESCRIPTION
主机 字符串 SMTP 服务器主机的地址。
港口 字符串 主机中的 SMTP 服务的端口。
EnableSsl 布尔 指定是否 SmtpClient 使用安全套接字层(SSL)加密连接。
UserName 字符串 用于设置凭据以对发送方 Credentials 属性进行身份验证的用户名。
密码 字符串 设置用于验证发件人 Credentials 属性的凭据的密码。
使用者 InArgument<T> 字符串<> 邮件的主题。
身体 InArgument<T> 字符串<> 消息正文。
附件 InArgument<T> 字符串<> 用于存储附加到此电子邮件的数据的附件集合。
来自 MailAddress 此电子邮件的发件人地址。
InArgument<T><MailAddressCollection> 包含此电子邮件收件人的地址集合。
CC InArgument<T><MailAddressCollection> 包含此电子邮件抄送 (CC) 收件人的地址集合。
BCC InArgument<T><MailAddressCollection> 包含此电子邮件密件抄送 (CC) 收件人的地址集合。
令牌 InArgument<T> <IDictionary<字符串,字符串>> 会在正文中进行替换的标记。 此功能允许用户在正文中指定一些值,这些值可以在稍后使用此属性提供的令牌进行替换。
BodyTemplateFilePath 字符串 正文模板的路径。 SendMail 活动将此文件的内容复制到其 body 属性中。

模板可以包含一些令牌,这些令牌将被令牌属性的内容替换。
TestMailTo MailAddress 设置此属性后,所有电子邮件都会发送到其中指定的地址。

此属性旨在用于测试工作流。 例如,如果您想确保所有电子邮件都被发送但不发送给真正的收件人。
TestDropPath 字符串 设置此属性后,所有电子邮件也会保存在指定文件中。

在测试或调试工作流时,此属性旨在确保传出电子邮件的格式和内容合适。

解决方案内容

解决方案包含两个项目。

项目 DESCRIPTION 重要文件
SendMail SendMail 活动 1. SendMail.cs:主活动的实现
2. SendMailDesigner.xaml 和 SendMailDesigner.xaml.cs:SendMail 活动的设计器
3. MailTemplateBody.htm:要发送电子邮件的模板。
SendMailTestClient 用于测试 SendMail 活动的客户端。 此项目演示了两种调用 SendMail 活动的方法:以声明方式和编程方式调用。 1. Sequence1.xaml:调用 SendMail 活动的工作流。
2. Program.cs:调用 Sequence1,同时以编程方式创建使用 SendMail 的工作流。

SendMail 活动的进一步配置

虽然示例中未显示,但用户可以执行 SendMail 活动的添加配置。 接下来的三个部分演示了如何完成此作。

使用正文中指定的标记发送电子邮件。

此代码段演示如何使用正文中的标记发送电子邮件。 注意在 body 属性中提供标记的方式。 将以下标记的值提供给 tokens 属性。

IDictionary<string, string> tokens = new Dictionary<string, string>();
tokens.Add("@name", "John Doe");
tokens.Add("@date", DateTime.Now.ToString());
tokens.Add("@server", "localhost");

new SendMail
{
    From = new LambdaValue<MailAddress>(ctx => new MailAddress("john.doe@contoso.com")),
    To = new LambdaValue<MailAddressCollection>(
                    ctx => new MailAddressCollection() { new MailAddress("someone@microsoft.com") }),
    Subject = "Test email",
    Body = "Hello @name. This is a test email sent from @server. Current date is @date",
    Host = "localhost",
    Port = 25,
    Tokens = new LambdaValue<IDictionary<string, string>>(ctx => tokens)
};

使用模板发送电子邮件

此代码片段演示如何在正文中使用模板令牌发送电子邮件。 请注意,设置 BodyTemplateFilePath 属性时,我们不需要提供 Body 属性的值(模板文件的内容将复制到正文)。

new SendMail
{
    From = new LambdaValue<MailAddress>(ctx => new MailAddress("john.doe@contoso.com")),
    To = new LambdaValue<MailAddressCollection>(
                    ctx => new MailAddressCollection() { new MailAddress("someone@microsoft.com") }),
    Subject = "Test email",
    Host = "localhost",
    Port = 25,
    Tokens = new LambdaValue<IDictionary<string, string>>(ctx => tokens),
    BodyTemplateFilePath = @"..\..\..\SendMail\Templates\MailTemplateBody.htm",
};

在测试模式下发送邮件

此代码片段演示如何设置两个测试属性:通过设置为 TestMailTo 所有消息将发送到 john.doe@contoso.con (而不考虑 To、Cc、Bcc 的值)。 通过设置 TestDropPath,所有传出电子邮件也将记录在提供的路径中。 这些属性可以独立设置(它们不相关)。

new SendMail
{
   From = new LambdaValue<MailAddress>(ctx => new MailAddress("john.doe@contoso.com")),
   To = new LambdaValue<MailAddressCollection>(
                    ctx => new MailAddressCollection() { new MailAddress("someone@microsoft.com") }),
   Subject = "Test email",
   Host = "localhost",
   Port = 25,
   Tokens = new LambdaValue<IDictionary<string, string>>(ctx => tokens),
   BodyTemplateFilePath = @"..\..\..\SendMail\Templates\MailTemplateBody.htm",
   TestMailTo= new LambdaValue<MailAddress>(ctx => new MailAddress("john.doe@contoso.com")),
   TestDropPath = @"c:\Samples\SendMail\TestDropPath\",
};

设置说明

此示例需要访问 SMTP 服务器。

有关设置 SMTP 服务器的详细信息,请参阅以下链接。

第三方提供的 SMTP 模拟器可供下载。

运行此示例

  1. 使用 Visual Studio 打开SendMail.sln解决方案文件。

  2. 确保你有权访问有效的 SMTP 服务器。 请参阅设置说明。

  3. 使用你的服务器地址、发件人和收件人电子邮件地址配置程序。

    若要正确运行此示例,可能需要在 Program.cs 和 Sequence.xaml 中配置发件人和到电子邮件地址的值以及 SMTP 服务器的地址。 你需要更改这两个位置的地址,因为程序以两种不同的方式发送邮件

  4. 要生成解决方案,按 Ctrl+Shift+B。

  5. 若要运行解决方案,请按 Ctrl+F5。