Добрый день. Появилась задача добавить кнопку, аналогичную кнопке "Обработать" в почте. 

 

Но просто так добавить кнопку не получилось. Кажется обработчик на кнопку вешается не простым bindTo, как мне казалось в начале.

 

Пример кода, который получился:

generateEmailButtonsContainerConfig: function() {
	var buttonItems = [];
	var processEmailButtonConfig = this.generateEmailProcessedButtonConfig();
	buttonItems.push(processEmailButtonConfig);
	/** Добавляем новую кнопку */
	var skipEmailButtonConfig = this.generateSkipEmailButtonConfig();
	buttonItems.push(skipEmailButtonConfig);
	var deleteEmailButtonConfig = this.generateDeleteEmailButtonConfig();
	buttonItems.push(deleteEmailButtonConfig);
	var emailButtonContainerConfig = {
		"className": "Terrasoft.Container",
		"classes": {"wrapClassName": ["entity-item-relation-container"]},
		"items": buttonItems
	};
	return emailButtonContainerConfig;
},
/** НОВАЯ КНОПКА */
generateSkipEmailButtonConfig: function() {
	return {
		"className": "Terrasoft.Button",
		"style": Terrasoft.controls.ButtonEnums.style.RED,
		"caption": "SKIP",
		"click": {bindTo: "onSkipEmail"},
		"markerValue": "skipingEmail"
	};
},
/** Метод обработчик кнопки*/
onSkipEmail: function (model) {
	window.console.log("It's working");
}

Но при нажатии на кнопку - появляется ошибка:

Возможно надо использоваться что-то похожее на fireEvent, но за все время не было необходимости в подобном функционале - поэтому плохо понимаю как и что делать. Вроде в этой статье https://community.terrasoft.ru/articles/kak-sozdat-polzovatelskii-eleme… о чем-то, что мне поможет, говорится. Но без понимая как это все устроено - это какое-то гадание на кофейной гуще.

 

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

 

Может кто-то реализовывал мой кейс или нечто подобное и сможет поделиться советом?

Нравится

4 комментария

Сергей, насколько понимаю, Вы пытаетесь сделать как для зелёной кнопки EmailProcessedButton, которая описана в CommunicationPanelEmailSchema:

/**
 * Creates email message action buttons container config.
 * @protected
 * @return {Object} Email message action buttons container config.
 */
generateEmailButtonsContainerConfig: function() {
	var buttonItems = [];
	var processEmailButtonConfig = this.generateEmailProcessedButtonConfig();
	buttonItems.push(processEmailButtonConfig);
	var deleteEmailButtonConfig = this.generateDeleteEmailButtonConfig();
	buttonItems.push(deleteEmailButtonConfig);
	var emailButtonContainerConfig = {
		"className": "Terrasoft.Container",
		"classes": {"wrapClassName": ["entity-item-relation-container"]},
		"items": buttonItems
	};
	return emailButtonContainerConfig;
},
 
/**
 * Creates "process message" button config.
 * @protected
 * @return {Object} "Process message" button config.
 */
generateEmailProcessedButtonConfig: function() {
	return {
		"className": "Terrasoft.Button",
		"caption": {"bindTo": "Resources.Strings.MarkAsProcessed"},
		"style": Terrasoft.controls.ButtonEnums.style.GREEN,
		"imageConfig": {"bindTo": "Resources.Images.ApplyButtonImage"},
		"enabled": {"bindTo": "IsProcessingButtonEnabled"},
		"visible": {
			"bindTo": "IsNeedProcess",
			"bindConfig": {
				"converter": "getProcessButtonVisible"
			}
		},
		"click": {bindTo: "setIsNeedProcessFalse"},
		"markerValue": "setNeedProcessFalse"
	};
},

Но там обработчик setIsNeedProcessFalse в EmailItemSchema не просто одна функция, а несколько в цепочке, одна вызывает другие:

/**
 * Sets and saves IsNeedProcess value for message.
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
setIsNeedProcessFalse: function(callback, scope) {
	this.set("IsProcessingButtonEnabled", false);
	var chain = [];
	chain.push(this.updateIsNeedProcess);
	chain.push(this._onSetIsNeedProcessFalse, function() {
		this.Ext.callback(callback, scope);
	});
 
	this.set("IsNeedProcess", false);
	this.Terrasoft.chain.apply(this, chain);
},
...
/**
 * Updates IsNeedProcess value for current user EmailMessageData instances.
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
updateIsNeedProcess: function(callback, scope) {
	var update = this.getIsNeedProcessUpdate();
	if (this.Ext.isEmpty(update)) {
		this.Ext.callback(callback, scope);
		return;
	}
	update.execute(function() {
		this.Ext.callback(callback, scope);
	}, this);
},
...
/**
 * Handle response of save entity request.
 * @private
 * @param {Object} [response] Response of save entity request.
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
_handleSaveRequestResponse: function(response, callback, scope) {
	if (response && response.success) {
		this.fireEvent("entitySaved", this);
		this.set("CurrentColumnValue", null);
	}
	this.Ext.callback(callback, scope);
},
/**
 * Set IsNeedProcess to false.
 * @private
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
_onSetIsNeedProcessFalse: function(callback, scope) {
	this.saveEntity(function(response) {
		this._handleSaveRequestResponse(response, callback, scope);
	}, this);
},

Если ругается на .apply, видимо, ожидает для Вашей кнопки аналогичной логики. Хотя, там же рядом справа DeleteEmailButton, там без этого всего:

/**
 * Creates "delete" button config.
 * @protected
 * @return {Object} "Delete" button config.
 */
generateDeleteEmailButtonConfig: function() {
	return {
		"className": "Terrasoft.Button",
		"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
		"imageConfig": {"bindTo": "Resources.Images.DeleteEmailButtonImage"},
		"click": {bindTo: "onDeleteEmail"},
		"markerValue": "deleteEmail"
	};
},
...
/**
 * Removes email message from emails collection.
 * @param {Terrasoft.BaseViewModel} model Email message model instance.
 */
onDeleteEmail: function(model) {
	this.unsubscribeModelEvents(model);
	var collection = this.get("EmailCollection");
	collection.remove(model);
},

Не сравнивали в отладке Вашу кнопку с кнопкой удаления?

Зверев Александр,

Сегодня заметил, что вся логика на самом деле в другой схеме - попробую туда вписать мой метод-обработчик. Может кнопка просто не может найти нужный метод и валится в ошибку. Пока я понял что работает так - EmailItemSchema "втягивает" в себя кнопки и обрабатывает методы у себя и после уже дополняет методами из 

CommunicationPanelEmailSchema. Проверю свою догадку и отпишусь о происходящем. Просто изначально не заметил эту привязку. Даже не осознал до конца как я натолкнулся на нее. Но теперь уже немного понятно куда идти

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

Если просто Вашу функцию onSkipEmail перенести в EmailItemSchema, то всё работает, пишет в консоли «It's working».

Зверев Александр,

Все так. Но пришлось еще докрутить логику. Например, включил передачу сообщения и основную логику все равно запускал в 

CommunicationPanelEmailSchema (потому что надо было работать с коллекцией писем, не был уверен что смогу это провернуть в EmailItemSchema)

 

Если кому-то поможет - полученный код ниже

 

EmailItemSchema:

messages: {
	"MessageSkipEmail": {
		mode: Terrasoft.MessageMode.BROADCAST,
		direction: Terrasoft.MessageDirectionType.BIDIRECTIONAL
	}
},
methods: {
	/**
	 * Initializes starter values.
	 * @protected
	 * @overridden
	 */
	init: function () {
		this.callParent(arguments);
		// Регистрация сообщения.
		this.sandbox.registerMessages(this.messages);
	},
	onSkipEmail: function() {
		// Регистрация сообщения.
		var EmailId = this.get("Id");
		this.sandbox.publish("MessageSkipEmail", {Id: EmailId}, ["EmailItemSchema"]);
	}
},

CommunicationPanelEmailSchema

messages: {
	"MessageSkipEmail": {
		mode: Terrasoft.MessageMode.BROADCAST,
		direction: Terrasoft.MessageDirectionType.BIDIRECTIONAL
	}
},
methods: {
	init: function () {
		this.callParent(arguments);
		// Регистрация сообщения.
		Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onMyBpFinish, this);
		this.sandbox.subscribe("MessageSkipEmail", function(args) { this.skipingEmail(args.Id);},
			this, ["EmailItemSchema"]);
	},
	skipingEmail: function(EmailId) {
		var collection = this.get("EmailCollection");
		var foundItem = collection.collection.items.find(item => item.id === EmailId);
		var args = {
		// Имя процесса, который необходимо запустить.
			sysProcessName: "UsrSkipEmail",
		// Объект со значением входящего параметра ContactParameter для процесса CustomProcess.
			parameters: {
				ID: EmailId
			}
		};
				// Запуск пользовательского бизнес-процесса.
		ProcessModuleUtilities.executeProcess(args);
		collection.remove(foundItem); /** Выкидываем уже обработанное письмо из списка*/
	},
	generateEmailButtonsContainerConfig: function() {
		var buttonItems = [];
		var processEmailButtonConfig = this.generateEmailProcessedButtonConfig();
		buttonItems.push(processEmailButtonConfig);
		/** Добавляем новую кнопку */
		var skipEmailButtonConfig = this.generateSkipEmailButtonConfig();
		buttonItems.push(skipEmailButtonConfig);
		var deleteEmailButtonConfig = this.generateDeleteEmailButtonConfig();
		buttonItems.push(deleteEmailButtonConfig);
		var emailButtonContainerConfig = {
			"className": "Terrasoft.Container",
			"classes": {"wrapClassName": ["entity-item-relation-container"]},
			"items": buttonItems
		};
		return emailButtonContainerConfig;
	},
	/** НОВАЯ КНОПКА */
	generateSkipEmailButtonConfig: function() {
		return {
			"className": "Terrasoft.Button",
			//"style": 
			"caption": "Игнорировать",
			"click": {bindTo: "onSkipEmail"},
			"markerValue": "skipingEmail",
			"enabled": {"bindTo": "IsProcessingButtonEnabled"},
			"visible": {
				"bindTo": "IsNeedProcess",
				"bindConfig": {
					"converter": "getProcessButtonVisible"
				}
			},
		};
	},

А в самом БП происходит магия изменения БД, чтобы не запустились скрытые процессы, привязанные к "IsNeedProcess" в EmailMessageData

 

Вроде теперь все работает как надо, но надо провести обильное тестирование на большом количестве писем. А то письма после обработки все равно привязывались к обращениям и переоткрывали их. Теперь такие письма можно пропускать.

Показать все комментарии

Всем привет!

 

Продолжаем освещать вас жизненными примерами по разворачиванию сервиса Exchange Listener. Если вы пропустили прошлую публикацию, то рекомендуем также с ней ознакомиться - https://community.terrasoft.ru/articles/1-realnyy-primer-po-razvertyvaniyu-servisa-exchange-listener-s-ispolzovaniem-kubernetes.

 

На этот раз поделился подробной инструкцией с нами пользователь Еремеев Игорь Юрьевич (ссылка на профиль - https://community.terrasoft.ru/user/196420). Данная инструкция полезна тем, что в ней предоставлены наглядные скриншоты и решение по ошибкам, которые могут возникнуть в процессе развертывания.

(!) Данная инструкция процитирована и зафиксирована в таком виде, в каком нам передали с небольшими изменениями.

 

Задача поднять Кластер (Cluster) Kubernetes

 

Kubernetes — нишевое решение под конкретные проекты.

Kubernetes средство оркестрации (управления) контейнерами Docker. Это инструмент для их автоматического запуска, выделения ресурсов, контроля состояния, обновления.

 

Системные требования

Устанавливаем на виртуальных машинах:

  • мастер нода – 1 виртуальная машина - 2 cpu и 4 gb ram
  • рабочие ноды – 2 виртуальные машины - 2 cpu и 4 gb ram

 

Структура кластера

 

 

 

 

 

 

 

 

Примечание:

  • Виртуальная машина 1 Поколение;
  • Образ CentOS-7-x86_64-NetInstall-2003;
  • Пользователь root, 123456qQ;

Необходимые условия:

  • Установлена ВМ (прим. виртуальная машина) Centos 8;
  • Отключён Firewall, своппинг, SELinux;
  • Для дальнейших шагов необходим неограниченный доступ в Интернет.

Подготовим 1 образа, далее просто его скопируем под 3 ВМ (см инструкцию 0. Kubernetes  преднастройка VM CentOS)

 

Далее делаем на всех нодах

  1. Приведем имена в порядок
hostnamectl set-hostname master-node
hostnamectl set-hostname node-1
hostnamectl set-hostname node-2
  1. Пропишем внутренний DNS

задайте имя хоста системы и обновите DNS в файле / etc / hosts

cat <<EOF>> /etc/hosts
192.168.25.182 master-node
192.168.25.30 node-1 worker-node-1
192.168.25.170 node-2 worker-node-2
EOF
  1. Установите Docker-CE на CentOS 8
  • Сначала необходимо добавить репозиторий Docker.
  • Также установите пакет containerd.io , который доступен в качестве демона, который управляет полным жизненным циклом контейнера его хост-системы, от передачи и хранения образа до выполнения и контроля контейнера, до низкоуровневого хранилища, сетевых вложений и далее.
  • Команды под учетной записью root запускаю сразу весь пакет,  Ставим на всех ВМ
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm -y
dnf install docker-ce -y
systemctl enable docker
systemctl start docker

4. Установите Kubernetes (Kubeadm)

4.1. Необходимо добавить репозитории Kubernetes вручную

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

 

4.2. Установить пакет kubeadm

 

dnf install kubeadm -y
systemctl enable kubelet
systemctl start kubelet 

 

Все что выше делаем на всех ВМ.

 

5. на мастере выполняем команды:

5.1.

 

kubeadm init --pod-network-cidr=10.244.0.0/16

 

(!) Важно сохраняем результат

 

kubeadm join 192.168.25.182:6443 --token z86i8r.u6mmy6adnkmp4iad \    --discovery-token-ca-cert-hash sha256:8104a99fe76b167b65d5d450467ec14fd60b973db9f97a40e81c90cc7ade73b8

 

если потеряли токен то можно запросить

 

kubeadm token list
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ 5.2
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

 

5.3. Устанавливаем Flannel:
 

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml

 

 

5.4. . Вводим команду для возможности запуска контейнеров на текущей машине:

 

kubectl taint nodes --all node-role.kubernetes.io/master-

 

Делаем reboot – много всего поставлено

 

 6. Проверяю состояние подов:

 

kubectl -n kube-system get pods

Все работает

 

7. Устанавливаем Helm:

wget https://get.helm.sh/helm-v3.3.0-rc.1-linux-amd64.tar.gz
tar xzvf helm-v3.3.0-rc.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm

 

И подключаем репозиторий (возьмем самый популярный) и делаем update

 

helm repo add stable https://kubernetes-charts.storage.googleapis.com/

helm repo update

 

Делаем бэкап своих виртуальных машин.

Результат у нас создан кластер из 1 ВМ, созданы ВМ на которой установлен только Докер.

 

8. Устанавливаем Redis:

 

helm repo update

helm install --namespace default --set usePassword=false --set=slave.persistence.enabled=false --set master.persistence.enabled=false --set cluster.enabled=false redis bitnami/redis

 

используем --namespace default

 

Получили:

 

To connect to your Redis server:

1. Run a Redis pod that you can use as a client:

   kubectl run --namespace default redis-client --rm --tty -i --restart='Never' \

   --image docker.io/bitnami/redis:5.0.7-debian-10-r32 -- bash

2. Connect using the Redis CLI:

   redis-cli -h redis-master

To connect to your database from outside the cluster execute the following commands:

    kubectl port-forward --namespace default svc/redis-master 6379:6379 &

    redis-cli -h 127.0.0.1 -p 6379

 

Результат.

 

 

 

 

9. Устанавливаем Exchange Listener.

 

Нам потребуется  ip-адрес redis-master: XX.XXX.233.155 (см. скриншоты)

 

Качаем последний актуальный дистрибутив (на данный момент 0.6.9):

wget http://ftp.bpmonline.com/support/downloads/Exchangelistener/exchangelistener-0.6.9.tgz

helm install --set env.host=XX.XXX.233.155 --set service.type=NodePort --set service.nodePort=30001 --set apiVersion=apps/v1 --namespace default elistener exchangelistener-0.6.9.tgz

 

 

--set env.host - указать IP мастер Redis

default - namespace, который использовался в пункте 11.

elistener - произвольное название нашего сервиса.

exchangelistener-0.6.9.tgz - путь к скачанному дистрибутиву.

Порт не обязательно должен быть 30001. Допустимый диапазон 30000-32767.

На этом минимальная настройка сервиса на стороне сервера завершена.

 

10. Проверяем поды сервиса

kubectl get pods

 

Проверяем доступность сервиса Exchange Listener.

telnet: -

telnet 192.168.25.182 30001

 

Где:

192.168.25.182 - ip-адрес нашей linux-машины,

30001 - порт сервиса Exchange Listener, выбранный при установке на 12 шаге.

Если соединение проходит - открываем веб-браузер (желательно сразу на машине с Creatio) и вводим в адресную строку http://192.168.25.182:30001/api/listeners/status

 

 

Включим в кластер еще 2 ВМ

 

(команду kubeadm init --pod-network-cidr=10.244.0.0/16 не вводим)

- Node-1

Вводим ключ-команду

 

kubeadm join 192.168.25.182:6443 --token z86i8r.u6mmy6adnkmp4iad     --discovery-token-ca-cert-hash sha256:8104a99fe76b167b65d5d450467ec14fd60b973db9f97a40e81c90cc7ade73b8

 

если потеряли токен то можно запросить

 

kubeadm token list

 

- Проверяем поды на master-машине (их должно стать больше):

 

kubectl -n kube-system get pods

 

- Node-2

Вводим ключ-команду

kubeadm join 192.168.25.182:6443 --token z86i8r.u6mmy6adnkmp4iad     --discovery-token-ca-cert-hash sha256:8104a99fe76b167b65d5d450467ec14fd60b973db9f97a40e81c90cc7ade73b8

 

- На мастере проверяем

 

kubectl get node

 

kubectl get svc

 

 

kubectl get pods

 

 

Какие команды могут помочь при решении проблем:

 

Почему-то не было доступа из внешнего IP к порту 30001, где развернут сервис. и были выполнены следующие команды:

ufw allow 30001 - команда конкретно firewall ubuntu. К другим дистрибутивам вероятнее всего не подойдет (возможно только если к Mint, т.к. ядро тоже самое). 

iptables -I INPUT -p tcp --dport 30001 -j ACCEPT - уже более распространенный вариант. 

 

Команды для просмотра логов. Примеры:

 

kubectl logs POD_NAME

kubectl logs REDIS_NAME-api-0

 

kubectl logs  elistener-api-0

kubectl logs  elistener-api-1

kubectl logs redis-master-0

 

log4net:ERROR Could not create Appender [ExchangeListenerGelfAmqpAppender] of type [Gelf4Net.Appender.GelfAmqpAppender, Gelf4Net.AmqpAppender]. Reported error follows.
RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the specified endpoints were reachable ---> RabbitMQ.Client.Exceptions.ConnectFailureException: Connection failed --->

Означает, что он не может Rabbit не может достучаться до Graylog (мониторинг логов). В данном случае у вас не настроен Graylog. Но это не должно блокировать работу. Можно ориентировать на вот это Gelf4Net (он пишет в Rabbit).

Но ниже по логу должно быть видно следующее:
Hosting environment: Production Content root path: /app Now listening on:
http://[::]:80 Application started. Press Ctrl+C to shut down.

Если это так, то значить сервис запущен и теперь вам нужно проверить доступность и статус сервиса.
А после провести настройку на стороне Creatio.

Нравится

Поделиться

1 комментарий

Теперь k8s наша общая боль) 

Показать все комментарии

Проблема в следующем:

1) У заказчика стоит политика безопасности, что блокируется доступ на почту в течении 30 минут при не успешной попытке входа на почту 5 раз подряд(если пароль не верный).

2) Creatio CRM синхронизируется по идее с определенной периодичностью без остановки.

3) В системе будет >300 пользователей, в связи с этим стоит проблема, что могут поменять пароль, а в Creatio CRM в течении определенного времени не успеть сменить вовремя, и работа пользователя будет фактически остановлена на минут 30, почта имеет важную роль.

Вопрос:
Возможно ли как-то поставить доп. логику обработки синхронизации с почтой, что в случае неверных попыток синхронизации с почтой, допустим 3 раза подряд, прерывалось для данного пользователя + уведомление приходило например сис. админу? Может кто сталкивался с такой ситуацией?

Нравится

2 комментария

Насколько мне известно, в базовой версии возможности для настройки такой функциональности нет.

CRM система не является почтовым сервером и возможности настройки дополнительных опций почтового ящика очень ограничены.

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

Например, при каждой неудачной попытке предупреждать пользователя уведомлением об оставшемся количестве допустимых попыток. А на 3-ю неудачную попытку отправлять уведомление на пользователя и в копию добавлять админа.

Пишут, что такая логика появилась ещё в 7.11:

Коммуникационная панель будет сообщать о проблемах при загрузке писем с почтового сервера:

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

Во всех перечисленных случаях для избежания блокирования учетной записи почты процесс синхронизации будет остановлен.

Нужно выяснить, есть ли в системе заказчика этот механизм, работает ли. Возможно, у него на 7.14 переводили с более старых версий и что-то не перенесли?

Визуально такая сработавшая проверка выглядит как розовая иконка письма на правой панели и при нажатии на неё в открывшейся панели с письмами плашка сверху: «Синхронизация остановлена, неверный пароль».

Показать все комментарии

Привет всем!

Система не получает сообщения из почтового ящика( MS Exchange) до тех пор пока в систему не войдет Supervisor, только после этого система начинает прием и обработку сообщений.

 

Нравится

6 комментариев

Здравствуйте!

Для исправления данного кейса необходимо установить для пула приложений IIS, на котором работает приложение, Idle Timeout = 0

1. Настроить автоматический мониторинг Loader'a и приложения, ниже варианты:

  • С помощью бесплатного сервиса мониторинга https://uptimerobot.com/ настроить автоматический мониторинг c периодичностью 5-10 минут - наиболее быстрый путь
  • С помощью автоматического запуска скрипта мониторинга приложения. Шаблон скрипта PowerShell в приложении Ping.ps1, в нем необходимо изменить адрес приложения. После этого, нужно запланировать выполнение этого скрипта через планировщик Windows c периодичностью 5-10 минут. Автоматический запуск можно настроить по инструкции http://windowsnotes.ru/powershell-2/zapusk-powershell-skripta-po-raspisaniyu/.

 

2. Настроить автоматический запуск SQL-скрипта очистки \ перезапуска зависших заданий, скрипт в приложении ResetErrorQuartzTriggers.sql - с периодичностью 30 минут

  • Настроить автоматический запуск задания MSSQL, выполняющего этот скрипт - наиболее простой способ

Скрипты можно скачать по данной ссылке:https://dropmefiles.com/QhuAh

Shevchenko Andrey,

добрый день! скрипты выложите еще раз.

Здравствуйте!

Выше в моем комментарии названия файлов являются кликабельными и вы можете скачать скрипты просто нажав на них.

Shevchenko Andrey,

не скачиваются скрипты. На dropmefiles пишет что файлы удалены, по самому скрипту - web страница недоступна

Ольга Кондратьева,

Добрый день! Можете скачать по ссылке - 

https://www.dropbox.com/sh/re9v0093hflrmuf/AADQ1_2KNUQgLJS2DnkB0Gyia?dl…

Подскажите, в какой версии исправили данную багу? В 7.12.2.935 нужно настраивать скрипт ResetErrorQuartzTrigger?

Показать все комментарии

Коллеги, здравствуйте!
Возможно ли настроить корпоративную почту настроенную по шаблону IMAP/SMTP для всех пользователей сразу? Преднастроить им логины и e-mail? Может кто-то сталкивался с таким или скриптом прогоняли? Персонально настраивать каждому пользователю не получится.

Нравится

2 комментария

Добрый день, Роман!

Для решения данной бизнес цели Вы можете добавить пользователей через базу данных используя sql скрипт.

Необходимо добавлять данные в таблицу MailboxSyncSettings.

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

т.о. у Вас должен быть пароль в колонке UserPassword, например, вида 

Pkhu008LnSzMhtEX2gRJk6ubDHfGEVhB+CYNw+bauco9M0lYuYegmHSTbsl8V77Y57csNw2P

Так же можно попробовать добавить новый справочник привязанный к объекту "Настройки синхронизации с почтовым ящиком" и импортировать параметры подключения в него из excel. 

 

Гриценко Игорь, спасибо!

Показать все комментарии

Коллеги, здравствуйте!
В десктопной версии моб.приложения связал почту с почтовым провайдером mail.ru

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

"no mail accounts. Please set up Mail account in order to send email"

С чем это связано? Как я могу настроить почту в моб.приложении?

IOS 11. моб.приложение последней версии.

Нравится

1 комментарий

Роман, здравствуйте!

У мобильного приложения, который Вы скачиваете из магазина приложений мобильной платформы нет встроенного почтового клиента. При нажатии на "конвертик" происходит redirect на клиентский почтовый клиент (стороннее приложение).

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

Показать все комментарии

Коллеги, настроили синхронизацию по IMAP/SMTP корпоративную почту.
Возник вопрос синхронизируются ли письма из подпапок, которые включены в папку Входящее

Нравится

3 комментария

Роман, здравствуйте!

Подпапки не синхронизируются если Вы установили признак только у папки "Входящие". Загружаются только те письма, которые есть в этой папке.

Вильшанский Дмитрий, то есть если у меня 100 входящиз писем разложены по разным папкам на почтвом сервисе, то в bpm они будут храниться в разнобой?

Роман Никулин,

1. Если необходимо, то можете установить признак "Загружать всю почту" либо указать "Входящие" и выбрать все необходимо дочерние папки, которые необходимо загружать.

2. В bpm'online нет пока функциональности фильтровать и распределять входящие письма по папкам. Мы зафиксировали данную идею.

Показать все комментарии

Здравствуйте!
Интересует есть ли возможность в bpm'online 7.11 настроить подсказки из адресной книжки при интеграции с почтовым провайдем Kerio 9.2.6 - это не нативный "MS Exchange" -совместимый почтовый сервер.
Настраивали шаблон подключения через протоколы IMAP/SMTP. Через шаблон MS Exchange подключить не удалось, сообщили, что в данном сервисе не полностью реализована поддержка EWS. 

Можно ли настроить подсказки адресной книжки, которые хранятся в Kerio (ФИО + e-mail)?
На данный момент bpm предлагает подсказки e-mail адресов только тех контактов, у которых заполнено поле e-mail в объекте [контакты].

 

Спасибо!

Нравится

4 комментария

Насколько мне известно такой возможности пока не реализовано(

Добрый день, Роман!

Данная логика попадет в релиз версии 7.12.3.

Анна Журавель, при интеграции с почтовым провайдером Kerio? Или при настройке по протоколу IMAP/SMTP?

Добавить комментарий

Роман Никулин,

Данная логика будет при настройке по протоколу IMAP/SMTP.
К сожалению, подсказки с провайдером Kerio 9.2.6 пока не предусмотрены в базовой версии. Я передала Ваше пожелание аналитикам продукта. Они рассмотрят возможность реализации подобной логики в одной из будущих версий системы.
 

Показать все комментарии

Добрый день!

Настроил процесс по фиксации отсутствия сотрудника, хотел настроить передачу доступа к ящику другому сотруднику в часы отсутствия (отправка писем, настройка ящика).

В связи с этим вопрос - какой объект отвечает за Доступ почтового ящика для других пользователей?

Нравится

3 комментария

Здравствуйте, Александр!

Права на почтовые ящики храняться в объекте EmailDefRights. В нем Вы можете просматривать/изменять пользователей, которым дано право на тот или иной почтовый ящик.

Анна Журавель,

Добрый день!
Благодарю за ответ. Подскажите пожалуйста, как изменить права в EmailDefRights на Отправку писем (например, через процесс, для manager2 дать доступ на не только к письмам, но и на Отправку писем для manager1)?

Чакур Александр,

Добрый день, Александр!
Наиболее простым способом реализовать данную бизнес-задачу можно использую пользовательские средства системы bpm'online.

В версии 7.12.0 был реализован функционал более гибкой настройки прав доступа на почтовый ящик.
Для того, чтобы настроить права Вам необходимо перейти в настройки почтовых ящиков, выбрать необходимый ящик и включить функцию "Доступ для других пользователей"
После этого Вы сможете выбрать какие права и каким ролям раздавать.
К примеру, Вы можете раздать отдельно право на просмотр писем, на отправку и на настройку почтовых ящиков.

Данный способ раздачи прав будет более корректный чем использование запросов в БД поскольку таблица EmailDefRights связана с другими таблицами и устанавливать все необходимые связи между колонками трудоемкая задача, результатом которой могут быть ошибки в работе системы.

 

Показать все комментарии

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

Нравится

1 комментарий

Здравствуйте, Игорь!

Перенести настройки почтовых ящиков через привязку к пакету не получится. При добавлении почтового ящика происходит вычитка папок и добавления их в таблицы MailboxFoldersCorrespondence, ActivityFolder и другие. Также происходит раздача необходимых прав и добавление триггеров синхронизации.

Показать все комментарии