如何使用interop.domino.dll将EML文件导入IBM Notes的NSF文件?
使用Interop.Domino.dll导入EML到Lotus Notes NSF的C#实现
前置准备
- 安装Lotus Notes客户端,正确引用
Interop.Domino.dll(可从Notes安装目录提取或通过COM引用添加) - 确认Notes客户端已配置可访问目标NSF文件
核心实现逻辑
通过Lotus Notes的MIME功能完成EML导入,流程如下:
- 初始化Notes会话并连接目标NSF数据库
- 读取EML文件字节流作为MIME数据源
- 在NSF中创建新邮件文档,启用MIME实体
- 将EML内容写入MIME实体,补充必要邮件属性
- 保存文档并释放COM资源
完整代码示例
using Domino; using System.IO; using System; class EmlToNsfImporter { static void Main(string[] args) { // 配置参数 string notesServer = ""; // 本地数据库留空,远程填写服务器名称 string nsfPath = @"C:\Notes\Data\mail\user_mail.nsf"; // 目标NSF路径 string emlFilePath = @"C:\Temp\sample.eml"; // 待导入的EML文件路径 string notesPassword = ""; // 客户端已登录可留空,否则填写密码 NotesSession session = null; NotesDatabase db = null; NotesDocument mailDoc = null; NotesMIMEEntity mimeEntity = null; try { // 初始化Notes会话 session = new NotesSession(); session.Initialize(notesPassword); // 打开目标NSF数据库 db = session.GetDatabase(notesServer, nsfPath, false); if (!db.IsOpen) { db.Open(); } // 创建新邮件文档 mailDoc = db.CreateDocument(); mailDoc.Form = "Memo"; // 指定邮件表单 // 读取EML文件内容 byte[] emlBytes = File.ReadAllBytes(emlFilePath); // 创建并填充MIME实体 mimeEntity = mailDoc.CreateMIMEEntity(); using (MemoryStream ms = new MemoryStream(emlBytes)) { mimeEntity.SetContentFromBytes(ms, "message/rfc822", MIME_ENCODING.ENC_IDENTITY_BINARY); } // 从EML解析主题(可选,也可直接从MIME头获取) string subject = ParseEmlSubject(emlFilePath); if (!string.IsNullOrEmpty(subject)) { mailDoc.ReplaceItemValue("Subject", subject); } // 保存文档 mailDoc.Save(true, false); Console.WriteLine("EML文件导入成功"); } catch (Exception ex) { Console.WriteLine($"导入失败:{ex.Message}"); } finally { // 释放COM对象,避免内存泄漏 if (mimeEntity != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(mimeEntity); if (mailDoc != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(mailDoc); if (db != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(db); if (session != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(session); } } // 简单解析EML主题的辅助方法,复杂编码场景建议用MimeKit优化 static string ParseEmlSubject(string emlPath) { foreach (var line in File.ReadAllLines(emlPath)) { if (line.StartsWith("Subject:", StringComparison.OrdinalIgnoreCase)) { return line.Substring(8).Trim(); } } return null; } }
注意事项
- 运行程序时需确保Lotus Notes客户端处于运行状态,或配置为允许后台访问
- 远程服务器场景需确认Notes客户端已获得服务器访问权限
- 若EML包含编码主题(如Base64),
ParseEmlSubject方法需改用专业MIME解析库(如MimeKit)处理 - 必须严格按顺序释放Notes COM对象,防止内存泄漏
内容的提问来源于stack exchange,提问作者James Williom
相关产品推荐
相关产品推荐

