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 模拟器可供下载。
运行此示例
使用 Visual Studio 打开SendMail.sln解决方案文件。
确保你有权访问有效的 SMTP 服务器。 请参阅设置说明。
使用你的服务器地址、发件人和收件人电子邮件地址配置程序。
若要正确运行此示例,可能需要在 Program.cs 和 Sequence.xaml 中配置发件人和到电子邮件地址的值以及 SMTP 服务器的地址。 你需要更改这两个位置的地址,因为程序以两种不同的方式发送邮件
要生成解决方案,按 Ctrl+Shift+B。
若要运行解决方案,请按 Ctrl+F5。