使用Lotus Notes中的C#将电子邮件另存为eml

时间:2011-12-09 22:24:50

标签: c# export lotus-notes eml

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

下面的代码显示了我如何导出附件。你能建议我怎样修改它以保存电子邮件? 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);
        }
      }
    }
  }
}

2 个答案:

答案 0 :(得分:2)

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

或者在8.5.3版本中(我认为它从8.5.1开始)你可以将它从邮件文件拖放到文件系统。

答案 1 :(得分:1)

我知道有点晚了,但这就是我所做的。 (基于Bob Babalan) Bobs Solution帮助我理解了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);
  }
}