Создание пользовательского обработчика электронной почты для Jira

Применимость

Jira 7.0.0 и более поздних версий.

Уровень опыта

Расширенный. Вы должны были пройти хотя бы один промежуточный учебник, прежде чем работать с этим учебником. См. список учебников для разработчиков.

Временная оценка

Для завершения этого урока вам потребуется около 1 часа.

 

Обзор учебника

Администраторы могут настроить Jira для приема и обработки сообщений электронной почты, отправленных на определенную учетную запись на IMAP или POP-сервере. В зависимости от выбранного обработчика сообщений Jira может создать задачу или добавить комментарий к задаче на основе содержимого сообщения.

Jira предоставляет несколько встроенных почтовых обработчиков, найдите их описание на странице «Создание задач и комментариев из электронной почты». Кроме того, разработчики приложений могут создавать пользовательские обработчики электронной почты, внедряя модуль обработчика сообщений.

В этом учебном пособии показано, как создать приложение обработчика сообщений. Чтобы все было просто, приложение превратит содержимое электронной почты в комментарий для конкретной задачи в проекте. Кроме того, мы будем использовать способность Jira читать файлы электронной почты из локального каталога, а не настраивать почтовый сервер. Ваше завершенное приложение будет состоять из следующих компонентов:

  1. Java-классы, инкапсулирующие логику приложения.
  2. Ресурсы для отображения пользовательского интерфейса приложения.
  3. Дескриптор приложения (файл XML), чтобы включить модуль плагина в приложении Atlassian.

Когда вы закончите, все эти компоненты будут упакованы в один JAR-файл.

Об этих инструкциях

Вы можете использовать любую поддерживаемую комбинацию операционной системы и IDE для создания этого приложения. Эти инструкции были написаны с использованием macOS Sierra и IntelliJ IDEA 2017.3. Если вы используете другую комбинацию, вы должны использовать эквивалентные операции для своей конкретной среды.

Этот учебник был последний раз проверен с помощью Jira 7.7.1 с использованием Atlassian Plugin SDK 6.3.10.

Прежде чем вы начнете

Чтобы завершить этот учебник, вам необходимо знать следующее:

  1. Основы разработки Java: классы, интерфейсы, методы, использование компилятора и т. д.
  2. Ознакомьтесь с инструментами разработки, такими как Maven и IDE.
  3. Как создать проект Atlassian plugin с помощью Atlassian Plugin SDK.
  4. Как настроить параметры системы Jira.

Источник приложения

Мы рекомендуем вам проработать этот учебник. Если вы хотите пропустить или проверить свою работу, когда закончите, вы можете найти исходный код приложения на Atlassian Bitbucket.

Чтобы клонировать репозиторий, выполните следующую команду:


git clone https://bitbucket.org/atlassian_tutorial/jira-add-email-handler.git

Кроме того, вы можете загрузить исходный код в виде ZIP-архива.

 

Шаг 1. Создайте проект приложения

На этом этапе вы будете использовать команду atlas для создания кода-заглушки для вашего приложения. Команды atlas являются частью пакета Atlassian Plugin SDK и автоматизируют большую часть разработки приложений для вас.

  1. Настройте SDK Atlassian Plugin и создайте проект, если вы этого еще не сделали.
  2. Откройте терминал и перейдите в каталог, в котором вы хотите сохранить код приложения.
  3. Чтобы создать скелет приложения, выполните следующую команду:

atlas-create-jira-plugin

  1. Чтобы определить ваше приложение, введите следующую информацию.

group-id

com.example.plugins.tutorial.jira

artifact-id

mail-handler-demo

version

1.0-SNAPSHOT

package

com.example.plugins.tutorial.jira.mailhandlerdemo

  1. Перейдите в каталог проекта, созданный на предыдущем шаге.

cd space-blueprint/

  1. Удалите тестовые каталоги.

Настройка тестирования для вашего приложения не входит в этот учебник. Чтобы удалить сгенерированный тестовый скелет, выполните следующие команды:


rm -rf ./src/test/java
rm -rf ./src/test/resources/

  1. Удалите ненужные файлы классов Java.

rm -rf ./src/main/java/com/example/plugins/tutorial/jira/mailhandlerdemo/*

  1. Импортируйте проект в свою избранную среду IDE.

Шаг 2. Измените метаданные POM и добавьте зависимости

Это хорошая идея, чтобы ознакомиться с файлом конфигурации проекта, известным как POM (файл определения объектной модели проекта). POM объявляет зависимости вашего приложения, настройки и метаданные (информация о вашем приложении).

Измените POM следующим образом:

  1. Перейдите в каталог mail-handler-demo, созданный SDK.
  2. Откройте файл pom.xml.
  3. Добавьте название организации или организации и URL вашего веб-сайта в элемент organization:

<organization>
    <name>Example Company</name>
    <url>http://www.example.com/</url>
</organization>

  1. Обновите элемент name до более читаемого:

<name>Mail Handler Demo</name>

Это имя вашего приложения, которое появится на странице «Управление надстройками» в консоли администрирования Jira.

  1. Обновите элемент description:

<description> Этот плагин демонстрирует, как добавить настраиваемый обработчик сообщений в Atlassian JIRA </ description>

  1. Добавьте зависимости, на которые будет положиться ваше приложение. Добавьте следующие зависимости к файлам, добавленным SDK:

...
   <dependencies>
        ...
        <dependency>
            <groupId>com.atlassian.jira</groupId>
            <artifactId>jira-mail-plugin</artifactId>
            <version>${jira.mail.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.atlassian.mail</groupId>
            <artifactId>atlassian-mail</artifactId>
            <version>2.8.6</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.4</version>
            <scope>provided</scope>
        </dependency>        ... 

Обратите внимание, что для этих зависимостей предусмотрено provided  значение области видимости scope, поскольку фреймворк приложения Jira включает эти JAR. Если бы вы использовали другую область действия, это привело бы к проблемам с классом-загрузчиком, связанным с дублирующимися классами, доступными в классе классов приложений.

 

Версия зависимостей для jira-mail-plugin, которая указана ранее как $ {jira.mail.version}, должна быть заменена версией приложения, подходящей для вашей версии Jira, из следующей таблицы.

Версия Jira

Совместимая версия jira-mail-plugin

Jira 7.1

10.0.0

Jira 7.0 

8.0.0

Jira 6.4

7.0.21

Jira 6.3

6.3.15

  1. Сохраните файл pom.xml.

Шаг 3. Добавьте модуль обработчика сообщений в дескриптор приложения

Для большинства типов модулей плагинов вы можете использовать Atlassian Plugin SDK для добавления модулей в ваше приложение. Модуль, который вам нужен для этого приложения, называется обработчиком сообщений message-handler, и это одно из исключений. Вам нужно будет добавить его вручную.

  1. Перейдите в src / main / resources / и откройте файл atlassian-plugin.xml.
  2. Добавьте модуль обработчика сообщений message-handler  как дочерний элемент atlassian-plugin.

<message-handler i18n-name-key="demohandler.name" key="demoHandler" 
            class="com.example.plugins.tutorial.jira.mailhandlerdemo.DemoHandler"
            add-edit-url="/secure/admin/EditHandlerDetailsUsingParams!default.jspa" weight="0"/>

Атрибут class идентифицирует наш класс реализации обработчика com.example.plugins.tutorial.jira.mailhandlerdemo.DemoHandler. Значение weight 0 означает, что обработчик будет первым в списке выбора обработчика в пользовательском интерфейсе администратора. (Встроенные обработчики имеют вес от 1 до 5, более низкий вес - ранее в списке, отображаемом обработчиком.)

Также обратите внимание на значение add-edit-url. Он определяет ресурс, используемый для настройки нашего обработчика. Пока что мы установили его на ресурс, который поставляется с Jira. Мы опишем этот ресурс и заменим его своим чуть позже.

  1. Сохраните файл.

Шаг 4. Добавьте текст пользовательского интерфейса в файл ресурсов i18n

Когда вы создали приложение, SDK сгенерировал вам файл ресурсов i18n. Это то, откуда вызывается текст пользовательского интерфейса. Добавьте в него текстовую строку пользовательского интерфейса следующим образом:

  1. Перейдите в src / main / resources и откройте файл ресурсов mail-handler-demo.properties.
  2. Добавьте следующее свойство:

demohandler.name=My Demo Mail Handler

Шаг 5. Создайте реализацию MessageHandler

Теперь давайте создадим обработчик сообщений, на который сослались в  дескрипторе приложения. Мы собираемся сделать это простым, чтобы начать с этого, и строим на этом классе по мере того, как мы идем.

  1. Перейдите в src / main / java / com / example / plugins / tutorial / jira / mailhandlerdemo и создайте новый файл с именем DemoHandler.java.
  2. Добавьте в файл следующий код:

package com.example.plugins.tutorial.jira.mailhandlerdemo;
 
import com.atlassian.jira.service.util.handler.MessageHandler;
import com.atlassian.jira.service.util.handler.MessageHandlerContext;
import com.atlassian.jira.service.util.handler.MessageHandlerErrorCollector;
 
import java.util.Map;
import javax.mail.Message;
import javax.mail.MessagingException;
import com.atlassian.plugin.spring.scanner.annotation.component.Scanned;
 
@Scanned
public class DemoHandler implements MessageHandler {
    private String issueKey;
    @Override
    public void init(Map<String, String> params, MessageHandlerErrorCollector monitor) {
    }
 
    @Override
    public boolean handleMessage(Message message, MessageHandlerContext context) throws MessagingException {
        return true;
    }
}

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

  • Метод init () вызывается при настройке обработчика сообщения, то есть когда администратор настраивает службу сообщений и создается экземпляр обработчика сообщений (здесь срабатывает инъекция зависимостей).

Служба сообщений может:

  • Получить электронную почту через POP или IMAP, используя класс MailFetcherService.
  • Читать сообщения из файловой системы с использованием класса FileService.

Аргумент params содержит конфигурацию обработчика сообщений. Но вы можете сохранить эти данные в другом месте, если это необходимо, например, в PropertySet или с помощью объектов ActiveObject. Код модуля может использовать аргумент monitor, чтобы сообщать о проблемах, обнаруженных при инициализации обработчика.

  • Каждый раз, когда сообщение успешно извлекается и читается, Jira вызывает метод handleMessage (). Параметр message содержит само сообщение, а context - тонкая абстракция, которая позволяет вам разрабатывать обработчики, которые работают в тестовом режиме (где они не должны изменять Jira) и в нормальном режиме производства. Об этом позже.
  1. Сохраните файл.

Шаг 6. Создание, установка и запуск приложения.

Давайте запустим Jira и посмотрим, что у нас есть.

  1. Откройте терминал и перейдите в корневой каталог приложения, где находится pom.xml.
  2. Запустите эту команду SDK:atlas-run

Эта команда загружает и запускает Jira с установленным вами приложением.

  1. Откройте экземпляр Jira в браузере и войдите в систему с помощью admin / admin по умолчанию.
  2. При появлении запроса создайте простой проект отслеживания задач.
  3. Нажмите значок cog, а затем нажмите «Система».
  4. Нажмите «Почта»> «Входящая почта».
  5. Нажмите Добавить обработчик входящей почты. Вы должны увидеть что-то вроде этого:

РИСУНОК

Это почтовый обработчик, который вы добавили.

 

  1. Введите имя для вашего обработчика (это может быть что угодно, потому что мы не сохраним его на этот раз), а затем нажмите «Далее».

Обратите внимание на конфигурационную форму для этого обработчика.

РИСУНОК

Как Jira знает, что показывать на этом шаге мастера?

Она получает его из параметра add-edit-url в вашем объявлении message-handler. Ранее вы устанавливали этот атрибут в /secure/admin/EditHandlerDetailsUsingParams!default.jspa. Jira 5.0 и более поздние версии предоставляют этот встроенный ресурс в интересах унаследованных  (Jira 4.x) обработчиков электронной почты.

Унаследованные обработчики принимают параметры конфигурации в списке пар имя-значение, которые раделенных  запятыми. Если вы должны ввести текст  Handler params в поле, например issueKey = TST-1, otherParam = abc, метод init () обработчика сообщения получит карту params, которая состоит из:


issueKey    TST-1
otherParam  abc

9. Отмените настройку обработчика электронной почты.В следующих шагах мы обновим Java-класс, ресурс интерфейса конфигурации и  add-edit-url  для мира после 5.0.

Отсюда вы можете продолжать поддерживать Jiraзапущенной, когда вы продолжаете разработку приложения. Чтобы перезагрузить приложение, используйте QuickReload. Когда вы работаете, оно восстанавливает ваше приложение за кулисами. Чтобы использовать QuickReload, выполните следующие действия::

  1. Откройте новое окно терминала и перейдите в корневую папку приложения.
  2. Чтобы перестроить приложение и запустить QuickReload, запустите команду atlas-package.
  3. Когда сборка завершается успешно, Jira перезагружает приложение.
  4. Вернитесь в свой браузер и проверьте свои изменения (возможно, сначала вам нужно обновить страницу браузера).

Шаг 7: Внедрение задней части реального обработчика сообщений

Для нашего обработчика сообщений нужен один параметр конфигурации - ключ задачи, определяющий задачу, к которой он будет добавлять комментарии.

Мы будем проверять:

  • Правильность этого параметра.
  • Существует ли такая задача.
  • Является ли это редактируемым.
  • Имеет ли отправитель разрешения на комментарий.

Поскольку мы будем использовать такую проверку как минимум в двух местах, давайте инкапсулируем ее как отдельный компонент.

  1. Перейдите в src / main / java / com / example / plugins / tutorial / jira / mailhandlerdemo и создайте новый файл с именем IssueKeyValidator.java.
  2. Добавьте следующий код:

package com.example.plugins.tutorial.jira.mailhandlerdemo;
 
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.service.util.handler.MessageHandlerErrorCollector;
import com.atlassian.plugin.spring.scanner.annotation.component.JiraComponent;
import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
import org.apache.commons.lang.StringUtils;
import javax.inject.Inject;
 
 
@JiraComponent
public class IssueKeyValidator {
 
    @ComponentImport
    private final IssueManager issueManager;
 
    @Inject
    public IssueKeyValidator(IssueManager issueManager) {
        this.issueManager = issueManager;
    }
 
 
    public Issue validateIssue(String issueKey, MessageHandlerErrorCollector collector) {
        if (StringUtils.isBlank(issueKey)) {
            collector.error("Issue key cannot be undefined.");
            return null;
       }
 
        final Issue issue = issueManager.getIssueObject(issueKey);
        if (issue == null) {
            collector.error("Cannot add a comment from mail to issue '" + issueKey + "'. The issue does not exist.");
            return null;
        }
        if (!issueManager.isEditable(issue)) {
            collector.error("Cannot add a comment from mail to issue '" + issueKey + "'. The issue is not editable.");
            return null;
        }
        return issue;
    }
}

  1. Откройте файл DemoHandler.java и замените его содержимое следующим текстом:

package com.example.plugins.tutorial.jira.mailhandlerdemo;
 
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.service.util.handler.MessageHandler;
import com.atlassian.jira.service.util.handler.MessageHandlerContext;
import com.atlassian.jira.service.util.handler.MessageHandlerErrorCollector;
import com.atlassian.jira.service.util.handler.MessageUserProcessor;
import com.atlassian.mail.MailUtils;
import com.atlassian.plugin.spring.scanner.annotation.component.Scanned;
import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
import org.apache.commons.lang.StringUtils;
 
import java.util.Map;
import javax.mail.Message;
import javax.mail.MessagingException;
 
@Scanned
public class DemoHandler implements MessageHandler {
    private String issueKey;
    private final IssueKeyValidator issueKeyValidator;
    private final MessageUserProcessor messageUserProcessor;
    public static final String KEY_ISSUE_KEY = "issueKey";
 
    // мы также можем использовать инъекцию зависимостей!
    public DemoHandler(@ComponentImport MessageUserProcessor messageUserProcessor, IssueKeyValidator issueKeyValidator) {
        this.messageUserProcessor = messageUserProcessor;
        this.issueKeyValidator = issueKeyValidator;
    }
 
    @Override
    public void init(Map<String, String> params, MessageHandlerErrorCollector monitor) {
        // получение здесь ключа эмиссии, настроенного пользователем
        issueKey = params.get(KEY_ISSUE_KEY);
        if (StringUtils.isBlank(issueKey)) {
            // this message will be either logged or displayed to the user (if the handler is tested from web UI)
            monitor.error("Issue key has not been specified ('" + KEY_ISSUE_KEY + "' parameter). This handler will not work correctly.");
        }
        issueKeyValidator.validateIssue(issueKey, monitor);
    }
 
    @Override
    public boolean handleMessage(Message message, MessageHandlerContext context) throws MessagingException {
        //  давайте снова проверить ключ проблемы - между тем проблема могла быть удалена, закрыта и т. д.
        final Issue issue = issueKeyValidator.validateIssue(issueKey, context.getMonitor());
        if (issue == null) {
            return false; // возвращение false означает что мы не способны обработать это сообщение Оно может
            // перенаправляться на указанный адрес или остаться в очереди почты (если переадресация не включена)
        }
        // это небольшой метод использования JIRA API для нас, давайте использовать его.
        final ApplicationUser sender = messageUserProcessor.getAuthorFromSender(message);
        if (sender == null) {
            context.getMonitor().error("Message sender(s) '" + StringUtils.join(MailUtils.getSenders(message), ",")
                    + "' do not have corresponding users in JIRA. Message will be ignored");
            return false;
        }
        final String body = MailUtils.getBody(message);
        final StringBuilder commentBody = new StringBuilder(message.getSubject());
        if (body != null) {
            commentBody.append("\n").append(StringUtils.abbreviate(body, 100000)); // let trim too long bodies
        }
        //  благодаря использованию прошедшего контекста нам не нужно беспокоиться о нормальном прогоне и тестовом прогоне - наш вызов
        // будет отправлен соответственно
        context.createComment(issue, sender, commentBody.toString(), false);
        return true; // возвращение  true означает что мы обработали сообщение успешно . Это означает, что оно будет удалено следующим.
    }
}

Метод init () гарантирует, что параметр, переданный в пользовательский интерфейс конфигурации обработчика, не пуст. Метод handleMessage () принимает сообщения электронной почты из службы электронной почты Jira, а затем выдает комментарий об задаче. Подробные сведения за строкой приведены в комментариях к коду.

 

  1. Сохраните файл.

 

Шаг 8. Улучшите пользовательский интерфейс конфигурации

Теперь у нас есть полностью функциональный обработчик электронной почты, но он по-прежнему имеет рудиментарный пользовательский интерфейс, который подвержен ошибкам. Давайте исправим его и развяжем мощность пользовательского интерфейса пользовательской конфигурации обработчика.

  1. Чтобы добавить модуль WebWork в приложение, добавьте следующий элемент в файл atlassian-plugin.xml:

<webwork1 key="actions" name="Actions" class="java.lang.Object">
        <actions>
            <action name="com.example.plugins.tutorial.jira.mailhandlerdemo.EditDemoHandlerDetailsWebAction"
                    alias="EditDemoHandlerDetails"
                    roles-required="admin">
                <view name="input">/view/editDemoHandlerDetails.vm</view>
                <view name="securitybreach">/secure/views/securitybreach.jsp</view>
            </action>
        </actions>
    </webwork1>

Этот модуль отобразит пользовательский интерфейс конфигурации обработчика.

  1. Замените модуль message-handler, который вы добавили ранее в дескриптор, следующим:

<message-handler i18n-name-key="demohandler.name"
         key="demoHandler" class="com.example.plugins.tutorial.jira.mailhandlerdemo.DemoHandler"
         add-edit-url="/secure/admin/EditDemoHandlerDetails!default.jspa"
         weight="0"/>

Обработчик сообщений теперь будет использовать действие WebWork в качестве ресурса для добавления или редактирования настроек обработчика.

 

  1. Перейдите в src / main / java / com / example / plugins / tutorial / jira / mailhandlerdemo, создайте новый файл с именем EditDemoHandlerDetailsWebAction.java, а затем добавьте следующий код:

package com.example.plugins.tutorial.jira.mailhandlerdemo;
 
import com.atlassian.configurable.ObjectConfigurationException;
import com.atlassian.jira.plugins.mail.webwork.AbstractEditHandlerDetailsWebAction;
import com.atlassian.jira.service.JiraServiceContainer;
import com.atlassian.jira.service.services.file.AbstractMessageHandlingService;
import com.atlassian.jira.service.util.ServiceUtils;
import com.atlassian.jira.util.collect.MapBuilder;
import com.atlassian.plugin.PluginAccessor;
import com.atlassian.plugin.spring.scanner.annotation.component.Scanned;
import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
 
import java.util.Map;
 
@Scanned
public class EditDemoHandlerDetailsWebAction extends AbstractEditHandlerDetailsWebAction {
    private final IssueKeyValidator issueKeyValidator;
 
    public EditDemoHandlerDetailsWebAction(@ComponentImport PluginAccessor pluginAccessor, IssueKeyValidator issueKeyValidator) {
        super(pluginAccessor);
        this.issueKeyValidator = issueKeyValidator;
    }
    private String issueKey;
    public String getIssueKey() {
        return issueKey;
    }
 
    public void setIssueKey(String issueKey) {
        this.issueKey = issueKey;
    }
 
    // этот метод так назван, чтобы позволить нам заполнить переменные (или состояние действия) 
    // с текущими настройками обработчика, управляемыми соответствующей службой (файлом или почтой).
    @Override
    protected void copyServiceSettings(JiraServiceContainer jiraServiceContainer) throws ObjectConfigurationException {
        final String params = jiraServiceContainer.getProperty(AbstractMessageHandlingService.KEY_HANDLER_PARAMS);
        final Map<String, String> parameterMap = ServiceUtils.getParameterMap(params);
        issueKey = parameterMap.get(DemoHandler.KEY_ISSUE_KEY);
    }
 
    @Override
    protected Map<String, String> getHandlerParams() {
        return MapBuilder.build(DemoHandler.KEY_ISSUE_KEY, issueKey);
    }
 
    @Override
    protected void doValidation() {
        if (configuration == null) {
            return; // short-circuit in case we lost session, goes directly to doExecute which redirects user
        }
        super.doValidation();
        issueKeyValidator.validateIssue(issueKey, new WebWorkErrorCollector());
    }
}

Класс наследуется от AbstractEditHandlerDetailsWebAction, что позволяет нам сосредоточиться на проверке параметров. Он заботится о добавлении, редактировании и отмене самого жизненного цикла обработчика.

  1. Чтобы реализовать разметку, используемую действием, перейдите в src / main / resources / view и создайте новый файл шаблона Velocity с именем editDemoHandlerDetails.vm.

## couple of available navigation helpers
#set ($modifierKey = $action.browserUtils.getModifierKey())
#set ($submitAccessKey = $i18n.getText('AUI.form.submit.button.accesskey'))
#set ($submitTitle = $i18n.getText('AUI.form.submit.button.tooltip', [$submitAccessKey, $modifierKey]))
#set ($cancelAccessKey = $i18n.getText('AUI.form.cancel.link.accesskey'))
#set ($cancelTitle = $i18n.getText('AUI.form.cancel.link.tooltip', [$cancelAccessKey, $modifierKey]))
<html>
<head>
    <title>$action.handlerName</title>
</head>
<body>
<form class="aui" action="EditDemoHandlerDetails.jspa" method="POST" name="mailHandlerForm" id="mailHandlerForm">
    <div class="form-body">
        <h2>$action.handlerName</h2>
        <span class="global-errors-location">
            #if ($action.getHasErrorMessages())
                    #foreach ($error in $action.getFlushedErrorMessages())
                #AUImessage("error" "" $textutils.htmlEncode(${error}) "" "" "" "true")
            #end
                #end
            </span>
        <input type="hidden" name="atl_token" value="$atl_token">
        <label for="issue-key">$i18n.getText('demohandler.issue.key')</label>
        <input type="text" class="text" id="issue-key" name="issueKey" value="$!textutils.htmlEncode($issueKey)">
 
        <div class="buttons-container form-footer">
            <div class="buttons">
                #if ($action.editing)
                    #set ($addButtonLabel = $i18n.getText('common.words.save'))
                #else
                    #set ($addButtonLabel = $i18n.getText('common.forms.add'))
                #end
                <input id="addButton" type="submit" class="button" value="$!addButtonLabel" accesskey="$submitAccessKey" title="$submitTitle">
                <a href="IncomingMailServers.jspa" class="cancel" accesskey="$cancelAccessKey" title="$cancelTitle">$i18n.getText("AUI.form.cancel.link.text")</a>
            </div>
 
        </div>
    </div>
</form>
</body>
</html>

  1. Возможно, вы заметили ключ demohandler.issue.key i18n, который использует шаблон Velocity. Добавьте определение этого свойства в файл ресурсов mail-handler-demo.properties.

demohandler.issue.key=Issue Key

конец зоны

Шаг 9. Проверьте готовое приложение.

  1. Перезагрузите приложение в Jira. Как уже упоминалось, вы можете сделать это с помощью QuickReload с помощью команды atlas-package или просто перезапустить Jira.
  2. Если у вас его еще нет, создайте задачу Jira, к которой ваш обработчик может добавить комментарий. Обратите внимание на его ключ задачи.
  3. Перейдите на страницу администрирования системы и попробуйте добавить обработчик почты на основе вашего пользовательского обработчика.
    • Как и прежде, введите имя для обработчика.
  • Если вам нравится, вы можете настроить почтовый сервер для использования в качестве источника сообщения. В противном случае сохраните локальные файлы по умолчанию и нажмите «Далее».
  1. На экране конфигурации обработчика введите значение ключа задачи. Обратите внимание: если вы впервые введете ключ задачи, которая не существует, вы получите сообщение об ошибке в соответствии нашего кода проверки.
  2. Введите ключ для существующей задачи и нажмите «Добавить».
  3. Теперь давайте создадим сообщение электронной почты, которое получит Jira. Перейдите в target/jira/home/import/mail, откройте файл testmessage.txt и добавьте следующий контент:

MIME-Version: 1.0
Received: by 123.45.67.89 with HTTP; Mon, 22 Jul 2013 13:09:38 -0700 (PDT)
Date: Mon, 22 Jul 2013 13:09:38 -0700
Delivered-To: admin@admin.com
Message-ID: <CAKOugVWfh27gSCxgUqJE9QTgOJUJiabS27jw@mail.gmail.com>
Subject: Test Message Subject
From: Admin <admin@admin.com>
To: Admin <admin@admin.com>
Content-Type: multipart/alternative; boundary=485b397dd4ab88758a04e21f414f
 
--485b397dd4ab88758a04e21f414f
Content-Type: text/plain; charset=ISO-8859-1

Имя файла не имеет значения. Только то, что каждое сообщение занимает свой собственный текстовый файл в каталоге.

 

Репозиторий Bitbucket для этого учебника включает текстовый файл, содержащий пример сообщения.

  1. Дайте Jira несколько минут, чтобы найти новое сообщение и применить его. Когда это произойдет, вы увидите сообщение журнала в окне терминала, где вы запустили Jira:

[INFO] [talledLocalContainer] 2013-07-23 17:29:26,784 QuartzScheduler_Worker-0 INFO ServiceRunner    MyMailHandler [atlassian.mail.incoming.fileservice] MyMailHandler[/home/atlas/atlassian/final/mail-handler-demo/target/jira/home/import/mail]: Added comment 'Test Message Subj... 'by 'admin' to issue 'TST-1'
[INFO] [talledLocalContainer] 2013-07-23 17:29:26,784 QuartzScheduler_Worker-0 INFO ServiceRunner    MyMailHandler [atlassian.mail.incoming.fileservice] Deleted file: /home/atlas/atlassian/final/mail-handler-demo/target/jira/home/import/mail/testmessage.txt

Это сработало! Jira удалила сообщение после его применения, как и в журнале, поэтому вам нужно будет обновлять текстовый файл каждый раз, когда вы хотите протестировать.

  1. Проверьте свою задачу еще раз. Теперь вы увидите новый комментарий, добавленный вашим обработчиком электронной почты.

РИСУНОК

Поздравляю, вот и все!

 

Имейте удовольствие!

 

Похожие темы

  • Изменения в службах MessageHandler и обработки сообщений.
  • Модуль плагина Message Handler.

По материалам Atlassian JIRA  Server Developer Creating a custom email handler for Jira