SendMail 自定義活動

SendMail 範例示範如何建立衍生自 AsyncCodeActivity 的自定義活動,以使用 SMTP 傳送郵件,以在工作流程應用程式中使用。 自訂活動會使用 SmtpClient 的功能,以異步方式傳送電子郵件並使用驗證。 它也提供一些使用者功能,例如測試模式、令牌取代、檔案範本和測試置放路徑。

下表詳細說明活動的自變數 SendMail 。

名稱 類型 說明
主辦人 繩子 SMTP 伺服器主機的位址。
港口 繩子 主機中 SMTP 服務的埠。
EnableSsl 布爾 (bool) 指定是否 SmtpClient 使用安全套接字層 (SSL) 來加密連線。
UserName 繩子 用來設定認證以驗證寄件者 Credentials 屬性的用戶名稱。
密碼 繩子 用於驗證寄件者 Credentials 屬性的認證密碼。
主旨 InArgument<T> <字串> 訊息的主旨。
身體 InArgument<T> <字串> 訊息內容。
附件 InArgument<T> <字串> 用來儲存附加至此電子郵件訊息之數據的附件集合。
寄件者 MailAddress 此電子郵件訊息的來源位址。
發往 InArgument<T><MailAddressCollection> 包含此電子郵件訊息收件者的位址集合。
CC 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 模擬器可供下載。

若要執行此範例

  1. 使用 Visual Studio 開啟SendMail.sln方案檔。

  2. 請確定您可以存取有效的 SMTP 伺服器。 請參閱設定指示。

  3. 使用您的伺服器位址,以及 [寄件者] 和 [收件者] 電子郵件地址來設定程式。

    若要正確執行此範例,您可能需要在 Program.cs 和 Sequence.xaml 中設定 From 和 To 電子郵件地址的值,以及 SMTP 伺服器的位址。 因為程式會以兩種不同的方式傳送郵件,因此您必須變更這兩個位置的位址

  4. 若要建置此方案,請按 CTRL+SHIFT+B。

  5. 若要執行解決方案,請按 CTRL+F5。