Почтовый сервер Apache James: куда помещать пользовательские письма?

Я хочу написать собственный Mailet для почтового сервера Apache James.

Я запускаю Джеймса через Docker через образ linagora/james-project. Настройка работает (конечно, только локально, но на данный момент этого достаточно), так как я могу настроить учетные записи и подключиться к ним с помощью Thunderbird через IMAP, и я могу отправлять почту между этими учетными записями.

Теперь я хочу развернуть свой собственный Mailet для этой установки. Я попробовал это с помощью этого руководства: https://james.apache.org/server/3/dev-extend-mailet.html (мне пришлось создать папку /conf/lib/, так как ее не было), но это не сработает. В журнале вижу такие ошибки:

james | [main] INFO org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor - Matcher All instantiated.
james | [main] ERROR org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor - Unable to init mailet com.jeremiaslubberger.mailets.TestMailet: javax.mail.MessagingException: Can not load mailet com.jeremiaslubberger.mailets.TestMailet;
james |   nested exception is:
james |     java.lang.ClassNotFoundException: com.jeremiaslubberger.mailets.TestMailet
james | javax.mail.MessagingException: Can not load mailet com.jeremiaslubberger.mailets.TestMailet;
james |   nested exception is:
james |     java.lang.ClassNotFoundException: com.jeremiaslubberger.mailets.TestMailet

Путем поиска в исходном коде я нашел файл ExtendedClassLoader.java, где есть строка public static final String EXTENSIONS_JARS_FOLDER_NAME = "extensions-jars/"; Поэтому я попытался создать эту папку (в корневой папке Джеймса) и поместить туда JAR, содержащий пользовательский Mailet.

Это по-прежнему выдает ошибки и не работает, однако журнал теперь выглядит так:

james | [main] INFO org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor - Matcher All instantiated.
james | Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/mailet/GenericMailet
james |     at java.lang.ClassLoader.defineClass1(Native Method)
james |     at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
james |     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
james |     at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
james |     at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
james |     at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
james |     at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
james |     at java.security.AccessController.doPrivileged(Native Method)
james |     at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
james |     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
james |     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
james |     at org.apache.james.utils.ExtendedClassLoader.locateClass(ExtendedClassLoader.java:80)
james |     at org.apache.james.utils.GuiceGenericLoader.instanciate(GuiceGenericLoader.java:37)
james |     at org.apache.james.utils.GuiceMailetLoader.getMailet(GuiceMailetLoader.java:45)

Мой пользовательский Mailet расширяет GenericMailet, как и все остальные (по умолчанию) Mailet. Кроме того, я экспортировал свою почту со всеми ресурсами, так что там ничего не должно быть упущено. Теперь у меня нет идей.

Кто-нибудь может помочь? Куда мне нужно поместить JAR, содержащий мой пользовательский Mailet?


person JLubberger    schedule 11.09.2017    source источник


Ответы (2)


Это папка conf/lib в вашей папке Apache James. Эта папка присутствует в предоставленном ZIP-архиве по умолчанию для (например, 3.0.1) каждого выпуска.

Кроме того, вам нужны файлы mailet-base и mailet-api в вашем пути к классам (которые упаковывают Generic mailet). Обычно это так.

папка extension-jars относится к проводке Guice (которую вы, похоже, не используете, поскольку полагаетесь на проводку Spring)

Свяжитесь с нами по адресу https://gitter.im/apache/james-project мы бы там поактивнее реагировали...

person Benwa    schedule 29.01.2018

Вы должны запустить Джеймса из pwd = /james-root/bin/. В противном случае вы получите ClassNotFoundException при запуске приложения. Это связано с тем, что определение относительного пути к классу в файле run.sh. Я потратил много времени, чтобы понять это))

person Bogdan Samondros    schedule 22.01.2021