使用C#在Lotus Notes中将电子邮件消息保存为eml

3

我需要将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);
        }
      }
    }
  }
}

在发布代码之前,请预览您的代码(您可以通过查看您正在输入的区域下方来执行此操作)以进行格式化。这不仅使您的问题更易读,还节省了其他人修复它所需的时间。 :) 对于人们阅读和理解越容易,您获得答案的可能性就越大。谢谢。 - Ken White
2个回答

2
这篇由Bob Babalan撰写的文章解释了如何使用Java导出Lotus文档。相同的原则应该适用于C#或VB。该文档被转换为MIME格式并写入磁盘。
或者在8.5.3版本中(我认为从8.5.1开始),您可以直接将其从邮件文件拖放到文件系统中。

1
很遗憾,拖放到.eml功能不能通过API公开。 - leyrer
那么,绝对没有办法获取和保存电子邮件到硬盘驱动器吗? - Andrew
当然有办法,但可能需要像上面描述的那样进行一些编程。结果将是一个包含电子邮件的HTML文件。 - Jasper Duizendstra
Bob Babalan的文章提供了JavaScript解决方案。不幸的是,NotesDocument.convertToMIME()在COM类中没有暴露出来。Bob提供了一篇后续文章,其中包含使用C API调用的示例C#代码。请参见此处 - Jacob Quisenberry
@andrew,为什么一年多后就不再接受,并且没有解释? - Jasper Duizendstra
虽然这理论上回答了问题,但最好在此处包含答案的基本部分,并提供参考链接。 - Toby Speight

1
我知道有点晚了,但这就是我做的(基于Bob Babalan)。 Bob的解决方案帮助我很多地理解NotesMIMEEntities,但在他的解决方案中,他只遍历了MIME-Tree的第二个“层”。这将遍历多个层。
public static 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文件保存到指定路径。
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)
        GetMIME(writer, mimeEntity);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接