JavaMail setDebug(true)

JavaMail setDebug(true),java,stream,jakarta-mail,Java,Stream,Jakarta Mail,如何在JavaMail会话上捕获流并在日志框架中使用它?(除了下载源代码、更改方法以接受流作为参数、重新编译流等) 更一般地说,Java中是否有一种标准的方法可以以这种方式“劫持并重定向”通用流输出?请注意,System.out可能已经被其他输出污染,我不知道如何“过滤”它…您可以将打印流链接到ByteArrayOutputStream,告诉JavaMail使用您的打印流,执行JavaMail操作,最后将ByteArrayOutputStream的内容转储到您喜爱的记录器 Byt

如何在JavaMail会话上捕获流并在日志框架中使用它?(除了下载源代码、更改方法以接受流作为参数、重新编译流等)


更一般地说,Java中是否有一种标准的方法可以以这种方式“劫持并重定向”通用流输出?请注意,System.out可能已经被其他输出污染,我不知道如何“过滤”它…

您可以将打印流链接到ByteArrayOutputStream,告诉JavaMail使用您的打印流,执行JavaMail操作,最后将ByteArrayOutputStream的内容转储到您喜爱的记录器

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        PrintStream ps = new PrintStream(os);
        Session mailSession = Session.getDefaultInstance(props, null);
        try {
           if (MAIL_DEBUG) {
                logger.info("JAVAMAIL debug mode is ON");
                mailSession.setDebugOut(ps);
                mailSession.setDebug(true);  
            }
            ...
            transport.close();
            if (MAIL_DEBUG) {
                logger.info(os);
            }
        }
          finally {
            ps.close();
            os.close();
        }

一旦我将其设置为stream,并将调试保持在logger中,它就不再显示在控制台中。是否有办法确保setdebug同时显示在控制台上?@daredevil,可能在
if(MAIL\u DEBUG)
中添加
System.out.println(os.toString())?我做到了。我试图在命令提示符下以jar文件的形式运行它,但没有;t输出到控制台。奇怪的
MAIL\u DEBUG
在哪里声明?我没有使用if语句。
MAIL\u DEBUG
只是一个标记,您可以定义它来控制程序的调试模式。它不是JavaMail的一部分。可以尝试使用
System.err.println(os.toString())
我添加了这个
System.out.print(“电子邮件发送成功\n”),它设法在命令提示符下打印出来,但没有在os.tostring上打印出来