1

我们使用的是 apache commons mail,特别是 ImageHtmlEmail。我们真的很想记录每封发送的电子邮件 - 与发送时完全相同 - 在完美的世界中,您可以将其粘贴到 sendmail 中 - 包括所有标题和其他信息。

这主要是为了解决我们遇到的一些问题,因为它显示为 text/plain 而不是 text/html - 但也因为在我们的日志中准确记录系统发出的内容会很好。

所以本质上 - 梦想是一个函数,它将接受一个 ImageHtmlEmail 并返回一个字符串 -因为它将被发送。我知道我可以自己将它渲染成一个字符串,但是我绕过了库函数中正在执行的任何操作,这是我们真正想要捕获的。我尝试了 BuildMimeMessage,然后尝试了 getMimeMessage,我认为这可能是正确的第一步 - 但这只是给我留下了如何将 mimemessage 转换为字符串的问题。

4

1 回答 1

0

我有一种解决方案 - 但希望有更好的解决方案:

/**
 * add content of this type
 *
 * @param builder
 * @param content
 */
private static void addContent(final StringBuilder builder, final Object content)
{
    try
    {
        if (content instanceof MimeMultipart)
        {
            final MimeMultipart multi = (MimeMultipart) content;
            for (int i = 0; i < multi.getCount(); i++)
            {
                addContent(builder, ((MimeMultipart) content).getBodyPart(i));
            }
        }
        else if (content instanceof MimeBodyPart)
        {

            final MimeBodyPart message = (MimeBodyPart) content;
            final Enumeration<?> headers = message.getAllHeaderLines();
            while (headers.hasMoreElements())
            {
                final String line = (String) headers.nextElement();
                builder.append(line).append("\n");
            }
            addContent(builder, message.getContent());
        }
        else if (content instanceof String)
        {
            builder.append((String) content).append("\n");
        }
        else
        {
            System.out.println(content.getClass().getName());
            throw CommonException.notImplementedYet();
        }
    }
    catch (final Exception theException)
    {
        throw CommonException.insteadOf(theException);
    }

}

/**
 * get a string from an email
 *
 * @param email
 * @return
 */
public static String fromHtmlEmail(final ImageHtmlEmail email)
{
    return fromMimeMessage(email.getMimeMessage());
}

/**
 * @param message
 * @return a string from a mime message
 */
private static String fromMimeMessage(final MimeMessage message)
{
    try
    {
        message.saveChanges();
        final StringBuilder output = new StringBuilder();
        final Enumeration<?> headers = message.getAllHeaderLines();
        while (headers.hasMoreElements())
        {
            final String line = (String) headers.nextElement();
            output.append(line).append("\n");
        }
        addContent(output, message.getContent());
        return output.toString();
    }
    catch (final Exception theException)
    {
        throw CommonException.insteadOf(theException);
    }
}

}

于 2015-07-02T07:01:51.357 回答