C#从Outlook电子邮件中拖放附件

时间:2015-10-08 14:58:43

标签: c# drag-and-drop outlook

我想使用/读取Outlook电子邮件中的附件到WinForm解决方案。

例如:电子邮件附有TXT文件;我想将TXT文件的Drag& Drog执行到WinForm中并同时读取TXT。

2 个答案:

答案 0 :(得分:5)

这是一个老问题,但无论如何我都会提供另一个不涉及使用Outlook对象的答案。

This URL提供了大约13年的工作代码,但似乎仍然有效,如何处理" FileGroupDescriptor"和" FileContents" Outlook传递给DropDrop事件的数据。如果链接死亡,这里是相关代码,直接复制/粘贴:

DragEnter事件:

<table class="m-table">
  <thead>
    <tr>
      <th>Price</th>
      <th>Algorithm Factor</th>
      <th>Links</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$1,326</td>
      <td>
        <label class="u-angle"></label>
      </td>
      <td>
        <a href="javascript:void(0);">Detail</a>
      </td>
    </tr>
  </tbody>
</table>

DragDrop事件:

private void Form1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
  // for this program, we allow a file to be dropped from Explorer
  if (e.Data.GetDataPresent(DataFormats.FileDrop))
  {  e.Effect = DragDropEffects.Copy;}
  //    or this tells us if it is an Outlook attachment drop
  else if (e.Data.GetDataPresent("FileGroupDescriptor"))
  {  e.Effect = DragDropEffects.Copy;}
  //    or none of the above
  else
  {  e.Effect = DragDropEffects.None;}
}

请注意,此代码不应包含private void Form1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { string [] fileNames = null; try { if ( e.Data.GetDataPresent(DataFormats.FileDrop,false) == true) { fileNames = (string []) e.Data.GetData(DataFormats.FileDrop); // handle each file passed as needed foreach( string fileName in fileNames) { // do what you are going to do with each filename } } else if (e.Data.GetDataPresent("FileGroupDescriptor")) { // // the first step here is to get the filename // of the attachment and // build a full-path name so we can store it // in the temporary folder // // set up to obtain the FileGroupDescriptor // and extract the file name Stream theStream = (Stream) e.Data.GetData("FileGroupDescriptor"); byte [] fileGroupDescriptor = new byte[512]; theStream.Read(fileGroupDescriptor,0,512); // used to build the filename from the FileGroupDescriptor block StringBuilder fileName = new StringBuilder(""); // this trick gets the filename of the passed attached file for(int i=76; fileGroupDescriptor[i]!=0; i++) { fileName.Append(Convert.ToChar(fileGroupDescriptor[i]));} theStream.Close(); string path = Path.GetTempPath(); // put the zip file into the temp directory string theFile = path+fileName.ToString(); // create the full-path name // // Second step: we have the file name. // Now we need to get the actual raw // data for the attached file and copy it to disk so we work on it. // // get the actual raw file into memory MemoryStream ms = (MemoryStream) e.Data.GetData( "FileContents",true); // allocate enough bytes to hold the raw data byte [] fileBytes = new byte[ms.Length]; // set starting position at first byte and read in the raw data ms.Position = 0; ms.Read(fileBytes,0,(int)ms.Length); // create a file and save the raw zip file to it FileStream fs = new FileStream(theFile,FileMode.Create); fs.Write(fileBytes,0,(int)fileBytes.Length); fs.Close(); // close the file FileInfo tempFile = new FileInfo(theFile); // always good to make sure we actually created the file if ( tempFile.Exists == true) { // for now, just delete what we created tempFile.Delete(); } else { Trace.WriteLine("File was not created!");} } } catch (Exception ex) { Trace.WriteLine("Error in DragDrop function: " + ex.Message); // don't use MessageBox here - Outlook or Explorer is waiting ! } } 对象,例如DisposeMemoryStream个对象。

答案 1 :(得分:0)

您可以使用GetActiveObject方法获取正在运行的Outlook实例,该方法允许从运行对象表(ROT)获取指定对象的运行实例。然后,您可以自动执行Outlook以获取当前选定或已打开的项目,可以从中拖动附件。有关示例代码,请参阅C# app automates Outlook (CSAutomateOutlook)