如何在数据库中存储带附件的电子邮件

时间:2015-12-30 11:49:37

标签: c# save email-attachments eml

在我的程序中,我通过拖放到我的表单上收到.eml个文件。

我可以毫无问题地存储此文件。此外,当重新打开已删除的.eml文件的(副本)时,我可以在默认应用程序(即默认邮件客户端)中打开它。

我可以看到附件,但是,当试图打开它们时,没有任何反应。

有没有办法将封装邮件的附件封装到.eml文件中?

我知道我可以简单地将附件存储在某处,但是,我必须修改.eml以考虑新的位置,这是一个麻烦,在我的情况下,我会真想避免...

编辑: - 通过将文件转换为.eml数组来存储byte[]文件,然后将其存储到数据库中。

byte[] savedToDB = File.ReadAllBytes(docPath);

通过以下(伪)代码预览文件:

1)从数据库加载byte[]数组

2)使用以下代码保存为临时文件:

string tmpPath = System.IO.Path.GetTempFileName().Replace(".tmp", ".eml");  
using (FileStream fs = new FileStream(tmpPath, FileMode.Create, FileAccess.Write)) {  
      fs.Write(bytesFromDB, 0, bytesFromDB.Length);  
      fs.Close();  
}  
File.SetAttributes(@tmpPath, File.GetAttributes(tmpPath) | FileAttributes.Temporary);  
if (File.Exists(tmpPath)) {  
    System.Diagnostics.Process p = System.Diagnostics.Process.Start(path);  
}

更新2 问题似乎在于我显示文件的方式,而不是我存储它的方式。

实际上,我的代码如下:

// see code above for storing the temporary file...
// replace the following line 
// System.Diagnostics.Process p = System.Diagnostics.Process.Start(path);  
// by following code...
var worker = new BackgroundWorker();
    worker.WorkerReportsProgress = false;
    worker.WorkerSupportsCancellation = false;
    worker.DoWork += (s, e) => {
      System.Diagnostics.Process p = System.Diagnostics.Process.Start(path);
      // wait 1 second at least!
      System.Threading.Thread.Sleep(1000);
      p.WaitForExit();
    };
    worker.RunWorkerCompleted += (s, e) => {
      File.Delete(path);
    };

问题是BackgroundWorker在预览窗口仍处于打开状态时终止 - 这会删除临时文件,因此会丢失附件的路径。

所以我的问题是:有没有正确的方法来确保文件在关闭后被删除?如果没有,系统会自动刷新临时文件(在临时文件夹中),如果是,何时?

我需要确保打开的文件没有堆积到客户端的磁盘上......

0 个答案:

没有答案