背景:
天津的同事需要给位于北京的TestTrack里面报Bugs,但是没有权限,只能发邮件给北京同事,由bj同事手动添加,为此我们需要开发一个工具来自动依据邮件生成TT记录
方案:
Outlook Add-in + python脚本
Add-in实现自动截获邮件,保存MailItem.Body为txt文本,由python编写的脚本将生成的txt借助TestTrack SDK提供的api保存到TestTrack。
实现:
Add-in
1. 在ThisAddIn_Startup中使用NewMailEx,不要使用NewMail。
- NewMailEx,当有新邮件到来时会触发,他检索的位置包括刚刚收到的邮件,而NewMail,新邮件到来时也会触发,但是仅能在inbox和子subfolder下检索
见MSDN解释:
NewMailEx:
Occurs when one or more new items are received in the Inbox. This event passes a list of entry IDs of all the items received in the Inbox since the last time the event was fired.
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
this.Application.NewMailEx += new Outlook.ApplicationEvents_11_NewMailExEventHandler(Application_NewMailEx);
}
void Application_NewMailEx(string EntryIDCollection)
{
//Todo: handle coming mail item
}
2. 使用Application.Session.GetItemFromID(id)来获取MailItem
var item = Application.Session.GetItemFromID(id) as Outlook.MailItem;
3. 使用正则表达式来筛选邮件
- 使用正则表达式检查MailItem.Subject 是否match “[XXX]:”
string regStr = @"^[.\S]:";
- 使用SenderAddress来检查发件人
4. 获取邮件Body,使用字符串处理方式处理邮件内容
- 可以直接使用MailItem.SaveAs()直接保存邮件标题、发件人、发件地址、正文等内容
- 可以使用MailItem.Body直接读取邮件正文,自己编写保存方法
public static void SaveAsTXT(string fileName, string content, FileMode mode)
{
if (string.IsNullOrEmpty(fileName) == false || mode == null)
{
throw new ArgumentNullException("SaveAsTXT");
}
FileStream ofs = null;
StreamWriter sw = null;
try
{
ofs = new FileStream(fileName, mode);
sw = new StreamWriter(ofs);
sw.WriteLine(content);
}
catch (Exception ex)
{
string msg = string.Format("fail to save as txt, detail is {0}", ex.ToString());
sw.WriteLine();
}
finally
{
if (sw != null)
{
sw.Close();
}
if (ofs != null)
{
ofs.Close();
}
}
}
Pythoe
// 明天再写。。。