SendMail 範例示範如何建立衍生自 AsyncCodeActivity 的自定義活動,以使用 SMTP 傳送郵件,以在工作流程應用程式中使用。 自訂活動會使用 SmtpClient 的功能,以異步方式傳送電子郵件並使用驗證。 它也提供一些使用者功能,例如測試模式、令牌取代、檔案範本和測試置放路徑。
下表詳細說明活動的自變數 SendMail 。
| 名稱 | 類型 | 說明 |
|---|---|---|
| 主辦人 | 繩子 | SMTP 伺服器主機的位址。 |
| 港口 | 繩子 | 主機中 SMTP 服務的埠。 |
| EnableSsl | 布爾 (bool) | 指定是否 SmtpClient 使用安全套接字層 (SSL) 來加密連線。 |
| UserName | 繩子 | 用來設定認證以驗證寄件者 Credentials 屬性的用戶名稱。 |
| 密碼 | 繩子 | 用於驗證寄件者 Credentials 屬性的認證密碼。 |
| 主旨 | InArgument<T> <字串> | 訊息的主旨。 |
| 身體 | InArgument<T> <字串> | 訊息內容。 |
| 附件 | InArgument<T> <字串> | 用來儲存附加至此電子郵件訊息之數據的附件集合。 |
| 寄件者 | MailAddress | 此電子郵件訊息的來源位址。 |
| 發往 | InArgument<T><MailAddressCollection> | 包含此電子郵件訊息收件者的位址集合。 |
| 抄送 | InArgument<T><MailAddressCollection> | 包含此電子郵件訊息之副本 (CC) 收件者的位址集合。 |
| 密件副本 | InArgument<T><MailAddressCollection> | 位址集合,其中包含此電子郵件訊息的盲件副本(BCC)收件者。 |
| 代幣 | InArgument<T> <IDictionary<字串, 字串>> | 要替換文本中的標記。 在這項功能中,使用者可以在本文中指定一些值,這些值稍後可被此屬性提供的令牌取代。 |
| BodyTemplateFilePath (樣板文件路徑) | 繩子 | 本文範本的路徑。 活動會將 SendMail 這個檔案的內容複製到其 body 屬性。範本中可以包含一些令牌,這些令牌將由令牌屬性的內容替換。 |
| TestMailTo | MailAddress | 設定此屬性時,所有電子郵件都會傳送至其中指定的位址。 此屬性的目的是在測試工作流程時使用。 例如,當您想要確定所有電子郵件都會傳送,而不會傳送給實際收件者時。 |
| TestDropPath | 繩子 | 設定此屬性時,所有電子郵件也會儲存在指定的檔案中。 當您測試或偵錯工作流程時,此屬性是用來確定外寄電子郵件的格式和內容是適當的。 |
解決方案內容
方案包含兩個專案。
| 專案 | 說明 | 重要檔案 |
|---|---|---|
| 傳送郵件 | 「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 屬性中提供符號。 這些令牌的值會提供給 token 屬性。
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 屬性的值(範本檔案的內容將會被複製到 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\",
};
Set-Up 操作說明
此範例需要 SMTP 伺服器的存取權。
如需設定 SMTP 伺服器的詳細資訊,請參閱下列連結。
第三方提供的 SMTP 模擬器可供下載。
若要執行此範例
使用 Visual Studio 開啟SendMail.sln方案檔。
請確定您可以存取有效的 SMTP 伺服器。 請參閱設定指示。
使用您的伺服器位址,以及 [寄件者] 和 [收件者] 電子郵件地址來設定程式。
若要正確執行此範例,您可能需要在 Program.cs 和 Sequence.xaml 中設定 From 和 To 電子郵件地址的值,以及 SMTP 伺服器的位址。 因為程式會以兩種不同的方式傳送郵件,因此您必須變更這兩個位置的位址
若要建置此方案,請按 CTRL+SHIFT+B。
若要執行解決方案,請按 CTRL+F5。