學習大綱:
- 如何使用電子郵件相關的專用活動
- 如何發送和接受郵件
- 如何篩選郵件及下載附件
- 如何使用郵件模板
1. 與Email進行交互
1) Email作為Input:
- 從Email標題和主體部分獲取文本信息,如名稱、ID等。
- 從Email附件中獲取各種文件,如xlsx、pdf文件等。
2) Email作為Output:
- 發送進度報告。
- 發送意外情況提醒,比如應用程序報錯。
3) Email相關的活動:
- SMTP:Simple Mail Transfer Protocol。一種基礎的郵箱協議,僅能用來發送消息。
- POP3:Post Office Protocol。一種古老到幾乎被淘汰的協議,用來收取消息。但是大部分的郵件服務器支持這種協議。
- IMAP:Internet Message Access Protocol。僅能用來收取消息,但UiPath還提供一些功能,可以標記消息為已讀,或將郵件移動到其他文件夾。
- Exchange:微軟提供的企業級電子郵件解決方案。UiPath能很好地與之整合,可以發送消息,收取消息,移動郵件,刪除郵件。
- Outlook:與上述幾種略有不同,Outlook的相關活動是與應用程序的API進行交互。在運行時,這些活動已經有了背景信息(基於已有的Outlook賬戶的設置),因此不需要再為它們設置服務器名、用戶名及填寫其他的技術信息。
- UiPath還提供了兩個通用的Mail活動,用來將郵件和郵件中的附件保存到本地磁盤中。
2. 查看/檢索郵件
1) Get Mail Messages活動
UiPath提供了下列4種Get Mail Messages活動。它們的功能相同,提供的可選參數也非常相似。
- Get POP3 Mail Messages
- Get IMAP Mail Messages
- Get Exchange Mail Messages
- Get Outlook Mail Messages
可選參數:
- Host - MailFolder:指定從某個特定的郵箱文件夾里收取消息。
- Options - OnlyUnreadMessage:只獲取未讀消息。
- Options - MarkAsRead:標記為已讀。與OnlyUnreadMessage一起使用,可以避免一些重復操作。
- Options - Top:限制收到電子郵件的最大數量。
2) Connection參數
Connection的參數是用來設置服務器連接的。需要填寫用戶郵箱和密碼,該郵箱的服務器地址和端口(port)一般也是必填的。
注意:在沒有填寫Connection相關參數的情況下,IMAP和POP3的Get Mail Messages活動出現了有效性警告標志,但是Outlook和Exchange的卻沒有。這是由於Exchange和Outlook的活動可以使用默認值並且自動獲取服務器的信息,而POP3和IMAP的活動必須要填寫Connection參數才能運行。
3) 最便利的選擇
如果已經配置好Outlook,那么使用Outlook活動來收取郵件是最便利的選擇。因為它需要設置的參數最少,並且還提供了額外的功能,比如Filter功能。使用Outlook活動可以兼容任何郵件協議。
4) 示例1:使用Get IMAP Mail Messages活動檢索郵件。
- 設置Connection參數:參數信息通常由電子郵件的供應商或者IT部門提供。此例使用Google郵箱,在參數Server里填入imap.gmail.com;Port里填入993;Email和Password里填入郵箱和密碼,此處使用變量來表示。
- 設置其他參數:勾選OnlyUnreadMessages參數,設置為僅讀取未讀消息;將Top參數設置為5,使讀取消息的上限為5條;將消息存儲到變量messages中,該變量為List<MailMessage>類型。
- 添加For Each活動在獲取的郵件列表中循環檢索。在For Each活動的TypeArgument參數里設置item的類型為MailMessage型。將item改為mail。
注意:搜索MailMessage類型時會獲得兩個結果,我們要使用的是System.Net.Mail下的MailMessage類型。
- 在For Each循環里添加一個Message Box活動來顯示郵件的標題。輸入mail.會出現下拉菜單,其中包括主體、標題、收件人、寄件人等很多選項,此處選擇顯示mail.Subject。
- 最終的Workflow顯示為:
5) 示例1拓展:基於實例1,根據已知的命名規則來篩選郵件,將符合命名規則的郵件中的附件下載到本地。
Email命名示例:Employee #123456 personal data change request
- 將For Each活動里的Message Box活動刪除,並添加一個If活動。將條件設置為mail.Subject.Contains("personal data change request")。
- 在If活動的Then里添加一個Save Attachments活動。MailMessage參數設置為mail(循環變量),FolderPath參數設置存儲附件的路徑為”Attachments“。
附加要求:將每個郵件的附件分別存儲在指定路徑的子文件夾中,並用Employee ID命名該子文件夾。
- 添加一個字符串型變量employeeNumber。
- 在Save Attachments活動之前添加一個Assign活動。左邊填入變量emloyeeNumber,右邊填入mail.Subject.Split("#".ToCharArray)(1).Split(" ".ToCharArray)(0)。
- 將Save Attachments活動的FolderPath更改為"Attachments/" + employeeNumber。
注意:mail.Subject.Split("#".ToCharArray)(1)將標題Employee #123456 personal data change request分隔為Employee和123456 personal data change request兩部分,(1)表示取第二個值;.Split(" ".ToCharArray)(0)表示將123456 personal data change request通過空格進行分隔,取其中的第一個值,即123456。
6) 示例2:使用Get Outlook Mail Messages通過篩選獲取24小時內的郵件。
- 添加一個Get Outlook Mail Messages活動,創建一個List<MailMessage>類型變量messages。OnlyUnreadMessage參數默認是選中的,不需要做更改。
- 使用messages.Count.ToString可以獲取未讀郵件的數量。
添加一個
For Each活動
-
,在未讀郵件中循環。MailMessage對象的大部分屬性可以從郵件的標題中提取,但不包括時間戳。時間需要用mail.Headers("Date")來提取。
- 使用Headers篩選的缺點:Email需要先讀取郵件才能獲得郵件的Headers屬性,這可能會拖慢運行速度。
- Outlook提供了非常方便的篩選參數Filter,可以通過不同的標准進行篩選,如Subject,SenderEmailAddress,ReceiveTime等。如果要篩選24小時內收到的郵件,可以寫入"[ReceivedTime] > 01/18/2017 12:38 PM"。但是通常情況下,我們不會把日期寫成一個固定的值,所以“24小時內”將會表示為:"[ReceivedTime] >= '" + Now.AddDays(-2).ToString("MM/dd/yyyy hh:mm tt") +"'"。
- Now.AddDay(-1)表示現在的時間減去一天。
- Filter功能的實現依賴於Microsoft組件,更多的Expression詳情可以參見Microsoft的官方文檔 Items.Find Method (Outlook)。
3. 發送郵件
1) Send Mail Messages活動
UiPath提供了下列3種Send Mail Messages活動。
- Send SMTP Mail Messages (SMTP=Simple Mail Transfer Protocol)
- Send Outlook Mail Messages
- Send Exchange Mail Messages
2) 示例:發送一封郵件。
- 添加一個Send SMTP Mail Messages活動。
- 設置活動的Connection參數。使用Google的服務器,Server參數為smtp.gmail.com,Post參數為587參數Email和Password。
- 設置活動的Logon參數,使用變量表示Email參數和Password參數;還可以設置Sender下的Name參數來自定義發件人的名稱。
- 最后填入在To里寫入收件人郵箱,Subject里寫入郵件標題,Body里寫入郵件正文即可。
3) 示例拓展:使用更規范的正文,並添加附件。
- 將正文寫入一個txt文本文件里,添加一個Read Text File活動讀取該文件,並保存在變量template中。
- 直接把正文寫到Body參數里會比較難管理和維護,更方便的做法是使用模板文件,模板文件可以使用HTML格式或者純文本格式。
- 使用template的另一個好處是,通過String.Format功能,在運行程序時把文本中的占位符更改為動態內容。
- 將Send SMTP Mail Messages活動的Body參數設置為String.Format(template, Now),可以在運行時將占位符{0}更改為實時時間。
- 添加一個Take Screenshot活動,該活動會生成一個png圖片。創建一個Image型變量screenshot用來保存圖片。
- 添加一個Save Image活動,將screenshot保存在硬盤上。Send Mail活動的附件只接受文件路徑,因此需要將圖片保存下來。
- 點擊Send SMTP Mail Messages活動中的Attach Files,在彈出的窗口中填寫添加附件的路徑。
- 運行程序將收到下圖中的郵件。
4. 練習1
1) 要求:讀取收件箱中的郵件並對郵件進行排序,按照Excel文件中規定的規則將郵件移動到不同的文件夾里。
*如果郵件的發件人地址中包含Sender列里的某個值,則將這封郵件移動到對應的Folder列的郵件文件夾里。
2) 流程:此處使用Get Outlook Mail Messages活動來完成練習。使用其他Get Mail活動的流程略有不同,但主邏輯和用到的活動大致相同。
- 添加一個Get Outlook Mail Messages活動,使用Outlook的默認賬戶,設置好從哪個文件夾里讀信,將讀取的郵件存儲在List<MailMessage>型變量email里。
- 添加一個Read Range活動來讀取Excel文件中的規則,創建一個DataTable型變量mailRules來保存規則。
- 添加一個For Each活動建立循環,需要設置循環個體的TypeArgument為MailMessage型以在郵件中進行循環。
- 添加一個For Each Row活動,在DataTable變量mailRules中進行循環,判斷某一封郵件是否符合任一規則。
- 添加一個If活動,判斷郵件的發件人地址是否包含mailRules中的Sender列的值。
- 如果包含,則添加一個Move Outlook Mail Message活動,將郵件移動到對應行Folder列的值表示的文件夾中。
- 我們還需要添加一個斷點,當郵件已經符合某一規則就跳出For Each Row活動。
5. 練習2
1) 要求:
- 讀取"Session 11 - exercise 2 - UiPathOrchestratorAzureInstallationGuide2016.1.pdf"的第六頁;
- 讀取"Session 11 - exercise 2 - ScannedDoc.pdf"的第二頁;
- 發送一封郵件,將兩個pdf文件附上,將之前讀取的內容作為郵件的正文。
2) 思路:
- 第一個pdf文件是native pdf,即文本可選取,所以可以使用Read PDF Text活動讀取。將Range參數設置為6,創建一個變量installationPDFText存儲讀取的內容。
- 第二個pdf文件是掃描版的pdf,即所有內容都是圖像,無法選取任何元素,所以需要使用Read PDF with OCR活動讀取。將Range參數設置為2,創建一個變量invoicePDFText。
- 添加一個Send Outlook Mail Messages活動,設置好To和Subject參數。在Body參數中填入installationPDFText + invoicePDFText。
*本課使用過的新活動、方法、函數等:
- Get POP3 Mail Messages活動
- Get IMAP Mail Messages活動
- Get Exchange Mail Messages活動
- Get Outlook Mail Messages活動
- Save Attachments活動
- Send SMTP Mail Messages活動
- Send Outlook Mail Messages活動
- Send Exchange Mail Messages活動
- Take Screenshot活動
- Save Image活動
- mail.Subject.Contains("xxx"):郵件標題中是否包含xxx,mail是一個MailMessage型變量。
- messages.Count.ToString:郵箱中郵件的數量。
- mail.Headers("Date"):郵件的時間戳。