Lotus Notes – 保存整个电子邮件eml c#

我需要导出(保存到)硬盘我的Lotus Notes电子邮件。 我想出了如何将附件保存到硬盘驱动器的方法,但我无法弄清楚如何保存整个电子邮件的方式。

下面的代码显示了我如何导出附件。 你能建议我如何修改它来保存电子邮件? PS-我是编程新手。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Domino; using System.Collections; namespace ExportLotusAttachments { class Class1 { public void ScanForEmails() { String textBox1 = "c:\\1"; NotesSession session = new NotesSession(); session.Initialize(""); NotesDbDirectory dir = null; dir = session.GetDbDirectory(""); NotesDatabase db = null; db = dir.OpenMailDatabase(); NotesDatabase NDb = dir.OpenMailDatabase(); //Database connection //ArrayList that will hold names of the folders ArrayList LotusViews2 = new ArrayList(); foreach (NotesView V in NDb.Views) { if (V.IsFolder && !(V.Name.Equals("($All)"))) { NotesView getS = V; LotusViews2.Add(getS.Name); } } foreach (String obj in LotusViews2) { NotesDocument NDoc; NotesView nInboxDocs = NDb.GetView(obj); NDoc = nInboxDocs.GetFirstDocument(); String pAttachment; while (NDoc != null) { if (NDoc.HasEmbedded && NDoc.HasItem("$File")) { object[] AllDocItems = (object[])NDoc.Items; foreach (object CurItem in AllDocItems) { NotesItem nItem = (NotesItem)CurItem; if (IT_TYPE.ATTACHMENT == nItem.type) { String path = textBox1; pAttachment = ((object[])nItem.Values)[0].ToString(); if (!System.IO.Directory.Exists(path)) { System.IO.Directory.CreateDirectory(textBox1); } try { NDoc.GetAttachment(pAttachment).ExtractFile(@path + pAttachment); } catch { } } } } NDoc = nInboxDocs.GetNextDocument(NDoc); } } } } } 

Bob Babalan的 这篇文章解释了如何使用Java导出Lotus文档。 同样的原则应该适用于C#或VB。 该文档被转换为MIME并写入磁盘。

或者在V8.5.3中(我认为它从8.5.1开始)您只需将其从邮件文件拖放到文件系统即可。

我知道这有点晚了,但这就是我所做的。 (基于Bob Babalan )Bobs Solution帮助我理解NotesMIMEEntities,但在他的解决方案中,他只将MIME-Tree遍历到第二个“层”。 这将遍历多个层。

 public void GetMIME(StreamWriter writer, NotesMIMEEntity mimeEntity) { try { string contentType = null; string headers = null; string content = null; string preamble = null; MIME_ENCODING encoding; contentType = mimeEntity.ContentType; headers = mimeEntity.Headers; encoding = mimeEntity.Encoding; // message envelope. If no MIME-Version header, add one if (!headers.Contains("MIME-Version:")) writer.WriteLine("MIME-Version: 1.0"); writer.WriteLine(headers); // for multipart, usually no main-msg content... content = mimeEntity.ContentAsText; if (content != null && content.Trim().Length > 0) writer.WriteLine(content); writer.Flush(); if (contentType.StartsWith("multipart")) { preamble = mimeEntity.Preamble; NotesMIMEEntity mimeChild = mimeEntity.GetFirstChildEntity(); while (mimeChild != null) { GetMimeChild(writer, mimeChild); mimeChild = mimeChild.GetNextSibling(); } } writer.WriteLine(mimeEntity.BoundaryEnd); writer.Flush(); } catch (Exception ex) { Logging.Log(ex.ToString()); } } private void GetMimeChild(StreamWriter writer, NotesMIMEEntity mimeEntity) { string contentType = null; string headers = null; string content = null; string preamble = null; MIME_ENCODING encoding; contentType = mimeEntity.ContentType; headers = mimeEntity.Headers; encoding = mimeEntity.Encoding; if (encoding == MIME_ENCODING.ENC_IDENTITY_BINARY) { mimeEntity.EncodeContent(MIME_ENCODING.ENC_BASE64); headers = mimeEntity.Headers; } preamble = mimeEntity.Preamble; writer.Write(mimeEntity.BoundaryStart); if (!content.EndsWith("\n")) writer.WriteLine(""); writer.WriteLine(headers); writer.WriteLine(); writer.Write(mimeEntity.ContentAsText); if (contentType.StartsWith("multipart")) { preamble = mimeEntity.Preamble; NotesMIMEEntity mimeChild = mimeEntity.GetFirstChildEntity(); while (mimeChild != null) { GetMimeChild(writer, mimeChild); mimeChild = mimeChild.GetNextSibling(); } } writer.Write(mimeEntity.BoundaryEnd); writer.Flush(); } 

我会这样调用这个方法,将EML-File保存到给定的路径。

 using (FileStream fs = new FileStream (path,FileMode.Create,FileAccess.ReadWrite,FileShare.None)) { using (StreamWriter writer = new StreamWriter(fs)) { NotesMimeEntity mimeEntity = notesDocument.GetMIMEEntity(); if (mimeEntity != null) email.GetMIME(writer, mimeEntity); } }