java 如何编程将Lotus Notes电子邮件文档转换为MIME格式

qlvxas9a  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(132)

我开始开发一个复杂的解决方案,然后发现DxlExporter可以为你做所有的工作。我想分享这个简单的解决方案。

9jyewag0

9jyewag01#

@jch,我用你的代码测试Notes生成的消息时效果很好,但我对来自互联网的消息失去了html保真度,或者根本没有html。你有没有尝试过另一种方法来处理互联网生成的帖子(那些带有一些html表格和div的帖子)?
我尝试添加以下内容,但没有成功:

exporter.setRichTextOption(RICHTEXTOPTION_RAW); 
    exporter.setConvertNotesBitmapsToGIF(true); 
    if (doc.hasItem("$KeepPrivate")) {
        doc.removeItem("$KeepPrivate"); 
    }
    doc.convertToMIME(Document.CVT_RT_TO_HTML);
mw3dktmi

mw3dktmi2#

通过convertToMIME()将文档转换为MIME后,使用DxlExporter完成其余工作。它创建包含<mime>标记的XML输出,完全转换后的MIME格式文档的输出驻留在该标记中。此代码不执行完整的XML解析。它只是获取<mime> </mime>标记之间的所有内容。我用这段代码成功地转换了成千上万的电子邮件文档,只有少数几次失败--所有的失败都来自格式不好的外部电子邮件文档。我在Notes原始电子邮件文档上有100%的成功。

import lotus.domino.Document;
import lotus.domino.DxlExporter;
import lotus.domino.NotesException;
import lotus.domino.Session;

public class DocToMimeConverter
{
    private static final int MIMEOPTION_DXL = 0;
    private static final String tagStart = "<mime><![CDATA[";
    private static final String tagEnd = "]]></mime>";

    private DxlExporter exporter = null;
    
    public DocToMimeConverter(Session session) throws NotesException
    {
        super();
        exporter = session.createDxlExporter();
    }

    public String convert(Document doc) throws NotesException
    {
        String mimeDoc = null;
        
        exporter.setMIMEOption(MIMEOPTION_DXL);
        
        doc.removeItem("$KeepPrivate");
        doc.convertToMIME(Document.CVT_RT_TO_PLAINTEXT_AND_HTML);
        String dxl = exporter.exportDxl(doc);
        
        int idxStart = dxl.indexOf(tagStart);
        int idxEnd = dxl.indexOf(tagEnd);
        
        if (idxStart != -1 && idxEnd != -1 && idxEnd > idxStart)
        {
            mimeDoc = dxl.substring(idxStart + tagStart.length(), idxEnd);
        }
        
        return mimeDoc;
    }
}

$KeepPrivate将防止任何包含它的文档失败。所以如果你也想转换那些文档,请包括doc.removeItem("$KeepPrivate")
同样在调用程序中:

Session s = NotesFactory.createSession((String)null, (String)null, NotesAuth.getPassword());
s.setConvertMIME(false);

setConvertMIME(false)说不要将任何本机MIME格式的文档转换为Notes格式。如果您的目标是进行MIME转换,这很有用。节省了一点时间和任何往返不准确。
我使用下面的代码在调用程序中选择电子邮件:

if ("Memo".equals(doc.getItemValueString("Form")) ||
        "Reply".equals(doc.getItemValueString("Form")))

在我的用例中,我使用Notes文档的UUID沿着'*.EML'为每个电子邮件创建单独的文件,然后将这些文件成功导入到另一个电子邮件系统中。

相关问题