Logback SMTPAppender: где/как указать поле «в/из» при использовании JNDI

Изменить. Все, что я на самом деле спрашиваю здесь, это: как указать адреса электронной почты to и from с помощью SMTPAppender Logback, когда он настроен на использование поиска 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 |-INFO в 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;
}

Но я до сих пор не могу сказать, где/как я должен устанавливать/из полей. Есть идеи? Заранее спасибо!


person IAmYourFaja    schedule 04.06.2013    source источник


Ответы (2)


Это известная ошибка. SMTPAppender не может использовать JNDI в качестве источника подключения и успешно отправлять электронные письма с версии 1.0.13 (она была выпущена преждевременно).

person Community    schedule 10.06.2013

Адреса получателя и отправителя не связаны с сеансом javamail< /а>. Сессия javamail используется для настройки способа транспортировки сообщения, а не для настройки отдельных сообщений.

Вы устанавливаете поля "откуда" и "от" в конфигурации xml с помощью строк, как показано в примере ,

<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

Настройка учетных данных почтового сеанса Java в jndi зависит от используемого вами сервера приложений. Например, вы можете настроить учетные данные jndi для tomcat, как показано в этот вопрос. Для веб-логики вы настраиваете его следующим образом: это.

person sbridges    schedule 07.06.2013
comment
Спасибо @sbridges (+1), но я получаю точно такое же сообщение об ошибке (Пустой адрес назначения. Прерывание передачи электронной почты), даже когда я определяю <to> и <from>... Также я выполняю развертывание на Tomcat и определение источников соединения JNDI в глобальном файле conf/context.xml Tomcat. файл. - person IAmYourFaja; 07.06.2013
comment
Возможно, вы можете заставить работать SMTPAppender, указав все учетные данные почтового сеанса в context.xml, но адреса туда/от в logback.xml? - person IAmYourFaja; 07.06.2013
comment
Вы определяете отправку и отправку в logback.xml и учетные данные в context.xml, и это не работает? - person sbridges; 07.06.2013
comment
Исправьте @sbridges - to/from в logback.xml и учетные данные в context.xml и получите пустой адрес назначения. Прерывание передачи электронной почты. - person IAmYourFaja; 07.06.2013
comment
Если вы поместите точку останова в parseAddress(), будет ли список toPatternLayoutList пустым? Какие в нем ценности? - person sbridges; 07.06.2013
comment
Еще раз спасибо @sbridges - да, toPatternLayoutList пуст, и поэтому переменная len имеет размер 0, и весь цикл for даже не выполняется. - person IAmYourFaja; 07.06.2013
comment
Вместо того, чтобы отлаживать это построчно, для вас может быть быстрее получить работающую реализацию и опубликовать точный код; таким образом я могу копировать и вставлять. Если ваш код работает, а мой нет, то мы знаем, что это что-то другое (системные проблемы, проблемы с окружением, проблемы с Tomcat и т. д.), а не ошибка с SMTPAppender! - person IAmYourFaja; 07.06.2013
comment
Пример в моем ответе взят прямо из документации и должен работать. Я думаю, вам нужно отладить на вашей стороне, я подозреваю, что он не читает файл конфигурации журнала, который вы редактируете. - person sbridges; 08.06.2013
comment
Еще раз спасибо @sbridges, но приведенный вами пример не использует JNDI для определения почтового сеанса (в частности, с использованием элементов sessionViaJndi и jndiLocation). Так что это не то, что я здесь описываю. Я прошу кого-нибудь помочь мне заставить SMTPAppender работать с JNDI, определяя сеанс Mail. Книга журналов (большую часть которой я прочитал) и приведенный выше пример предназначены для использования SMTPAppender без JNDI, а это не то, о чем я здесь спрашиваю! Еще раз спасибо за вашу помощь! - person IAmYourFaja; 08.06.2013
comment
Кроме того, я не публиковал другой вывод консоли только для того, чтобы мой вопрос был как можно более компактным, но я делаю вижу вывод, который подтверждает, что он нашел мой logback.xml в пути к классам и считывает из него конфигурации. - person IAmYourFaja; 08.06.2013