需要更详细的日志记录——MimeMessage 和 SMTP 邮件

More detailed logging needed -- MimeMessage and SMTP Mail

我有以下功能,可以向某些收件人发送电子邮件。 从我的本地机器测试功能没问题。现在我已经将该功能实现为批处理作业的一部分。 日志记录表明 MimeMessage message = new MimeMessage(session); 可能存在问题。 我的日志文件中的最后一行是 INFO: Generate Session with Mail-Server.

我需要的是一些想法,如何增强日志记录并找到函数在构造函数处结束的原因。

我已经尝试 运行 服务器终端中的功能,但结果相同。函数在 MimeMessage 构造函数处终止的信息滞后有点令人担忧。

    public static void sendErrorMail(Properties prop, Logger logger) throws IOException {
    // Get the session object
    Properties properties = System.getProperties();
    properties.setProperty("mail.smtp.host", prop.getProperty("addo.host"));
    logger.info("Mail Host set to: " + prop.getProperty("addo.host"));
    Session session = Session.getDefaultInstance(properties);
    logger.info("Try generating and sending Mail.");
    // compose the message
    try {
        logger.info("Generate Session with Mail-Server.");
        MimeMessage message = new MimeMessage(session);
        logger.info("MimeMessage - consruction success.");
        message.setFrom(new InternetAddress(prop.getProperty("addo.mailFROM")));
        logger.info("Mail send FROM set to = " + prop.getProperty("addo.mailFROM"));
        message.addRecipients(RecipientType.TO, InternetAddress.parse(prop.getProperty("addo.mailTO")));
        logger.info("Mail send TO set to = " + prop.getProperty("addo.mailTO"));
        message.setSubject(prop.getProperty("addo.mailSubject"));
        logger.info("Mail subject set to " + prop.getProperty("addo.mailSubject"));
        message.setText(prop.getProperty("addo.mailText"));
        logger.info("Mail text set to = " + prop.getProperty("addo.mailText"));
        // Send message
        Transport.send(message);

    } catch (MessagingException mex) {
        logger.warning("Send Mail failed! Inform Business User manually.");
        mex.printStackTrace();
        progExit(prop, false);
    }
}

java.util.ServiceConfigurationError 和 java.lang.RuntimeException 添加到现有的 try 块额外的 catch 块。如果您看到 ServiceConfigurationError,那么要么需要更改上下文类加载器,要么批处理服务器有错误的 JavaMail 工件,例如 API 没有方法主体的 JavaMail 唯一版本。

您也可以开启mail debugging。这是一个包含两个更改的示例,但一次只应用一个更改并独立测试每个更改。

public static void sendErrorMail(Properties prop, Logger logger) throws IOException {
    // Get the session object
    Properties properties = System.getProperties();
    properties.setProperty("mail.smtp.host", prop.getProperty("addo.host"));
    logger.info("Mail Host set to: " + prop.getProperty("addo.host"));
    Session session = Session.getDefaultInstance(properties);
    logger.info("Try generating and sending Mail.");
    // compose the message
    ClassLoader cce = Thread.currentThread().getContextClassLoader();
    Thread.currentThread().setContextClassLoader(Session.class.getClassLoader());
    try {
        logger.info("Generate Session with Mail-Server.");
        MimeMessage message = new MimeMessage(session);
        logger.info("MimeMessage - consruction success.");
        message.setFrom(new InternetAddress(prop.getProperty("addo.mailFROM")));
        logger.info("Mail send FROM set to = " + prop.getProperty("addo.mailFROM"));
        message.addRecipients(RecipientType.TO, InternetAddress.parse(prop.getProperty("addo.mailTO")));
        logger.info("Mail send TO set to = " + prop.getProperty("addo.mailTO"));
        message.setSubject(prop.getProperty("addo.mailSubject"));
        logger.info("Mail subject set to " + prop.getProperty("addo.mailSubject"));
        message.setText(prop.getProperty("addo.mailText"));
        logger.info("Mail text set to = " + prop.getProperty("addo.mailText"));
        // Send message
        Transport.send(message);

    } catch (MessagingException | RuntimeException | ServiceConfigurationError mex) {
        logger.warning("Send Mail failed! Inform Business User manually.");
        mex.printStackTrace();
        progExit(prop, false);
    } finally {
        Thread.currentThread().setContextClassLoader(cce);
    }
}