共用方式為


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> 包含此電子郵件訊息收件者的位址集合。
抄送 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。