Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I began developing a complex solution then found that the DxlExporter will do all the work for you. I wanted to share this simple solution.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
187 views
Welcome To Ask or Share your Answers For Others

1 Answer

After converting the doc to MIME via convertToMIME() use the DxlExporter to do the rest of the work. It creates XML output that contains a <mime> tag in which the output of the fully converted MIME format document resides. This code does not do a full XML parse. It simply grabs everything between the <mime> </mime> tags. I've successfully converted 10s of thousands of email documents with this code with only a handful of failures - with all of those coming from badly formatted external email documents. I've had 100% success on Notes-originated email documents.

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;
    }
}

The $KeepPrivate will prevent any document containing it to fail. So include doc.removeItem("$KeepPrivate") if you want to convert those documents also.

Also in the calling program:

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

The setConvertMIME(false) says to not convert any native MIME formatted documents to Notes format. Useful if your objective is to do a MIME conversion. Saves a little time and any round trip inaccuracies.

I used the following code to select email messages in the calling program:

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

For my use case I used the UUID of the Notes document along with the '*.EML' to create individual files for each email message. These were then successfully imported into another email system.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...