SendMail 自定义活动

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

下表详细描述了 SendMail 活动的自变量。

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

此模板可包含由 tokens 属性的内容替换的标记。
TestMailTo MailAddress 设置此属性时,将所有电子邮件发送到其中指定的地址。

此属性应在测试工作流时使用。 例如,当你需要确保在不将电子邮件发送到实际收件人的情况下发送所有电子邮件时。
TestDropPath 字符串 设置此属性时,也将所有电子邮件保存到指定的文件中。

此属性应在测试或调试工作流时使用,以确保传出的电子邮件的格式和内容正确。

解决方案内容

解决方案包含两个项目。

项目 说明 重要文件
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。