【问题标题】:Logback SMTPAppender: Where/how to specify to/from field when using JNDILogback SMTPAppender:使用 JNDI 时在哪里/如何指定 to/from 字段
【发布时间】:2013-06-04 20:18:30
【问题描述】:

编辑:我真正要问的是:你如何使用 Logback 的 SMTPAppender 指定 tofrom 电子邮件地址何时它配置为使用 JNDI 查找? 这应该是 SMTPAppender 的基本功能形式,如果 SMTPAppender 不支持此功能,它就无法使用 JNDI 查找!

我定义了以下 Logback SMTPAppender

<appender name="logManager-smtpAppender" class="ch.qos.logback.classic.net.SMTPAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>WARN</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>NEUTRAL</onMismatch>
    </filter>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>

    <asynchronousSending>false</asynchronousSending>

    <sessionViaJNDI>true</sessionViaJNDI>
    <jndiLocation>java:comp/env/mail/Session-local</jndiLocation>

    <subject>%logger{20} - %m</subject>
    <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
    <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
        <bufferSize>25</bufferSize>
    </cyclicBufferTracker>
</appender>

如您所见,我正在使用 JNDI 来查找邮件服务器凭据。

当它运行时,我得到:

15:50:06,857 |- ch.qos.logback.classic.net.SMTPAppender[logManager-smtpAppender] 中的信息 - 空目标地址。中止电子邮件传输

这让我意识到:在上面的SMTPAppender 或我的context.xml 中没有指定收件人/发件人电子邮件地址。

如何/在哪里(请举例!)我应该指定这些吗?!?我检查了 Logback 的源代码,这条消息是从 SMTPAppenderBase.java 内部打印出来的:

List<InternetAddress> destinationAddresses = parseAddress(lastEventObject);
if (destinationAddresses.isEmpty()) {
    addInfo("Empty destination address. Aborting email transmission");
    return;
}

private List<InternetAddress> parseAddress(E event) {
    int len = toPatternLayoutList.size();

    List<InternetAddress> iaList = new ArrayList<InternetAddress>();

    for (int i = 0; i < len; i++) {
        try {
            PatternLayoutBase<E> emailPL = toPatternLayoutList.get(i);
            String emailAdrr = emailPL.doLayout(event);
            if (emailAdrr == null || emailAdrr.length() == 0) {
                continue;
            }
            InternetAddress[] tmp = InternetAddress.parse(emailAdrr, true);
            iaList.addAll(Arrays.asList(tmp));
        } catch (AddressException e) {
            addError("Could not parse email address for [" +         toPatternLayoutList.get(i) + "] for event [" + event + "]", e);
            return iaList;
        }
    }
    return iaList;
}

但我仍然不知道我应该在哪里/如何设置到/从字段。有任何想法吗?提前致谢!

【问题讨论】:

    标签: java jndi logback smtpappender


    【解决方案1】:

    to 和 from 地址与 javamail Session 无关。 javamail Session 用于配置消息的传输方式,而不是单个消息的详细信息。

    您在 xml 配置中使用 example 中所示的行设置 to 和 from 字段,

    <configuration>   
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <smtpHost>ADDRESS-OF-YOUR-SMTP-HOST</smtpHost>
        <to>EMAIL-DESTINATION</to>
        <to>ANOTHER_EMAIL_DESTINATION</to> <!-- additional destinations are possible -->
        <from>SENDER-EMAIL</from>
        <subject>TESTING: %logger{20} - %m</subject>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%date %-5level %logger{35} - %message%n</pattern>
        </layout>       
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="EMAIL" />
      </root>  
    </configuration>
    

    让 SMTPAppender 使用在 JNDI 连接源中定义的邮件会话凭证

    在 jndi 中设置 java 邮件会话凭据是特定于您正在使用的应用程序服务器的。例如,您可以为 tomcat 配置 jndi 凭据,如 this question 所示。对于 weblogic,您可以将其配置为 this

    【讨论】:

    • 感谢@sbridges (+1),但即使我定义了&lt;to&gt;&lt;from&gt;...另外我正在部署到 Tomcat,并在 Tomcat 的全局 conf/context.xml 中定义 JNDI 连接源。文件。
    • 也许您可以让 SMTPAppender 工作,您可以在 context.xml 中指定所有邮件会话凭据,但在 logback.xml 中指定收件人/收件人地址?
    • 您在 logback.xml 中定义 to 和 from,在 context.xml 中定义凭据,这不起作用?
    • 正确的@sbridges - to/from in logback.xml和credentials in context.xml,并得到“空的目标地址。中止电子邮件传输。”
    • 如果在parseAddress()中下断点,toPatternLayoutList是空的吗?它的价值是什么?
    【解决方案2】:

    这是一个已知的错误。 SMTPAppender 自 1.0.13 起无法使用 JNDI 作为连接源并成功发送电子邮件(过早发布)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2016-12-28
      相关资源
      最近更新 更多