我正在开发一个Visual Studio扩展,它向VS添加一个命令,在Outlook中使用附件撰写邮件。附件是简单的.csv文件,也是由扩展程序生成的。 因此,当用户触发命令时,Outlook会打开一个窗口,其中已添加电子邮件并添加附件。用户可能只需单击“发送”。
现在我被要求增加发送用zip压缩的日志的可能性。我想用已压缩的附件撰写邮件,但我不希望在发送(或取消)邮件后保留任何临时.zip文件。我怎样才能做到这一点?
我的代码组成邮件并打开Outlook窗口:
using Microsoft.Office.Interop.Outlook;
...
private static bool TrySendMethod1(string subject, string toAddr, string body, string logPath)
{
try
{
Application app = new Application();
MailItem mailItem = app.CreateItem(OlItemType.olMailItem);
mailItem.Subject = subject;
mailItem.To = toAddr;
mailItem.Body = body;
if (logPath != null) mailItem.Attachments.Add(logPath);
mailItem.Importance = OlImportance.olImportanceNormal;
mailItem.Display(false);
return true;
}
catch (System.Exception e)
{
return false;
}
}
更新 组成电子邮件后,将显示带有撰写邮件的Outlook窗口(已设置附件)。现在,用户可能只是发送它,取消它或其他什么。他甚至可能会打开窗户几个小时(虽然这不常见)然后发送它(即使在VS关闭后)。同样,我不希望在发送或取消消息后,磁盘上存在任何临时存档。
我添加了发送电子邮件的完整方法。它不是更多,但是当用户选择我的扩展添加到它的新Visual Studio命令(工具 - >从本月发送TFS日志 - >)时,就会调用此方法。按钮处理程序之间只有一个额外的方法,它只是为这里给出的一个参数设置一些参数(设置主题,logPath等等......)
如果不可能,那么我也可以接受这样的答案。
答案 0 :(得分:1)
您可以使用以下方法压缩文件:
public static void Compress(FileInfo fileToCompress, string compressedFileName)
{
using (FileStream originalFileStream = fileToCompress.OpenRead())
{
using (FileStream compressedFileStream = File.Create(compressedFileName)
{
using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress))
{
originalFileStream.CopyTo(compressionStream);
}
}
}
}
修改自:http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx
要删除文件,您可以附加到MailItem.Unload Event
。
发生Outlook项目的关闭事件后发生此事件, 但在Outlook项目从内存中卸载之前,允许一个 加载项以释放与该对象相关的任何资源。虽然 事件发生在Outlook项目从内存中卸载之前,这个 事件无法取消。
来源:http://msdn.microsoft.com/en-us/library/office/ff868564(v=office.15).aspx
然后你TrySendMethod1看起来像这样
private static bool TrySendMethod1(string subject, string toAddr, string body, string logPath)
{
try
{
Application app = new Application();
MailItem mailItem = app.CreateItem(OlItemType.olMailItem);
mailItem.Subject = subject;
mailItem.To = toAddr;
mailItem.Body = body;
string compressedFileName = logpath + ".gz";
CompressedStack(logpath, compressedFileName);
if (logPath != null) mailItem.Attachments.Add( compressedFileName );
mailItem.Importance = OlImportance.olImportanceNormal;
mailItem.Display(false);
mailItem.Unload += (e) => {File.Delete(compressedFileName);};
return true;
}
catch (System.Exception e)
{
return false;
}
}
File.Delete
的异常处理缺失,我不确定100%是否对Unload
事件的签名进行了认证,但请尝试告诉我们。
这不会处理在发送邮件之前Visual Studio关闭的情况! (我认为这甚至可能无法实现。)