C#从Outlook Email拖放附件的文件

问题描述 投票:0回答:2

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

EX:该电子邮件包含一个TXT文件;我想将txt文件的拖放和drog执行到winform中,并同时阅读txt。

c# drag-and-drop outlook
2个回答
22
投票
URL提供了大约13年历史的工作代码,但似乎仍然有效,如何处理Outlook传递到Dropdrop事件的“ FileGroupDescriptor”和“ Filecontents”数据。 以防万一链接死亡,这是相关代码,直接复制/粘贴:

dragenter事件:

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;} } dragdrop事件:

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 ! } }

注意,此代码不是应该的对象,例如
Dispose

MemoryStream

对象。

您可以使用

getActiveObject

方法获得跑步的Outlook实例,该方法允许从运行对象表(ROT)获得指定对象的运行实例。然后,您可以自动化Outlook以获取可能从中拖动附件的当前选择或打开的项目。有关示例代码
    
我尝试使用解决方案。
我总是得到一个审判
byte [] filebytes = new Byte [ms.length];


0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.